Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@0:564d77fcaa70, 2016-02-23 (annotated)
- Committer:
- YCTung
- Date:
- Tue Feb 23 13:47:59 2016 +0000
- Revision:
- 0:564d77fcaa70
- Child:
- 1:3b6c9baa7d0c
Servo project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
YCTung | 0:564d77fcaa70 | 1 | /*LAB_SERVO*/ |
YCTung | 0:564d77fcaa70 | 2 | #include "mbed.h" |
YCTung | 0:564d77fcaa70 | 3 | |
YCTung | 0:564d77fcaa70 | 4 | //The number will be compiled as type "double" in default |
YCTung | 0:564d77fcaa70 | 5 | //Add a "f" after the number can make it compiled as type "float" |
YCTung | 0:564d77fcaa70 | 6 | #define Ts 0.01f |
YCTung | 0:564d77fcaa70 | 7 | #define Kp 20.0f |
YCTung | 0:564d77fcaa70 | 8 | #define Ki 5.0f |
YCTung | 0:564d77fcaa70 | 9 | |
YCTung | 0:564d77fcaa70 | 10 | PwmOut servo(A0); |
YCTung | 0:564d77fcaa70 | 11 | PwmOut pwm1(D7); |
YCTung | 0:564d77fcaa70 | 12 | PwmOut pwm1n(D11); |
YCTung | 0:564d77fcaa70 | 13 | |
YCTung | 0:564d77fcaa70 | 14 | AnalogIn adc(A2);//Temporary usage |
YCTung | 0:564d77fcaa70 | 15 | |
YCTung | 0:564d77fcaa70 | 16 | //LED1 = D13 = PA_5 (LED on Nucleo board) |
YCTung | 0:564d77fcaa70 | 17 | DigitalOut led1(LED1); |
YCTung | 0:564d77fcaa70 | 18 | DigitalOut led2(D12); |
YCTung | 0:564d77fcaa70 | 19 | |
YCTung | 0:564d77fcaa70 | 20 | Ticker timer1; |
YCTung | 0:564d77fcaa70 | 21 | |
YCTung | 0:564d77fcaa70 | 22 | void init_IO(void); |
YCTung | 0:564d77fcaa70 | 23 | void init_ADC(void); |
YCTung | 0:564d77fcaa70 | 24 | void init_PWM(void); |
YCTung | 0:564d77fcaa70 | 25 | |
YCTung | 0:564d77fcaa70 | 26 | float ref = 0.45; // 0.45 +(0.48/180.0)*angle, -90<angle<90 |
YCTung | 0:564d77fcaa70 | 27 | float err = 0.0; |
YCTung | 0:564d77fcaa70 | 28 | float ierr = 0.0; |
YCTung | 0:564d77fcaa70 | 29 | float PI_out = 0.0; |
YCTung | 0:564d77fcaa70 | 30 | float ad_read = 0.0; // ADC value |
YCTung | 0:564d77fcaa70 | 31 | float pwm1_duty = 0.5; |
YCTung | 0:564d77fcaa70 | 32 | float servo_duty = 0.079;//0.079 +(0.084/180)*angle, -90<angle<90 |
YCTung | 0:564d77fcaa70 | 33 | |
YCTung | 0:564d77fcaa70 | 34 | void timer1_interrupt(void) |
YCTung | 0:564d77fcaa70 | 35 | { |
YCTung | 0:564d77fcaa70 | 36 | ad_read = adc.read(); |
YCTung | 0:564d77fcaa70 | 37 | |
YCTung | 0:564d77fcaa70 | 38 | //////code of PI control////// |
YCTung | 0:564d77fcaa70 | 39 | |
YCTung | 0:564d77fcaa70 | 40 | |
YCTung | 0:564d77fcaa70 | 41 | |
YCTung | 0:564d77fcaa70 | 42 | |
YCTung | 0:564d77fcaa70 | 43 | |
YCTung | 0:564d77fcaa70 | 44 | //////////// |
YCTung | 0:564d77fcaa70 | 45 | if(PI_out >= 0.5f)PI_out = 0.5; |
YCTung | 0:564d77fcaa70 | 46 | else if(PI_out <= -0.5f)PI_out = -0.5; |
YCTung | 0:564d77fcaa70 | 47 | pwm1_duty = PI_out + 0.5f; |
YCTung | 0:564d77fcaa70 | 48 | ad_read = adc.read(); |
YCTung | 0:564d77fcaa70 | 49 | if(ad_read > 0.69f || ad_read < 0.21f)pwm1_duty = 0.5; |
YCTung | 0:564d77fcaa70 | 50 | pwm1.write(pwm1_duty); |
YCTung | 0:564d77fcaa70 | 51 | TIM1->CCER |= 0x4; |
YCTung | 0:564d77fcaa70 | 52 | |
YCTung | 0:564d77fcaa70 | 53 | //////code of internal control////// |
YCTung | 0:564d77fcaa70 | 54 | |
YCTung | 0:564d77fcaa70 | 55 | |
YCTung | 0:564d77fcaa70 | 56 | |
YCTung | 0:564d77fcaa70 | 57 | |
YCTung | 0:564d77fcaa70 | 58 | |
YCTung | 0:564d77fcaa70 | 59 | //////////// |
YCTung | 0:564d77fcaa70 | 60 | if(servo_duty >= 0.121f)servo_duty = 0.121; |
YCTung | 0:564d77fcaa70 | 61 | else if(servo_duty <= 0.037f)servo_duty = 0.037; |
YCTung | 0:564d77fcaa70 | 62 | servo.write(servo_duty); |
YCTung | 0:564d77fcaa70 | 63 | } |
YCTung | 0:564d77fcaa70 | 64 | |
YCTung | 0:564d77fcaa70 | 65 | void init_TIMER(void) |
YCTung | 0:564d77fcaa70 | 66 | { |
YCTung | 0:564d77fcaa70 | 67 | timer1.attach_us(&timer1_interrupt, 10000);//10ms interrupt period (100 Hz) |
YCTung | 0:564d77fcaa70 | 68 | } |
YCTung | 0:564d77fcaa70 | 69 | |
YCTung | 0:564d77fcaa70 | 70 | void init_IO(void) |
YCTung | 0:564d77fcaa70 | 71 | { |
YCTung | 0:564d77fcaa70 | 72 | led1 = 0; |
YCTung | 0:564d77fcaa70 | 73 | led2 = 1; |
YCTung | 0:564d77fcaa70 | 74 | } |
YCTung | 0:564d77fcaa70 | 75 | |
YCTung | 0:564d77fcaa70 | 76 | void init_PWM(void) |
YCTung | 0:564d77fcaa70 | 77 | { |
YCTung | 0:564d77fcaa70 | 78 | servo.period_ms(20); |
YCTung | 0:564d77fcaa70 | 79 | servo.write(servo_duty); |
YCTung | 0:564d77fcaa70 | 80 | pwm1.period_us(50); |
YCTung | 0:564d77fcaa70 | 81 | pwm1.write(0.5); |
YCTung | 0:564d77fcaa70 | 82 | TIM1->CCER |= 0x4; |
YCTung | 0:564d77fcaa70 | 83 | } |
YCTung | 0:564d77fcaa70 | 84 | |
YCTung | 0:564d77fcaa70 | 85 | void flash(void) |
YCTung | 0:564d77fcaa70 | 86 | { |
YCTung | 0:564d77fcaa70 | 87 | led1 = !led1; |
YCTung | 0:564d77fcaa70 | 88 | } |
YCTung | 0:564d77fcaa70 | 89 | |
YCTung | 0:564d77fcaa70 | 90 | int main (void) |
YCTung | 0:564d77fcaa70 | 91 | { |
YCTung | 0:564d77fcaa70 | 92 | init_IO(); |
YCTung | 0:564d77fcaa70 | 93 | init_PWM(); |
YCTung | 0:564d77fcaa70 | 94 | init_TIMER(); |
YCTung | 0:564d77fcaa70 | 95 | while(1) |
YCTung | 0:564d77fcaa70 | 96 | { |
YCTung | 0:564d77fcaa70 | 97 | ; |
YCTung | 0:564d77fcaa70 | 98 | } |
YCTung | 0:564d77fcaa70 | 99 | } |