Timer2产生PWM,变频一会后CNT值不重载

2019-07-20 05:45发布

今遇到一个问题,希望用Timer产生PWM波,驱动步进电机加减速,用到了Timer1/2/3/4/8。但是Timer2加减速一会后CNT一直累加不清零。其他定时器均正常;
Timer2定时器配置如下:
void Timer2_CH2_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  GPIO_Init(GPIOA,&GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM2);
}

void Timer2_CH2_Config(u32 Prescaler,u32 Period,u32 duty_cycle)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure1;

  /* TIM2 Periph clock enable */  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟 84MHZ

  /* 分频和周期计算公式:Prescaler = (TIMxCLK/TIMx counter clock)-1eriod=(TIMx counter clock/
  TIMx output clock)-1 TIMx counter clock为你所需要的TIMx的定时器时钟*/
  TIM_TimeBaseStructure.TIM_Prescaler = Prescaler-1;       // 设置预分频:84,即为 1MHz
  TIM_TimeBaseStructure.TIM_Period = Period-1;        
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //TIM_CKD_DIV1=0x0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_OCInitStructure1.TIM_OCMode = TIM_OCMode_PWM1;//PWM1为正常占空比模式,PWM2为反极性模式
  TIM_OCInitStructure1.TIM_OutputState = TIM_OutputState_Enable;//使能输出状态
  TIM_OCInitStructure1.TIM_Pulse = duty_cycle;//占空比
  TIM_OCInitStructure1.TIM_OCPolarity = TIM_OCPolarity_High;//High为占空比高极性,此时占空比为20%;Low则为反极性,占空比为80%

  TIM_OC2Init(TIM2, &TIM_OCInitStructure1);//OC1初始化
}


步进电机驱动芯片为DRV8825根据PWM频率不同,速度不同;
程序中采用TIM_SetAutoreload(TIM2,***)来改变PWM频率。
微信图片_20170527104637.png
我的TIM_SetAutoreload(TIM2,***)中,***最大也就是400。也就是说CNT不清零。
其他几个定时器均未出现该问题

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-20 06:38
 精彩回答 2  元偷偷看……
祥清
2楼-- · 2019-07-20 10:02
哥们,我这两天也遇到一样的问题呀,我的是PA3这个引脚,用定时器5来产生PWM控制电机加减速;后来我看PA3还可以复用定时器2,改成定时2后还是这种现象;定时器2和定时器5都是32位的通用定时器。到现在我也不知道咋回事,也不知道咋去解决?请问你解决了嘛?
cs1222
3楼-- · 2019-07-20 13:54
 精彩回答 2  元偷偷看……
plue
4楼-- · 2019-07-20 16:21
首先,用通用定时器输出一个PWM波,是通过输入比较来实现的,是自己定义这个比较值CCR和自动重装值ARR来控制的 ,至于CNT的话一般在定时器初始化里面会先请零,至于定时器的的问题我们一般用的多的是9,10,12,14这几个,其他的没怎么用过,可能有BUG
edmund1234
5楼-- · 2019-07-20 16:56
Timer2加减速一会后是啥意思? 在此一会的过程中改了ARR没有?
edmund1234
6楼-- · 2019-07-20 21:34
 精彩回答 2  元偷偷看……

一周热门 更多>