OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5374|回复: 5

用定时器3控制舵机 输出pwm周期不稳定啊!!求助

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-4-2
在线时间
0 小时
发表于 2015-5-6 08:46:08 | 显示全部楼层 |阅读模式
5金钱
我用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]

移动机械臂控制.zip

1.36 MB, 下载次数: 143

最佳答案

查看完整内容[请看2#楼]

回复【4楼】lycreturn: --------------------------------- 我之前那个问题解决了  是因为定时器中断函数里面有printf函数的原因  具体为啥就不知道了额。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-4-2
在线时间
0 小时
 楼主| 发表于 2015-5-6 08:46:09 | 显示全部楼层
回复【4楼】lycreturn:
---------------------------------
我之前那个问题解决了  是因为定时器中断函数里面有printf函数的原因  具体为啥就不知道了额。。。
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-4-2
在线时间
0 小时
 楼主| 发表于 2015-5-6 08:48:43 | 显示全部楼层
其中定时器3中断处理函数最开始部分是电机速度计算的
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-4-2
在线时间
0 小时
 楼主| 发表于 2015-5-6 08:49:08 | 显示全部楼层
求大神帮忙看下代码  调了好几天了  都不行
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-5-6 23:02:30 | 显示全部楼层
直接用PWM输出,占空比CCRx很好控制的啊
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-4-2
在线时间
0 小时
 楼主| 发表于 2015-5-9 08:49:42 | 显示全部楼层
回复【4楼】lycreturn:
---------------------------------
我之前那个问题解决了  是因为定时器中断函数里面有printf函数的原因  具体为啥就不知道了额。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 22:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表