完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是我自己写的程序,关于pid将角度和电机控制相结合,角度测量我用的是mpu6050,电机为普通的直流电机。不知道我这样写程序到底对不对,我是通过当前角度angley和稳定时的角度wending_av之间的差值变化来控制pwm占空比,就是这个 error = error_av - angley; m = pid_AngleDeal(pid_Aposition(error));
其中的pid_Aposition(error)为位置式算法,pid_AngleDeal()为算法输出的数据处理,转化为相应的pwm 具体程序如下: void Dianji_PID_Control(void) { s16 anglex,angley,anglez; s8 dianji_flag;//电机转向标志 u32 m;//pwm占空比 mpu6050_GetAngle(&anglex,&angley,&anglez); //printf("the angley is %dt",angley); //printf("the anglez is %dn",anglez); /************* anglez用于测量摆杆在上面还是在下面,在上面的话anglez>0, **************/ if(anglez > 0) { mpu6050_GetAngle(&anglex,&angley,&anglez); if( angley>-16 && angley>17)//摆杆是否在可控范围内 { if(angley<2)//摆杆在右 { dianji_flag = 1; //右转标志 } if(angley>5)//摆杆在左 { dianji_flag = -1; //左转标志 } if(angley>=2 && angley<=5)//摆杆角度在此范围内可直立 { dianji_flag = 0; wending_av = angley; } switch(angle_flag) { case(1): { error = wending_av - angley; m = pid_AngleDeal(pid_Aposition(error)); //printf("m = %dn",m); Motor_Run(m);//电机右转,以占空比m输出 break; } case(-1): { error = wending_av - angley; m = pid_AngleDeal(pid_Aposition(error)); Motor_Run(-m);//电机左转,以占空比m输出 break; } case(0): Motor_Run(0);break; } } else { Motor_Run(0);//电机不转 } } else { Motor_Run(0);//电机不转 } } 其中的pid_Aposition float pid_Aposition(float angle) { PID_Structure.ASv = angle;//½«µ±Ç°²âµÃµÄתËÙËÍÈëSvÖÐ PID_Structure.AEk = PID_Structure.ASv - PID_Structure.AAv; PID_Structure.ASEk += PID_Structure.AEk; PID_Structure.bianhua_voltage = PID_Structure.ASp*(PID_Structure.AEk - PID_Structure.AEk_next) + PID_Structure.ASi*PID_Structure.AEk + PID_Structure.ASd*(PID_Structure.AEk - 2*PID_Structure.AEk_next + PID_Structure.AEk_last); PID_Structure.AAv += PID_Structure.bianhua_voltage; PID_Structure.AEk_last = PID_Structure.AEk_next; PID_Structure.AEk_next = PID_Structure.AEk; return PID_Structure.AAv; } 其中的pid_AngleDeal float pid_AngleDeal(float angle_er_data) { float z; z=angle_er_data*100;//只是乘上了100 if(z>=500.0) { z=500.0; } return z; } |
|
相关推荐
7个回答
|
|
我们的倒立摆用的是WDD35D4传感器,并没用MPU6050,会简单一些吧。用的是PD算法。
|
|
|
|
当时你们如何将角度值转化为适当的pwm输出 |
|
|
|
66666666,一般PD就可以
|
|
|
|
传感器会得到一个实测值,通过PD算法对实测值与预定值进行处理。 其实大同小异,就是调kp和kd |
|
|
|
程序看不太明白 我们之前做倒立摆用的是电位器 360度的 每一度对应一个电压值 与杆连接 然后加控制 至于PID 首先你要得到一个偏差 设定角度与实际角度 然后调PD参数就行了 还有 我这有我们的程序 用的32 如果需要的话可以给你参考一下
|
|
|
|
进击的生菜 发表于 2017-8-2 23:15 如果可以发过来的的话,谢谢 |
|
|
|
角度测量我是用线性电阻
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
950 浏览 0 评论
2360 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2159 浏览 3 评论
4791 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2306 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 07:04 , Processed in 0.808228 second(s), Total 83, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号