Latest version of my quadcopter controller with an LPC1768 and MPU9250.
Currently running on a custom PCB with 30.5 x 30.5mm mounts. There are also 2 PC apps that go with the software; one to set up the PID controller and one to balance the motors and props. If anyone is interested, send me a message and I'll upload them.
calccomp.h
- Committer:
- Anaesthetix
- Date:
- 2018-07-12
- Revision:
- 4:fab65ad01ab4
- Parent:
- 3:a49ab9168fb2
- Child:
- 5:0f4204941604
File content as of revision 4:fab65ad01ab4:
// Coded by Erik van de Coevering #include "mbed.h" DigitalOut led1(LED1); // for stick arming (leds are active low) extern float Kp, Ki, Kd; void calccomp(int* ctrl, float* angles, int* motor) //ctrl: 0-rud 1-elev 2-throttle 3-aileron angles: 0-ax 1-ay 2-az 3-gx 4-gy 5-gz { //Rx variables int ruddercenter = 1562; int elevcenter = 1554; int aileroncenter = 1550; //Variables for calccomp float xcomp = 0; float ycomp = 0; int xcomp2 = 0; float ruddercomp = 0; int rud = 0; int zcomp = 0; int throttle = 0; static signed int m1 = 0; static signed int m2 = 0; static signed int m3 = 0; static signed int m4 = 0; static bool armed = false; float xcntrl = 0; float ycntrl = 0; float KPx, KPy, KIx, KIy, KDx, KDy; //Scale rx channels rud = (((float)(ctrl[0] - ruddercenter))/2.5); ycntrl = ((float)(ctrl[3] - elevcenter))/8; throttle = ctrl[2] - 20; xcntrl = ((float)(ctrl[1] - aileroncenter))/8; //Limit throttle if(throttle > 1950) throttle = 1950; //Start by mixing throttle m1 = throttle; m2 = throttle; m3 = throttle; m4 = throttle; // Current values used on a 250 size mini racer (still needs tuning): P: 1.45, I: 1.5, D: 0.34 // Calc PID values and prevent integral windup on KIx KPx = (angles[0] - xcntrl) * Kp; KIx = KIx + ((angles[0] - xcntrl) * Ki * 0.001); if(KIx > 50) KIx = 50; if(KIx < -50) KIx = -50; KDx = (angles[3] + (angles[0] - xcntrl)) * Kd; xcomp = KPx + KIx + KDx; xcomp2 = xcomp*-1; //Mix aileron m1 = m1 - xcomp2; m2 = m2 + xcomp2; m3 = m3 + xcomp2; m4 = m4 - xcomp2; // Calc PID values and prevent integral windup on KIy KPy = (angles[1] + ycntrl) * Kp; KIy = KIy + ((angles[1] + ycntrl) * Ki * 0.001); if(KIy > 50) KIy = 50; if(KIy < -50) KIy = -50; KDy = (angles[4] + (angles[1] + ycntrl)) * Kd; ycomp = KPy + KIy + KDy; ycomp = ycomp*-1; //Mix elevator m1 = m1 + ycomp; m2 = m2 + ycomp; m3 = m3 - ycomp; m4 = m4 - ycomp; //Calc rudder compensation and mix ruddercomp = (rud + (angles[5]*1.0f)); //has drift zcomp = ruddercomp*-1; //zcomp = 0; //Mix rudder m1 = m1 - zcomp; m2 = m2 + zcomp; m3 = m3 - zcomp; m4 = m4 + zcomp; //When throttle down or if not armed, stop motors if(throttle < 1100 || armed == false) { m1=1000; m2=1000; m3=1000; m4=1000; } //Stick arming if(throttle < 1100 && rud > 100) { armed = true; led1 = 0; } if(throttle < 1100 && rud < -100) { armed = false; led1 = 1; } //Output to motors motor[0] = m1; motor[1] = m2; motor[2] = m3; motor[3] = m4; }