1.通过上面介绍,将车模直立行走主要的控制算法集中起来,如图
为了实现小车直立行走,需要采集如下信号: (1)小车倾角速度陀螺仪信号,获得小车的倾角和角速度。 (2) 重力加速度信号 (z轴信号),补偿陀螺仪的漂移。该信号可以省略,有速度控制替代。 (3) 小车电机转速脉冲信号,获得小车运动速度,进行速度控制。
2.在小车控制中的直立和速度控制两个环节中,分别使用了角度PD控制和速度PI控制,这两种控制算法的输出量最终通过叠加通过电机运动来完成。 (1)小车直立控制:使用小车倾角的PD(比例、微分)控制; void AngleControl(void) { BST_fCarAngle = Roll - CAR_ZERO_ANGLE;//DMP ROLL滚动方向角度与预设小车倾斜角度值的差得出角度 BST_fAngleControlOut = BST_fCarAngle * BST_fCarAngle_P + gyro[0] * BST_fCarAngle_D ; //角度PD控制 }
(2)小车速度控制:使用PI(比例、积分)控制; void SpeedControl(void) { BST_fCarSpeed = (BST_s32LeftMotorPulseSigma + BST_s32RightMotorPulseSigma ); //左右电机脉冲数平均值作为小车当前车速 BST_s32LeftMotorPulseSigma =BST_s32RightMotorPulseSigma = 0; //全局变量 注意及时清零 BST_fCarSpeedOld *= 0.7; BST_fCarSpeedOld +=BST_fCarSpeed*0.3; BST_fCarPosition += BST_fCarSpeedOld; //路程 即速度积分 BST_fCarPosition += BST_fBluetoothSpeed; //融合蓝牙给定速度 BST_fCarPosition +=fchaoshengbo; //融合超声波给定速度 if(stopflag==1) { BST_fCarPosition=0; }//悬停以后的位置
//积分上限设限// f((s32)BST_fCarPosition > CAR_POSITION_MAX) BST_fCarPosition = CAR_POSITION_MAX; if((s32)BST_fCarPosition < CAR_POSITION_MIN) BST_fCarPosition = CAR_POSITION_MIN; BST_fSpeedControlOutNew = (BST_fCarSpeedOld -CAR_SPEED_SET ) * BST_fCarSpeed_P + (BST_fCarPosition - CAR_POSITION_SET ) * BST_fCarSpeed_I; //速度PI算法 速度*P +位移*I=速度PWM输出 }
|