我的stm32有四个定时器,我要做一个二轮平衡小车,问题是我左右两个轮子测速要两个tim,pid定时更新要一个tim,剩下一个用来驱动电机,但是pid要分别计算左轮和右路,但是我电机只能输出一个pwm,但是我左轮和右轮如果需要输出不同的波形该怎么搞,求解,先谢谢各位的帮助了
1条回答 默认 最新
- GPT_Pro 2023-02-25 20:51关注
该回答内容部分引用GPT,GPT_Pro更好的解决问题
你的问题很有意思,实现一个平衡小车的控制确实需要考虑很多因素。控制一个平衡小车,主要是控制左右轮子的转速,使其能够保持平衡,实现小车前后左右的运动。由于你使用的是stm32单片机,定时器只有4个,2个用于测量左右轮子的转速,1个用于PID更新,另外一个用于驱动电机。目前你遇到的问题是:PID需要分别计算左轮和右路的速度,但是电机只能输出一个PWM,如何实现对左右两个轮子输出不同的波形。
这里我建议你使用差动技术,将PWM信号分别作用在电机的正向和反向端口上。如图所示:
根据左右两个轮子的不同速度,通过PID算法来更新PWM信号的占空比,从而实现对左右两个轮子不同速度的控制。
具体代码实现如下:
//根据左右轮子速度,来调整正反向电机PWM占空比 void adjustPwmDuty(float leftWheelSpeed,float rightWheelSpeed) { //根据PID算法来更新左右两个轮子电机PWM占空比 float leftSpeedDutyCycle = PIDCalculate(leftWheelSpeed); //左轮子PWM占空比 float rightSpeedDutyCycle = PIDCalculate(rightWheelSpeed); //右轮子PWM占空比 //根据左右两个轮子的速度不同来决定正反向电机的占空比 if(leftWheelSpeed > rightWheelSpeed){ //如果左轮子速度大于右轮子速度 //将左轮子PWM占空比作用在正向电机上 Motor_postive_dutycycle(leftSpeedDutyCycle); //将右轮子PWM占空比作用在反向电机上 Motor_negative_dutycycle(rightSpeedDutyCycle); }else if (leftWheelSpeed < rightWheelSpeed){ //如果左轮子速度小于右轮子速度 //将左轮子PWM占空比作用在反向电机上 Motor_negative_dutycycle(leftSpeedDutyCycle); //将右轮子PWM占空比作用在正向电机上 Motor_postive_dutycycle(rightSpeedDutyCycle); }else{ //如果左右两个轮子速度相同 //将左右两个轮子的PWM占空比作用在正向和反向电机上 Motor_postive_dutycycle(leftSpeedDutyCycle); Motor_negative_dutycycle(rightSpeedDutyCycle); } delay_ms(50); //延时50ms }
以上便是使用STM32定时器以及差动信号实现一个平衡小车的方法。希望能帮助到你。
如果回答有帮助,望采纳。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥100 微信小程序跑脚本授权的问题
- ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
- ¥15 STM32串口接收问题
- ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接
- ¥15 filenotfounderror:文件是存在的,权限也给了,但还一直报错
- ¥15 MATLAB和mosek的求解问题
- ¥20 修改中兴光猫sn的时候提示失败
- ¥15 java大作业爬取网页
- ¥15 怎么获取欧易的btc永续合约和交割合约的5m级的历史数据用来回测套利策略?
- ¥15 有没有办法利用libusb读取usb设备数据