lab2
Dependencies: mbed hallsensor_software_decoder
main.cpp@0:b124e4e3a1e4, 2019-03-13 (annotated)
- Committer:
- bobolee1239
- Date:
- Wed Mar 13 06:26:51 2019 +0000
- Revision:
- 0:b124e4e3a1e4
- Child:
- 1:47a1aaf98baa
fdafdsafdsaf dsf; ; ;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bobolee1239 | 0:b124e4e3a1e4 | 1 | #include "mbed.h" |
bobolee1239 | 0:b124e4e3a1e4 | 2 | #include "hallsensor_software_decoder.h" |
bobolee1239 | 0:b124e4e3a1e4 | 3 | |
bobolee1239 | 0:b124e4e3a1e4 | 4 | #define Ts 0.01f // f to specify float type |
bobolee1239 | 0:b124e4e3a1e4 | 5 | |
bobolee1239 | 0:b124e4e3a1e4 | 6 | Ticker timer1; |
bobolee1239 | 0:b124e4e3a1e4 | 7 | |
bobolee1239 | 0:b124e4e3a1e4 | 8 | PwmOut pwm1(D7); |
bobolee1239 | 0:b124e4e3a1e4 | 9 | PwmOut pwm1n(D11); |
bobolee1239 | 0:b124e4e3a1e4 | 10 | PwmOut pwm2(D8); |
bobolee1239 | 0:b124e4e3a1e4 | 11 | PwmOut pwm2n(A3); |
bobolee1239 | 0:b124e4e3a1e4 | 12 | |
bobolee1239 | 0:b124e4e3a1e4 | 13 | void init_TIMER(); |
bobolee1239 | 0:b124e4e3a1e4 | 14 | void init_PWM(); |
bobolee1239 | 0:b124e4e3a1e4 | 15 | void timer1_ITR(); |
bobolee1239 | 0:b124e4e3a1e4 | 16 | |
bobolee1239 | 0:b124e4e3a1e4 | 17 | /* wheel 1 */ |
bobolee1239 | 0:b124e4e3a1e4 | 18 | float rotation_speed_1 = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 19 | float pwm1_duty = 0.5; |
bobolee1239 | 0:b124e4e3a1e4 | 20 | double PI_out_1 = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 21 | float err_1 = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 22 | float ierr_1 = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 23 | |
bobolee1239 | 0:b124e4e3a1e4 | 24 | /* wheel 2 */ |
bobolee1239 | 0:b124e4e3a1e4 | 25 | float rotation_speed_2 = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 26 | float pwm2_duty = 0.5; |
bobolee1239 | 0:b124e4e3a1e4 | 27 | float PI_out_2 = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 28 | float err_2 = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 29 | float ierr_2 = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 30 | |
bobolee1239 | 0:b124e4e3a1e4 | 31 | float r = 0.03; // wheel radius (m) |
bobolee1239 | 0:b124e4e3a1e4 | 32 | float L = 0.27; // car width (m) |
bobolee1239 | 0:b124e4e3a1e4 | 33 | |
bobolee1239 | 0:b124e4e3a1e4 | 34 | float rotation_speed_ref_1 = 25.0; |
bobolee1239 | 0:b124e4e3a1e4 | 35 | float rotation_speed_ref_2 = -25.0; |
bobolee1239 | 0:b124e4e3a1e4 | 36 | |
bobolee1239 | 0:b124e4e3a1e4 | 37 | float V_ref = 0.0; // (m/s) max: 0.25 |
bobolee1239 | 0:b124e4e3a1e4 | 38 | float V = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 39 | float W_ref = 0.0; // (rad/s) |
bobolee1239 | 0:b124e4e3a1e4 | 40 | float W = 0.0; |
bobolee1239 | 0:b124e4e3a1e4 | 41 | |
bobolee1239 | 0:b124e4e3a1e4 | 42 | |
bobolee1239 | 0:b124e4e3a1e4 | 43 | float Kp = 0.008; |
bobolee1239 | 0:b124e4e3a1e4 | 44 | float Ki = 0.02; |
bobolee1239 | 0:b124e4e3a1e4 | 45 | |
bobolee1239 | 0:b124e4e3a1e4 | 46 | //Serial pc(USBTX, USBRX); |
bobolee1239 | 0:b124e4e3a1e4 | 47 | |
bobolee1239 | 0:b124e4e3a1e4 | 48 | |
bobolee1239 | 0:b124e4e3a1e4 | 49 | int main() |
bobolee1239 | 0:b124e4e3a1e4 | 50 | { |
bobolee1239 | 0:b124e4e3a1e4 | 51 | //pc.baud(9600); |
bobolee1239 | 0:b124e4e3a1e4 | 52 | init_TIMER(); |
bobolee1239 | 0:b124e4e3a1e4 | 53 | init_PWM(); |
bobolee1239 | 0:b124e4e3a1e4 | 54 | init_CN(); |
bobolee1239 | 0:b124e4e3a1e4 | 55 | |
bobolee1239 | 0:b124e4e3a1e4 | 56 | while(1) { |
bobolee1239 | 0:b124e4e3a1e4 | 57 | V = ((rotation_speed_1 + rotation_speed_2) * r / 2.0f )* 2.0f * 3.14f / 60.0f; |
bobolee1239 | 0:b124e4e3a1e4 | 58 | W = (-2.0f * r * (rotation_speed_1 - rotation_speed_2) / L) * 2.0f * 3.14f / 60.0f; |
bobolee1239 | 0:b124e4e3a1e4 | 59 | /* pc.printf("motor_1 = %f, motor_2 = %f\r\n", rotation_speed_1,rotation_speed_2); |
bobolee1239 | 0:b124e4e3a1e4 | 60 | pc.printf("V = %f, W = %f\r\n", V,W);*/ |
bobolee1239 | 0:b124e4e3a1e4 | 61 | |
bobolee1239 | 0:b124e4e3a1e4 | 62 | wait_ms(100); |
bobolee1239 | 0:b124e4e3a1e4 | 63 | } |
bobolee1239 | 0:b124e4e3a1e4 | 64 | } |
bobolee1239 | 0:b124e4e3a1e4 | 65 | |
bobolee1239 | 0:b124e4e3a1e4 | 66 | |
bobolee1239 | 0:b124e4e3a1e4 | 67 | |
bobolee1239 | 0:b124e4e3a1e4 | 68 | void init_TIMER() { |
bobolee1239 | 0:b124e4e3a1e4 | 69 | /******************************************************** |
bobolee1239 | 0:b124e4e3a1e4 | 70 | * function to be attached (timer1_ITR) and |
bobolee1239 | 0:b124e4e3a1e4 | 71 | * the interval (10000 micro-seconds) = 0.01 second |
bobolee1239 | 0:b124e4e3a1e4 | 72 | *********************************************************/ |
bobolee1239 | 0:b124e4e3a1e4 | 73 | timer1.attach_us(&timer1_ITR, 10000.0); |
bobolee1239 | 0:b124e4e3a1e4 | 74 | } |
bobolee1239 | 0:b124e4e3a1e4 | 75 | |
bobolee1239 | 0:b124e4e3a1e4 | 76 | |
bobolee1239 | 0:b124e4e3a1e4 | 77 | void init_PWM(){ |
bobolee1239 | 0:b124e4e3a1e4 | 78 | /* setting pwm width */ |
bobolee1239 | 0:b124e4e3a1e4 | 79 | |
bobolee1239 | 0:b124e4e3a1e4 | 80 | pwm1.period_us(50); |
bobolee1239 | 0:b124e4e3a1e4 | 81 | pwm1.write(0.5); |
bobolee1239 | 0:b124e4e3a1e4 | 82 | TIM1->CCER |= 0x4; |
bobolee1239 | 0:b124e4e3a1e4 | 83 | |
bobolee1239 | 0:b124e4e3a1e4 | 84 | pwm2.period_us(50); |
bobolee1239 | 0:b124e4e3a1e4 | 85 | pwm2.write(0.5); |
bobolee1239 | 0:b124e4e3a1e4 | 86 | TIM1->CCER |= 0x40; |
bobolee1239 | 0:b124e4e3a1e4 | 87 | } |
bobolee1239 | 0:b124e4e3a1e4 | 88 | |
bobolee1239 | 0:b124e4e3a1e4 | 89 | |
bobolee1239 | 0:b124e4e3a1e4 | 90 | void timer1_ITR() |
bobolee1239 | 0:b124e4e3a1e4 | 91 | { |
bobolee1239 | 0:b124e4e3a1e4 | 92 | |
bobolee1239 | 0:b124e4e3a1e4 | 93 | //rotation_speed_ref_1 = (V_ref / r - L * W_ref / 4.0f / r) / 2.0f / 3.14f * 60.0f; |
bobolee1239 | 0:b124e4e3a1e4 | 94 | //rotation_speed_ref_2 = (V_ref / r + L * W_ref / 4.0f / r) / 2.0f / 3.14f * 60.0f; |
bobolee1239 | 0:b124e4e3a1e4 | 95 | |
bobolee1239 | 0:b124e4e3a1e4 | 96 | |
bobolee1239 | 0:b124e4e3a1e4 | 97 | /********** MOTOR1 **********/ |
bobolee1239 | 0:b124e4e3a1e4 | 98 | |
bobolee1239 | 0:b124e4e3a1e4 | 99 | //measure |
bobolee1239 | 0:b124e4e3a1e4 | 100 | rotation_speed_1 = (float)speed_count_1 * 100.0f / 48.0f * 60.0f / 56.0f; //unit: rpm |
bobolee1239 | 0:b124e4e3a1e4 | 101 | // reset |
bobolee1239 | 0:b124e4e3a1e4 | 102 | speed_count_1 = 0; |
bobolee1239 | 0:b124e4e3a1e4 | 103 | |
bobolee1239 | 0:b124e4e3a1e4 | 104 | /************ PI controller for motor1 *************/ |
bobolee1239 | 0:b124e4e3a1e4 | 105 | |
bobolee1239 | 0:b124e4e3a1e4 | 106 | err_1 = rotation_speed_ref_1 - rotation_speed_1; |
bobolee1239 | 0:b124e4e3a1e4 | 107 | ierr_1 = ierr_1 + Ts * err_1; |
bobolee1239 | 0:b124e4e3a1e4 | 108 | |
bobolee1239 | 0:b124e4e3a1e4 | 109 | // restrict integrating part |
bobolee1239 | 0:b124e4e3a1e4 | 110 | if(ierr_1 > 50.0f){ |
bobolee1239 | 0:b124e4e3a1e4 | 111 | ierr_1 = 50.0; |
bobolee1239 | 0:b124e4e3a1e4 | 112 | } else if(ierr_1 < -50.0f){ |
bobolee1239 | 0:b124e4e3a1e4 | 113 | ierr_1 = -50.0; |
bobolee1239 | 0:b124e4e3a1e4 | 114 | } |
bobolee1239 | 0:b124e4e3a1e4 | 115 | |
bobolee1239 | 0:b124e4e3a1e4 | 116 | PI_out_1 = (Kp * err_1 + Ki * ierr_1); |
bobolee1239 | 0:b124e4e3a1e4 | 117 | |
bobolee1239 | 0:b124e4e3a1e4 | 118 | // staturation |
bobolee1239 | 0:b124e4e3a1e4 | 119 | if(PI_out_1 >= 0.5f){ |
bobolee1239 | 0:b124e4e3a1e4 | 120 | PI_out_1 = 0.5; |
bobolee1239 | 0:b124e4e3a1e4 | 121 | } else if(PI_out_1 <= -0.5f){ |
bobolee1239 | 0:b124e4e3a1e4 | 122 | PI_out_1 = -0.5; |
bobolee1239 | 0:b124e4e3a1e4 | 123 | } |
bobolee1239 | 0:b124e4e3a1e4 | 124 | /*************************************************/ |
bobolee1239 | 0:b124e4e3a1e4 | 125 | |
bobolee1239 | 0:b124e4e3a1e4 | 126 | /* output to acuator */ |
bobolee1239 | 0:b124e4e3a1e4 | 127 | pwm1_duty = PI_out_1 + 0.5f; |
bobolee1239 | 0:b124e4e3a1e4 | 128 | pwm1.write(pwm1_duty); |
bobolee1239 | 0:b124e4e3a1e4 | 129 | TIM1->CCER |= 0x4; |
bobolee1239 | 0:b124e4e3a1e4 | 130 | |
bobolee1239 | 0:b124e4e3a1e4 | 131 | |
bobolee1239 | 0:b124e4e3a1e4 | 132 | |
bobolee1239 | 0:b124e4e3a1e4 | 133 | |
bobolee1239 | 0:b124e4e3a1e4 | 134 | /********* MOTOR2 ***********/ |
bobolee1239 | 0:b124e4e3a1e4 | 135 | |
bobolee1239 | 0:b124e4e3a1e4 | 136 | |
bobolee1239 | 0:b124e4e3a1e4 | 137 | rotation_speed_2 = (float)speed_count_2 * 100.0f / 48.0f * 60.0f / 56.0f; //unit: rpm |
bobolee1239 | 0:b124e4e3a1e4 | 138 | speed_count_2 = 0; |
bobolee1239 | 0:b124e4e3a1e4 | 139 | |
bobolee1239 | 0:b124e4e3a1e4 | 140 | /************* PI controller for motor2 ****************/ |
bobolee1239 | 0:b124e4e3a1e4 | 141 | err_2 = rotation_speed_ref_2 - rotation_speed_2; |
bobolee1239 | 0:b124e4e3a1e4 | 142 | ierr_2 = ierr_2 + Ts * err_2; |
bobolee1239 | 0:b124e4e3a1e4 | 143 | |
bobolee1239 | 0:b124e4e3a1e4 | 144 | // restrict integration output |
bobolee1239 | 0:b124e4e3a1e4 | 145 | if(ierr_2 > 50.0f){ |
bobolee1239 | 0:b124e4e3a1e4 | 146 | ierr_2 = 50.0; |
bobolee1239 | 0:b124e4e3a1e4 | 147 | } else if(ierr_2 < -50.0f){ |
bobolee1239 | 0:b124e4e3a1e4 | 148 | ierr_2 = -50.0; |
bobolee1239 | 0:b124e4e3a1e4 | 149 | } |
bobolee1239 | 0:b124e4e3a1e4 | 150 | PI_out_2 = -(Kp * err_2 + Ki * ierr_2) ; |
bobolee1239 | 0:b124e4e3a1e4 | 151 | |
bobolee1239 | 0:b124e4e3a1e4 | 152 | // staturation |
bobolee1239 | 0:b124e4e3a1e4 | 153 | if(PI_out_2 >= 0.5f){ |
bobolee1239 | 0:b124e4e3a1e4 | 154 | PI_out_2 = 0.5; |
bobolee1239 | 0:b124e4e3a1e4 | 155 | } else if(PI_out_2 <= -0.5f) { |
bobolee1239 | 0:b124e4e3a1e4 | 156 | PI_out_2 = -0.5; |
bobolee1239 | 0:b124e4e3a1e4 | 157 | } |
bobolee1239 | 0:b124e4e3a1e4 | 158 | /******************************************************/ |
bobolee1239 | 0:b124e4e3a1e4 | 159 | /* output to acuator */ |
bobolee1239 | 0:b124e4e3a1e4 | 160 | pwm2_duty = PI_out_2 + 0.5f; |
bobolee1239 | 0:b124e4e3a1e4 | 161 | pwm2.write(pwm2_duty); |
bobolee1239 | 0:b124e4e3a1e4 | 162 | TIM1->CCER |= 0x40; |
bobolee1239 | 0:b124e4e3a1e4 | 163 | |
bobolee1239 | 0:b124e4e3a1e4 | 164 | |
bobolee1239 | 0:b124e4e3a1e4 | 165 | } |