quadcopter cufe
/
2006_Theta_Control_yaw
Quadcopter Attitude Control(Yaw-Pitch-Roll)
PID_Alt.h@0:e63996fd7d3e, 2015-07-03 (annotated)
- Committer:
- khaledelmadawi
- Date:
- Fri Jul 03 11:16:02 2015 +0000
- Revision:
- 0:e63996fd7d3e
Quadcopter Attitude Control(Yaw-Pitch-Roll)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
khaledelmadawi | 0:e63996fd7d3e | 1 | #ifndef _PID_Alt |
khaledelmadawi | 0:e63996fd7d3e | 2 | #define _PID_Alt |
khaledelmadawi | 0:e63996fd7d3e | 3 | #include "SHARPIR.h" |
khaledelmadawi | 0:e63996fd7d3e | 4 | #include "mbed.h" |
khaledelmadawi | 0:e63996fd7d3e | 5 | #define D_BAUDRATE 115200 |
khaledelmadawi | 0:e63996fd7d3e | 6 | |
khaledelmadawi | 0:e63996fd7d3e | 7 | class PID_Alt{ |
khaledelmadawi | 0:e63996fd7d3e | 8 | public: |
khaledelmadawi | 0:e63996fd7d3e | 9 | PID_Alt(int Mnum,float KP,float KI,float KD,float KDD,PinName AnalogPort); |
khaledelmadawi | 0:e63996fd7d3e | 10 | float findNominalVal(float altitude,float CosR,float CosP,char Calibrated); |
khaledelmadawi | 0:e63996fd7d3e | 11 | void Set_OUT_Limits(float LowerLimit,float UpperLimit);//setting Output Limits. |
khaledelmadawi | 0:e63996fd7d3e | 12 | void Set_IN_Limits(float LowerLimit,float UpperLimit);//setting Input Limits. |
khaledelmadawi | 0:e63996fd7d3e | 13 | void Check_OUT_Limits(float *RPMSetPoint);//checking Input Limits in the Realtime operation. |
khaledelmadawi | 0:e63996fd7d3e | 14 | void Check_IN_Limits(float *O_PWM);//checking Output Limits in Realtime operation. |
khaledelmadawi | 0:e63996fd7d3e | 15 | float Get_IR_Readings(); |
khaledelmadawi | 0:e63996fd7d3e | 16 | float Get_OUT_POWER_SP(); |
khaledelmadawi | 0:e63996fd7d3e | 17 | float Get_Current_IR(); |
khaledelmadawi | 0:e63996fd7d3e | 18 | float GetErrorV(); |
khaledelmadawi | 0:e63996fd7d3e | 19 | float GetErrorVD(); |
khaledelmadawi | 0:e63996fd7d3e | 20 | float GetErrorVDD(); |
khaledelmadawi | 0:e63996fd7d3e | 21 | float GetErrorVDOLD(); |
khaledelmadawi | 0:e63996fd7d3e | 22 | float Get_reqestedAlt(); |
khaledelmadawi | 0:e63996fd7d3e | 23 | |
khaledelmadawi | 0:e63996fd7d3e | 24 | float MeanIR(int num); |
khaledelmadawi | 0:e63996fd7d3e | 25 | private: |
khaledelmadawi | 0:e63996fd7d3e | 26 | SHARPIR _IR; |
khaledelmadawi | 0:e63996fd7d3e | 27 | float PowerSetPoint;//,RPMSetPoint; |
khaledelmadawi | 0:e63996fd7d3e | 28 | float Out_PWM,Out_PWM2; |
khaledelmadawi | 0:e63996fd7d3e | 29 | float O_Upper_Limit,O_Lower_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 30 | float I_Upper_Limit,I_Lower_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 31 | float ErrorV,ErrorI,ErrorVD,ErrorVold,ErrorVDD,ErrorVDOLD,altitudeOld,nominalVal2; |
khaledelmadawi | 0:e63996fd7d3e | 32 | float V_req,V_curr,CURRENT_Alt; |
khaledelmadawi | 0:e63996fd7d3e | 33 | float h; |
khaledelmadawi | 0:e63996fd7d3e | 34 | float EVDOLDGetter,reqestedAlt; |
khaledelmadawi | 0:e63996fd7d3e | 35 | float _KP,_KD,_KI,_KDD; |
khaledelmadawi | 0:e63996fd7d3e | 36 | int Meannum; |
khaledelmadawi | 0:e63996fd7d3e | 37 | Serial debugSerial; |
khaledelmadawi | 0:e63996fd7d3e | 38 | |
khaledelmadawi | 0:e63996fd7d3e | 39 | }; |
khaledelmadawi | 0:e63996fd7d3e | 40 | PID_Alt::PID_Alt(int Mnum,float KP,float KI,float KD,float KDD,PinName AnalogPort):_IR(AnalogPort), debugSerial(USBTX, USBRX){ |
khaledelmadawi | 0:e63996fd7d3e | 41 | _KP=KP; |
khaledelmadawi | 0:e63996fd7d3e | 42 | _KD=KD; |
khaledelmadawi | 0:e63996fd7d3e | 43 | _KI=KI; |
khaledelmadawi | 0:e63996fd7d3e | 44 | _KDD=KDD; |
khaledelmadawi | 0:e63996fd7d3e | 45 | Meannum=Mnum; |
khaledelmadawi | 0:e63996fd7d3e | 46 | V_req=0; |
khaledelmadawi | 0:e63996fd7d3e | 47 | V_curr=0; |
khaledelmadawi | 0:e63996fd7d3e | 48 | ErrorV=0; |
khaledelmadawi | 0:e63996fd7d3e | 49 | ErrorI=0; |
khaledelmadawi | 0:e63996fd7d3e | 50 | ErrorVD=0; |
khaledelmadawi | 0:e63996fd7d3e | 51 | ErrorVold=0; |
khaledelmadawi | 0:e63996fd7d3e | 52 | ErrorVDD=0; |
khaledelmadawi | 0:e63996fd7d3e | 53 | ErrorVDOLD=0; |
khaledelmadawi | 0:e63996fd7d3e | 54 | altitudeOld=0; |
khaledelmadawi | 0:e63996fd7d3e | 55 | nominalVal2=0.00115; |
khaledelmadawi | 0:e63996fd7d3e | 56 | debugSerial.baud(D_BAUDRATE); |
khaledelmadawi | 0:e63996fd7d3e | 57 | |
khaledelmadawi | 0:e63996fd7d3e | 58 | |
khaledelmadawi | 0:e63996fd7d3e | 59 | } |
khaledelmadawi | 0:e63996fd7d3e | 60 | float PID_Alt::findNominalVal(float altitude,float CosR,float CosP,char Calibrated){ |
khaledelmadawi | 0:e63996fd7d3e | 61 | float curr_alt=0; |
khaledelmadawi | 0:e63996fd7d3e | 62 | Check_IN_Limits(&altitude); |
khaledelmadawi | 0:e63996fd7d3e | 63 | reqestedAlt=altitude; |
khaledelmadawi | 0:e63996fd7d3e | 64 | curr_alt=MeanIR(Meannum)*CosR*CosP; |
khaledelmadawi | 0:e63996fd7d3e | 65 | if(curr_alt<=9){ |
khaledelmadawi | 0:e63996fd7d3e | 66 | curr_alt=150; |
khaledelmadawi | 0:e63996fd7d3e | 67 | } |
khaledelmadawi | 0:e63996fd7d3e | 68 | CURRENT_Alt=curr_alt; |
khaledelmadawi | 0:e63996fd7d3e | 69 | Check_IN_Limits(&curr_alt); |
khaledelmadawi | 0:e63996fd7d3e | 70 | V_req=altitude-curr_alt; |
khaledelmadawi | 0:e63996fd7d3e | 71 | V_curr=curr_alt-altitudeOld; |
khaledelmadawi | 0:e63996fd7d3e | 72 | altitudeOld=curr_alt; |
khaledelmadawi | 0:e63996fd7d3e | 73 | ErrorV= V_curr-V_req; |
khaledelmadawi | 0:e63996fd7d3e | 74 | ErrorVD= ErrorV-ErrorVold; |
khaledelmadawi | 0:e63996fd7d3e | 75 | ErrorVDD=ErrorVD-ErrorVDOLD; |
khaledelmadawi | 0:e63996fd7d3e | 76 | EVDOLDGetter=ErrorVDOLD; |
khaledelmadawi | 0:e63996fd7d3e | 77 | debugSerial.printf("E:%f ED:%f EDD:%f EDOld:%f\r\n",ErrorV,ErrorVD,ErrorVDD,ErrorVDOLD); |
khaledelmadawi | 0:e63996fd7d3e | 78 | if(Calibrated) |
khaledelmadawi | 0:e63996fd7d3e | 79 | nominalVal2=nominalVal2-_KP*ErrorV-_KD*ErrorVD-_KDD*ErrorVDD; |
khaledelmadawi | 0:e63996fd7d3e | 80 | ErrorVold=ErrorV; |
khaledelmadawi | 0:e63996fd7d3e | 81 | ErrorVDOLD=ErrorVD; |
khaledelmadawi | 0:e63996fd7d3e | 82 | |
khaledelmadawi | 0:e63996fd7d3e | 83 | //debugSerial.printf("error:%f aError:%f alt:%f NV:%f Real:%f\r\n",(MeanIR(Meannum)-altitude), alpha*(MeanIR(Meannum)-altitude),altitude,nominalVal2,MeanIR(Meannum)); |
khaledelmadawi | 0:e63996fd7d3e | 84 | Check_OUT_Limits(&nominalVal2); |
khaledelmadawi | 0:e63996fd7d3e | 85 | return nominalVal2; |
khaledelmadawi | 0:e63996fd7d3e | 86 | } |
khaledelmadawi | 0:e63996fd7d3e | 87 | float PID_Alt::MeanIR(int num) |
khaledelmadawi | 0:e63996fd7d3e | 88 | { |
khaledelmadawi | 0:e63996fd7d3e | 89 | float MeanReading=0; |
khaledelmadawi | 0:e63996fd7d3e | 90 | for(int i=0;i<num;i++)MeanReading+=Get_IR_Readings(); |
khaledelmadawi | 0:e63996fd7d3e | 91 | return MeanReading/num; |
khaledelmadawi | 0:e63996fd7d3e | 92 | } |
khaledelmadawi | 0:e63996fd7d3e | 93 | float PID_Alt::Get_reqestedAlt(){ |
khaledelmadawi | 0:e63996fd7d3e | 94 | return reqestedAlt; |
khaledelmadawi | 0:e63996fd7d3e | 95 | } |
khaledelmadawi | 0:e63996fd7d3e | 96 | float PID_Alt::GetErrorVDOLD(){ |
khaledelmadawi | 0:e63996fd7d3e | 97 | return EVDOLDGetter; |
khaledelmadawi | 0:e63996fd7d3e | 98 | } |
khaledelmadawi | 0:e63996fd7d3e | 99 | float PID_Alt::GetErrorV(){ |
khaledelmadawi | 0:e63996fd7d3e | 100 | return ErrorV; |
khaledelmadawi | 0:e63996fd7d3e | 101 | } |
khaledelmadawi | 0:e63996fd7d3e | 102 | float PID_Alt::GetErrorVD(){ |
khaledelmadawi | 0:e63996fd7d3e | 103 | return ErrorVD; |
khaledelmadawi | 0:e63996fd7d3e | 104 | } |
khaledelmadawi | 0:e63996fd7d3e | 105 | float PID_Alt::GetErrorVDD(){ |
khaledelmadawi | 0:e63996fd7d3e | 106 | return ErrorVDD; |
khaledelmadawi | 0:e63996fd7d3e | 107 | } |
khaledelmadawi | 0:e63996fd7d3e | 108 | float PID_Alt::Get_OUT_POWER_SP() |
khaledelmadawi | 0:e63996fd7d3e | 109 | { |
khaledelmadawi | 0:e63996fd7d3e | 110 | return nominalVal2; |
khaledelmadawi | 0:e63996fd7d3e | 111 | } |
khaledelmadawi | 0:e63996fd7d3e | 112 | float PID_Alt::Get_IR_Readings() |
khaledelmadawi | 0:e63996fd7d3e | 113 | { |
khaledelmadawi | 0:e63996fd7d3e | 114 | return _IR.cm(); |
khaledelmadawi | 0:e63996fd7d3e | 115 | } |
khaledelmadawi | 0:e63996fd7d3e | 116 | float PID_Alt::Get_Current_IR() |
khaledelmadawi | 0:e63996fd7d3e | 117 | { |
khaledelmadawi | 0:e63996fd7d3e | 118 | return CURRENT_Alt; |
khaledelmadawi | 0:e63996fd7d3e | 119 | } |
khaledelmadawi | 0:e63996fd7d3e | 120 | //setting Output Limits. |
khaledelmadawi | 0:e63996fd7d3e | 121 | void PID_Alt::Set_OUT_Limits(float LowerLimt,float UpperLimit) |
khaledelmadawi | 0:e63996fd7d3e | 122 | { |
khaledelmadawi | 0:e63996fd7d3e | 123 | O_Upper_Limit=UpperLimit; |
khaledelmadawi | 0:e63996fd7d3e | 124 | O_Lower_Limit=LowerLimt; |
khaledelmadawi | 0:e63996fd7d3e | 125 | //initializations |
khaledelmadawi | 0:e63996fd7d3e | 126 | // power=O_Lower_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 127 | // prev_power=O_Lower_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 128 | } |
khaledelmadawi | 0:e63996fd7d3e | 129 | //setting Input Limits. |
khaledelmadawi | 0:e63996fd7d3e | 130 | void PID_Alt::Set_IN_Limits(float LowerLimit,float UpperLimit) |
khaledelmadawi | 0:e63996fd7d3e | 131 | { |
khaledelmadawi | 0:e63996fd7d3e | 132 | I_Upper_Limit=UpperLimit; |
khaledelmadawi | 0:e63996fd7d3e | 133 | I_Lower_Limit=LowerLimit; |
khaledelmadawi | 0:e63996fd7d3e | 134 | // prev_alt=I_Lower_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 135 | } |
khaledelmadawi | 0:e63996fd7d3e | 136 | //checking Input Limits in the Realtime operation. |
khaledelmadawi | 0:e63996fd7d3e | 137 | void PID_Alt::Check_OUT_Limits(float *RPMSetPoint) |
khaledelmadawi | 0:e63996fd7d3e | 138 | { |
khaledelmadawi | 0:e63996fd7d3e | 139 | if(*RPMSetPoint>O_Upper_Limit)*RPMSetPoint=O_Upper_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 140 | if(*RPMSetPoint<O_Lower_Limit)*RPMSetPoint=O_Lower_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 141 | } |
khaledelmadawi | 0:e63996fd7d3e | 142 | //checking Output Limits in Realtime operation. |
khaledelmadawi | 0:e63996fd7d3e | 143 | void PID_Alt::Check_IN_Limits(float *O_PWM) |
khaledelmadawi | 0:e63996fd7d3e | 144 | { |
khaledelmadawi | 0:e63996fd7d3e | 145 | if(*O_PWM>I_Upper_Limit)*O_PWM=I_Upper_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 146 | if(*O_PWM<I_Lower_Limit)*O_PWM=I_Lower_Limit; |
khaledelmadawi | 0:e63996fd7d3e | 147 | } |
khaledelmadawi | 0:e63996fd7d3e | 148 | |
khaledelmadawi | 0:e63996fd7d3e | 149 | #endif |