我用tim3定时器模拟pwm波,之所以不用tim3专门的pwm模式是因为我需要控制pwm占空比,并且占空比变化的速度也要控制;但是我的下列代码控制PB0 输出pwm工作一会后周期会不稳定 突然从50hz变化到34hz左右 然后又变回50hz 我用来控制舵机 舵机需要20ms的周期的 也就是50hz
[mw_shl_code=c,true]void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->  SC=psc; //预分频器设置
TIM3->DIER|=1<<0; //允许更新中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2
}
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断
{
//电机速度计算:左边电机L,右边电机R
//变量:count_for_speed_solve_L,count_for_speed_solve_R
//TIM3_Count保证1s延时的计数量
//*********************************
TIM3_Count++;
if(TIM3_Count==50000)
{
printf("左边电机转速:%.2f\n\n",count_for_speed_solve_L/192);
printf("右边电机转速:%.2f\n\n",count_for_speed_solve_R/192);
count_for_speed_solve_R=0;
count_for_speed_solve_L=0;
TIM3_Count=0;
}
//伺服舵机控制******************||||||||
Servo_velocity_cnt++;//伺服舵机速度控制用计数
Servo_int_cnt++;
if(Servo_int_cnt==1000)//保证20msPWM控制周期
{
Servo_int_cnt=0;
Servo_0_Pwm=1;//舵机0
Servo_1_Pwm=1;//舵机1
Servo_2_Pwm=1;//舵机2
//Servo_3_Pwm=1;//舵机3
}
//**********************Servo0******************************|||||||
if( last_sg_steer_cmp_val_0!=now_sg_steer_cmp_val_0)//舵机0
{
if((now_sg_steer_cmp_val_0>last_sg_steer_cmp_val_0)&&(Servo_velocity_cnt==1000))
{
++last_sg_steer_cmp_val_0;
}//当角度要增大时候控制方法;总共180度,4s舵机运动完180度(舵机速度45度/秒) 2000*1/400000 *800
if((now_sg_steer_cmp_val_0<last_sg_steer_cmp_val_0)&&(Servo_velocity_cnt==1000))
{
--last_sg_steer_cmp_val_0;
}
//Servo_0_Pwm=0;
}
if(Servo_int_cnt==last_sg_steer_cmp_val_0)//舵机0
{
Servo_0_Pwm=0;
}
if(Servo_velocity_cnt==1000)//初始化伺服舵机速度控制用计数
Servo_velocity_cnt=0;
}
TIM3->SR&=~(1<<0);//清除中断标志位
}[/mw_shl_code]
|