Li Weiyi
/
BalanceCar
虽然移植完毕,但是不work。需要细调……
main.cpp
- Committer:
- lixianyu
- Date:
- 2016-06-07
- Revision:
- 3:c6caae712d5d
- Parent:
- 2:99785a1007a4
File content as of revision 3:c6caae712d5d:
#include "mbed.h" //#define BALANCE_CAR_TEST #ifndef BALANCE_CAR_TEST #include "PID_v2.h" //PID控制库 #include "Microduino_Stepper_PWM.h" //步进电机库 #include "userDef.h" //用户自定义 #include "RollPitch.h" #include "Protocol.h" //通讯协议库 #include "MicroduinoPinNames.h" //MPU6050 imu; Stepper stepperL(PIN_DIRB, PIN_STEPB); //左电机,使用stepper底板A接口 Stepper stepperR(PIN_DIRA, PIN_STEPA); //右电机,使用stepper底板D接口 PID speedPID((double)KP_SPD, (double)KI_SPD, (double)KD_SPD, DIRECT); //速度环控制器 PID anglePID((double)KP_ANG, (double)KI_ANG, (double)KD_ANG, DIRECT); //角度环控制器 uint16_t channalData[CHANNEL_NUM]; //8通道数据 bool mode = 0; //nrf或者ble模式 int16_t throttle = 0; //油门值 int16_t steering = 0; //转向值 unsigned long safe_ms = 0; float robotSpeedFilter = 0; //速度估计值 float robotAngle = 0; float targetSpeed = 0; //目标速度 #ifdef BAT_DETECT float batteryValue; //电池电压 #endif float ypr[3]; //Yaw,Pitch,Roll三个轴的角度值 #endif //BALANCE_CAR_TEST DigitalOut myled(P0_13); #define constrain(x,a,b) ((x) < (a) ? (a) : ((x) > (b) ? (b) : (x))) Timer g_Timer; long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } #ifdef BALANCE_CAR_TEST #include "SomeTest.h" int main() { g_Timer.start(); //testMPU6050(); //testTicker(); testStepper1(); while (1) { } } #else extern Serial mpc; int main() { //mpc.baud(115200); g_Timer.start(); dmpSetup(); //mode = protocolSetup(); //遥控接收器初始化 speedPID.SetMode(AUTOMATIC); //速度还控制器初始化 anglePID.SetMode(AUTOMATIC); //角度环控制器初始化 speedPID.SetITermLimits(-10, 10); speedPID.SetOutputLimits(-MAX_TARGET_ANGLE, MAX_TARGET_ANGLE); anglePID.SetOutputLimits(-MAX_SPEED, MAX_SPEED); stepperL.begin(); //左电机初始化 stepperR.begin(); //右电机初始化 for (uint8_t k = 0; k < 3; k++) { stepperR.setSpeed(4); stepperL.setSpeed(-4); //delay(150); wait_ms(150); stepperR.setSpeed(-4); stepperL.setSpeed(4); //delay(150); wait_ms(150); } //myled = 1; while(1) { //myled = !myled; //wait(0.1); #if 0 if (protocolRead(channalData, mode)) { //判断是否接收到遥控信号 throttle = map(channalData[CHANNEL_THROTTLE], 1000, 2000, -MAX_THROTTLE, MAX_THROTTLE); steering = map(channalData[CHANNEL_STEERING], 1000, 2000, -MAX_STEERING, MAX_STEERING); //safe_ms = millis(); safe_ms = g_Timer.read_ms(); } #endif if (safe_ms > g_Timer.read_ms()) safe_ms = g_Timer.read_ms(); if (g_Timer.read_ms() - safe_ms > SAFE_TIME_OUT) { throttle = 0; steering = 0; } #ifdef BAT_DETECT batteryValue = (analogRead(A7) / 1024.0) * BAT_DETECT; //采集电池电压 #endif dmpGetYPR(ypr); float robotAngleCache = robotAngle; robotAngle = ypr[DIRECTION] + ANGLE_FIX; //取Roll轴角度 float robotSpeed = (stepperL.getSpeed() - stepperR.getSpeed()) / 2.0; //计算小车速度 float angleVelocity = (robotAngle - robotAngleCache) * 90.0; robotSpeedFilter = robotSpeedFilter * 0.95 + (robotSpeed + angleVelocity) * 0.05; //小车速度滤波 float targetAngle = speedPID.Compute(robotSpeedFilter, throttle); //速度环计算目标角度 targetSpeed += anglePID.Compute(robotAngle, targetAngle); //角度环计算电机转速 targetSpeed = constrain(targetSpeed, -MAX_SPEED, MAX_SPEED); int16_t motorR = targetSpeed + steering; //计算右电机转速 int16_t motorL = -targetSpeed + steering; //计算左电机转速 //mpc.printf("robotAngle: %f\r\n", robotAngle); if ((robotAngle < 65) && (robotAngle > -65)) { stepperAllEnable(); stepperR.setSpeed(motorR); //更新右电机转速 stepperL.setSpeed(motorL); //更新左电机转速 if ((robotAngle < 30) && (robotAngle > -30)) { anglePID.SetTunings(KP_ANG, KI_ANG, KD_ANG); speedPID.SetTunings(KP_SPD, KI_SPD, KD_SPD); } else { anglePID.SetTunings(KP_ANG_RAISUP, KI_ANG_RAISUP, KD_ANG_RAISUP); speedPID.SetTunings(KP_SPD_RAISUP, KI_SPD_RAISUP, KD_SPD_RAISUP); } } else { stepperAllDisable(); stepperR.setSpeed(0); //更新右电机转速 stepperL.setSpeed(0); //更新左电机转速 anglePID.SetTunings(KP_ANG_RAISUP, KI_ANG_RAISUP, KD_ANG_RAISUP); speedPID.SetTunings(KP_SPD_RAISUP, KI_SPD_RAISUP, KD_SPD_RAISUP); } } } #endif