No.9 Robotics / Mbed 2 deprecated Robotics_Servo_control

Dependencies:   mbed

Fork of Robotics_Lab_Servo by LDSC_Robotics

main.cpp

Committer:
YCTung
Date:
2016-03-03
Revision:
2:a3c64321e9c2
Parent:
1:3b6c9baa7d0c
Child:
3:71a807b38a3e

File content as of revision 2:a3c64321e9c2:

/*LAB_SERVO*/
#include "mbed.h"

//The number will be compiled as type "double" in default
//Add a "f" after the number can make it compiled as type "float"
#define Ts 0.01f    //period of timer1 (s)
#define Kp 0.053f
#define Ki 0.013f

PwmOut servo(A0);
PwmOut pwm1(D7);
PwmOut pwm1n(D11);

AnalogIn adc(A2);//Temporary usage

//LED1 = D13 = PA_5 (LED on Nucleo board)
DigitalOut led1(LED1);
DigitalOut led2(D12);

Ticker timer1;
void timer1_interrupt(void);

void init_TIMER(void);
void init_IO(void); 
void init_PWM(void);
void flash(void);

//Variable(s) for PI controller
float angle_ref = 0.0;  //unit in degree(s), range +-90 degrees
float angle_read= 0.0;
float angle_check;
float err = 0.0;
float ierr = 0.0;
float PI_out = 0.0;
float pwm1_duty = 0.5;

//Variable(s) for internal control
float servo_duty = 0.079;//0.079 +(0.084/180)*angle, -90<angle<90

int main (void)
{    
    init_IO();
    init_PWM();
    init_TIMER();
    while(1)
    {
        ;
    }       
}

void timer1_interrupt(void)
{
    angle_read = (adc.read() - 0.45f) / 0.48f * 180.0f;   //0.21 ~ 0.69 respect to -90 ~ +90 degree
    angle_check = angle_read;
    
    //////code for PI control//////
    
    
    
    
    
    
    ////////////
    if(PI_out >= 0.5f)PI_out = 0.5;
    else if(PI_out <= -0.5f)PI_out = -0.5;
    pwm1_duty = PI_out + 0.5f;
    if(angle_check > 100.0f || angle_check < -100.0f)pwm1_duty = 0.5;
    pwm1.write(pwm1_duty);
    TIM1->CCER |= 0x4;
    
    //////code for internal control//////
    
    
    
    
    
    ////////////
    if(servo_duty >= 0.121f)servo_duty = 0.121;
    else if(servo_duty <= 0.037f)servo_duty = 0.037;
    servo.write(servo_duty);
}

void init_TIMER(void)
{
    timer1.attach_us(&timer1_interrupt, 10000);//10ms interrupt period (100 Hz)
}
       
void init_IO(void)
{
    led1 = 0;
    led2 = 1;
}         
   
void init_PWM(void)
{
    servo.period_ms(20);
    servo.write(servo_duty);
    pwm1.period_us(50);
    pwm1.write(0.5);
    TIM1->CCER |= 0x4;
}

void flash(void)
{
    led1 = !led1;
}