×
单片机 > 单片机程序设计 > 详情

STM32F051 刹车功能问题及解决方案

发布时间:2020-05-19 发布时间:
|

需求:


1. PWM互补输出


2. 过流保护,产生过流,立即停止pwm输出,并保证按照互补方式停止pwm输出。


3. 单周期保护,产生过流,当前脉冲周期停止输出,下一个脉冲周期自动回复输出,停止输出按照互补方式停止。


一路pwm的保护只能采用2/3中的一种。




过程:


pwm互补输出配置比较简单,没有问题。过流保护采用刹车功能进行保护。


第一次尝试,刹车功能不好使,刹车部分代码如下:




刹车管脚配置:


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

GPIO_Init(GPIOB , &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_2);


定时器设置:


TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;

TIM_BDTRInitStructure.TIM_DeadTime = 48;

TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;

TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;

TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);


结果,如果设置刹车引脚有效极性为低电平:


TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;

则pwm一直不输出。




如果设置刹车引脚有效极性为高电平:


TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Hight;

则pwm一直输出,刹车引脚置为低电平,也不能停止pwm输出。

增加刹车中断,发现,如果设置刹车引脚为低,一直进中断。怀疑管脚复用有问题,更改PB12的管脚模式为复用模式:


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

问题解决。



代码:


#include "stm32f0xx.h"

 

void TIM_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

 

  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);

  

 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_2);

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);

 

  //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 原先错误的配置

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 正确的配置

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

  GPIO_Init(GPIOB , &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_2);

 

}

 

void TIM_PWM_Config(void)

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef   TIM_OCInitStructure;

  TIM_BDTRInitTypeDef   TIM_BDTRInitStructure;

  uint16_t   TimerPeriod = 0;

  uint16_t   Channel1Pulse = 0;

 

  // calc freq

  TimerPeriod = (SystemCoreClock / 10000 ) - 1;

  // calc duty cycle

  Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

  

  TIM_TimeBaseStructure.TIM_Prescaler = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

 

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;

  TIM_BDTRInitStructure.TIM_DeadTime = 48;

  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;

  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;

  //TIM_AutomaticOutput_Enable: 刹车后,刹车输入电平变为无效无效后,下一个脉冲周期,自动回复脉冲输出。

  //TIM_AutomaticOutput_Disable: 刹车后,脉冲输出永久禁止,除非手动调用TIM_CtrlPWMOutputs(TIM1, ENABLE),否则不能启动pwm输出。

  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

 

  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM1, ENABLE);

 

  TIM_Cmd(TIM1, ENABLE);

  TIM_CtrlPWMOutputs(TIM1, ENABLE);

}

 

int main(void)

{

  TIM_Config();

  TIM_PWM_Config();

  while (1)

  {

  }

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于arm的指纹识别门禁系统是如何设计的