mbedを用いた制御学生の制御 / Mbed 2 deprecated NHK2015

Dependencies:   Motor_NIT_Nagaoka_College PID Servo QEI SoftPWM mbed HBridge

main.cpp

Committer:
WAT34
Date:
2015-09-03
Revision:
4:646562d80dc2
Parent:
3:d2c733b52600
Child:
5:4b462b9cb255

File content as of revision 4:646562d80dc2:

#define pi 3.141593
#include "mbed.h"
#include "Motor.h"
#include "PID.h"
#include "QEI.h"
#define RATE 0.05
BusOut air(p13,p14);
DigitalOut out(p12);
Serial conn(p9,p10);
Serial pc(USBTX,USBRX);
Motor L(p21,p15,p16);
Motor R(p22,p17,p18);
PID Lp(4.7,6,0,RATE);
PID Rp(4.7,6,0,RATE);
PID Tp(50,40000,0,0.001);
BusOut led(LED1,LED2,LED3,LED4);
Motor ot(p23,p19,p20);
QEI sensort(p29,p30,NC,624);
QEI ls(p27,p28,NC,624);
QEI rs(p25,p26,NC,624);
Timeout ai;
Ticker getsp;
char read;
int Rs = 0,Ls = 0;
int i = 0;
void getspeed()
{
    Rs =rs.getPulses()*2;
    Ls =ls.getPulses()*2;
    rs.reset();
    ls.reset();
}
void zero(){ 
    air = 0;
    i = 0;
    out = 1;
}
void rev(){
    air = 2;
    ai.attach(&zero,1.0);
    out = 0;
}
int main()
{
    double tilt = 0,lo = 0,ro = 0;
    int8_t ttilt = 0,tmpread = 0,tmpttilt = 0;
    Lp.setInputLimits(-3000,3000);
    Rp.setInputLimits(-3000,3000);
    Tp.setInputLimits(-45,45);
    Lp.setOutputLimits(-0.9,0.9);
    Rp.setOutputLimits(-0.9,0.9);
    Tp.setOutputLimits(-0.9,0.9);
    Lp.setMode(1);
    Rp.setMode(1);
    Tp.setMode(1);
    Lp.setBias(0.0);
    Rp.setBias(0.0);
    Tp.setBias(0.0);
    getsp.attach(&getspeed,0.05);
    while(1) {
        if(conn.getc() == 255) {
            tmpread = conn.getc();
            tmpttilt = conn.getc();
            if(tmpread^tmpttilt == conn.getc()){
                ttilt = tmpttilt;
                read = tmpread;
            }
        }
        if((read>>2)%2 && i == 0){
            air = 1;
            ai.attach(&rev,1.0);
            i = 1;
            led = 1;
        }
        if((read>>3)%2){
            Lp.setSetPoint(500);
            Rp.setSetPoint(500);
        }else
        if((read>>4)%2){
            Lp.setSetPoint(-500);
            Rp.setSetPoint(-500);
            led = 2;
        }else
        if((read>>5)%2){
            Lp.setSetPoint(-500);
            Rp.setSetPoint(500);
            led = 4;
        }else
        if((read>>6)%2){
            Lp.setSetPoint(500);
            Rp.setSetPoint(-500);
            led = 8;
        }else{
            Lp.setSetPoint(0);
            Rp.setSetPoint(0);
            led = 0;
        }
        Tp.setSetPoint(ttilt);
        tilt = double(sensort.getPulses());
        tilt = tilt*61/5128.0;
        Lp.setProcessValue(Ls);
        Rp.setProcessValue(Rs);
        Tp.setProcessValue(tilt);
        lo = Lp.compute();
        ro = Rp.compute();
        if (abs(lo) < 0.1){
            lo = 0;
        }
        if (abs(ro) < 0.1){
            ro = 0;
        }
        L.speed(lo);
        R.speed(ro);
        ot.speed(Tp.compute());
        pc.printf("%d\n\r",ttilt);
        wait_ms(1);
    }
}