今遇到一个问题,希望用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)-1
eriod=(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频率。
我的TIM_SetAutoreload(TIM2,***)中,***最大也就是400。也就是说CNT不清零。
其他几个定时器均未出现该问题
加减速是改变ARR的值来改变发脉冲的频率,也就改变相应的速度
一周热门 更多>