LDSC_Robotics_TAs / Mbed 2 deprecated Robotics_Lab_Servo

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }