倒立摆系统说明

控制对象:旋转倒立摆
控制器:XS128

关于控制对象的基本说明

控制目标

  • 摆杆从初始时刻能够自己起振到最高位置,并在最高位置保持不动或者在很小范围内运动
  • 摆杆受到外部干扰(硬币或手等的敲打使其偏离竖直向上的位置)时可以自动恢复到目标位置

控制对象基本参数以及控制方式的选取

  • 电机PWM控制频率
    • 10KHz
    • 理由
      • 频率特别小时,电机虽然死区比较小,但是电机特性比较硬,很小的占空比即可以产生较大的速度,而且速度调节精度很难控制(给调节参数带来困难)。
      • 频率小时,电机有可能工作在电流断续状态,对点击有害,而且电机产生的噪声比较大
  • 控制周期
    • 0.5ms
      • 将控制系统分为2事件,事件1进行速度控制(外环),事件2进行角度控制(内环),外环控制周期为100ms,内环控制周期为1ms;事件2中进行电机PWM的输出。故相当于每1ms输出1次PWM波
    • 理由
      • 控制周期太小,系统震荡;控制周期太大,系统反应不及时
      • 此处的控制周期是参考学长的控制周期
  • 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

你可能感兴趣的:(倒立摆系统)