控制对象:旋转倒立摆
控制器:XS128
关于控制对象的基本说明
控制目标
- 摆杆从初始时刻能够自己起振到最高位置,并在最高位置保持不动或者在很小范围内运动
- 摆杆受到外部干扰(硬币或手等的敲打使其偏离竖直向上的位置)时可以自动恢复到目标位置
控制对象基本参数以及控制方式的选取
- 电机PWM控制频率
- 10KHz
- 理由
- 频率特别小时,电机虽然死区比较小,但是电机特性比较硬,很小的占空比即可以产生较大的速度,而且速度调节精度很难控制(给调节参数带来困难)。
- 频率小时,电机有可能工作在电流断续状态,对点击有害,而且电机产生的噪声比较大
- 控制周期
- 0.5ms
- 将控制系统分为2事件,事件1进行速度控制(外环),事件2进行角度控制(内环),外环控制周期为100ms,内环控制周期为1ms;事件2中进行电机PWM的输出。故相当于每1ms输出1次PWM波
- 理由
- 控制周期太小,系统震荡;控制周期太大,系统反应不及时
- 此处的控制周期是参考学长的控制周期
- 0.5ms
- 2级PID的选取
- 角度环
- 位置式PID
- 速度环
- 增量式PID
- 速度环的输出作为角度环的输入,而在此时角度环的初始设定值为250,因此如果用位置式的PID算法,得到的角度还需要进行处理(在静止不动时输出为250)才能赋值给角度环的输入
- 角度环
-
起振
- 在摆杆竖直向下时,当摆角小于某一角度值时,输出固定占空比的PWM波,当摆角大于某一值时,电机
-
摆动过程中判断摆杆的方向,使得无论摆杆无论在哪个方向上摆动,电机的转动方向都会使它继续沿着那个方向加速摆动
- 实现方法:同时判断摆杆角度和运动方向,再进行控制
-
代码
if( (PID4Pend.GetVal < LimA) || ( PID4Pend.GetVal >= ( 500 - LimA ) ) ) { OutDuty = 1200; if(PendDir==1) dir=2; else dir=1; } if( (PID4Pend.GetVal < (500 - LimA)) && (PID4Pend.GetVal > 260 )) { OutDuty = 0; } if( (PID4Pend.GetVal > LimA) && (PID4Pend.GetVal < 240 )) { OutDuty = 0; } SetMotorVoltage( OutDuty , dir );
-
编码器读取的方式
- 外部中断
- 注意事项
- 在初始化时刻将外部中断优先级设置为最高
- 在进入串口中断或者定时中断时,均需要再次调用
EnableInterrupts
使能中断 - 因为摆杆在摆动的时候会产生零偏,即编码器的值会逐渐偏离原点(振动产生,对应此处的250);解决办法:用Z进行复位,记录Z相脉冲低电平时对应的脉冲个数,每次Z相外部中断触发时,直接改变脉冲计数的值。
- 编码器需要A、B、Z相需要加上拉电阻,可以通过软件配置上拉电阻即可。
-
速度环的输出方式
-
斜坡输出
- 目前采用的是这种方式,将得到的输出量按照斜坡的方式继续拧输出
-
阶跃输出
- 还没有尝试
-
调试过程中遇到的问题
-
电机死区的处理
- 计算输出占空比小于死区占空比时,电机不转动
- 目前采用的是这种方法
- 电机输出占空比小于死区占空比时,电机按照最小速度运动
- 将计算得到的占空比得到输出占空比按照一次函数关系进行输出,如
OutDuty = 0.94 * OutDuty + 0.06
,其中0.06是电机死区对应的占空比
- 计算输出占空比小于死区占空比时,电机不转动
-
关于系统动态与稳态的协调问题
- 问题说明:采用PI控制时,摆杆由自由下垂能够自动摆到竖直向上的位置,并保持运动在90度的范围内(一般在45度范围内),说明系统的稳态性能达到要求,此时如果用外力使摆杆发生抖动,抖动较小时,摆杆可以回到稳态,但是如果比较大的时候,就不能回到稳态,比如施加干扰使其超过PID的控制角度范围;采用PD控制时,摆杆可以自起振,同时受到外界干扰可以比较好地恢复,但是它不能保持在90度的范围内,而是沿着某个方向缓慢旋转,即动他性能达到要求,而稳态性能不符合要求。
- 解决办法:在摆杆处于PID的控制模式时,采用PI控制,满足系统的稳态指标,处于启动模式时(即偏离竖直向上的角度大于某个值),采用PD控制,满足系统的动态要求。
一些管脚定义
串口
- PS0 -> RXD0
- PS1 -> TXD0
L298N驱动
- IN1 -> PB1
- IN2 -> PB0
- ENA-> PP1
编码器
- 摆杆编码器
- A相(黑线) :PA0(GPIO读取方向)
- B相(白线) :PH0(外部中断读取脉冲)
- Z相(橙线) :PH1(外部中断清零操作)
- 蓝线:GND
- 棕线:VCC(5V~12V)
- 旋转电机编码器
- 1、2 :可以不接
- pin3 :VCC通过100欧姆的电阻(限流)和该管脚连接
- pin4 :PA1(GPIO读取方向)
- pin5 :PH2(外部中断读取脉冲)
- pin6 :GND
关于编程方法的一些说明
- 在.c文件里定义,在对应的.h文件中用extern声明
- 如果要引用该变量,可以在.h文件中#include一下,或者用
extern int value
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37128.html