Thomas Plaisier / Mbed 2 deprecated G3_Barry_Plotter.

Dependencies:   MODSERIAL mbed Encoder

main.cpp

Committer:
Socrates
Date:
2013-10-18
Revision:
7:4d2edb5b0164
Parent:
6:27a4e8d9ddac
Child:
8:43cce9f7a006

File content as of revision 7:4d2edb5b0164:

#include "mbed.h"
#include "MODSERIAL.h"
AnalogIn emgt(PTB1);
AnalogIn emgb(PTB0);
MODSERIAL pc(USBTX,USBRX);
PwmOut pwm_motor1(PTA12);
PwmOut pwm_motor2(PTA5);
volatile bool looptimerflag;

void setlooptimerflag(void)
{
    looptimerflag = true;
}


int main()
{
    Ticker looptimer;
    const float ts=0.001;
    looptimer.attach(setlooptimerflag,ts);
    float xt,yt,y1t,y2t,x1t,zt,z1t,z2t,yabst,yabs1t,yabs2t,kt,numh1,numh2,denh1,denh2,numl1,numl2,numl3,denl1,denl2,denl3;
    float xb,yb,y1b,y2b,x1b,zb,z1b,z2b,yabsb,yabs1b,yabs2b,kb;
    float z;
    x1t=0;
    y1t=0;
    y2t=0;
    z1t=0;
    z2t=0;
    yabs1t=0;
    yabs2t=0;
    x1b=0;
    y1b=0;
    y2b=0;
    z1b=0;
    z2b=0;
    yabs1b=0;
    yabs2b=0;

    //High pass, 35Hz, 1e
    numh1=0.900575535279376;
    numh2=-0.900575535279376;
    //denh1=1;
    denh2=-0.801151070558751;

    //Low pass, 2 Hz, 2e orde
    numl1=0.391302053991682*pow(10.0,-4.0);
    numl2=0.782604107983365*pow(10.0,-4.0);
    numl3=0.391302053991682*pow(10.0,-4.0);
    //denl1=1;
    denl2=-1.982228929792529;
    denl3=0.982385450614126;
    pc.baud(115200);

    while(1) {
        while(looptimerflag != true);
        looptimerflag = false;

        //Triceps
        kt=emgt.read();
        xt=(kt-0.5)*2.0;

        //High pass
        //1e orde
        yt=xt*numh1+x1t*numh2-y1t*denh2;

        //Rectify
        yabst=abs(yt);

        //Low pass
        //2e orde
        zt=yabst*numl1+yabs1t*numl2+yabs2t*numl3-z1t*denl2-z2t*denl3;

        x1t=xt;
        y2t=y1t;
        y1t=yt;
        z2t=z1t;
        z1t=zt;
        yabs2t=yabs1t;
        yabs1t=yabst;

        //Biceps
        kb=emgb.read();
        xb=(kb-0.5)*2.0;

        //High pass
        //1e orde
        yb=xb*numh1+x1b*numh2-y1b*denh2;

        //Rectify
        yabsb=abs(yb);

        //Low pass
        //2e orde
        zb=yabsb*numl1+yabs1b*numl2+yabs2b*numl3-z1b*denl2-z2b*denl3;

        x1b=xb;
        y2b=y1b;
        y1b=yb;
        z2b=z1b;
        z1b=zb;
        yabs2b=yabs1b;
        yabs1b=yabsb;

        if (zb>zt) {
            z=zb;
        } else {
            z=zt;
        }

        if (z>1.0) {
            z=1.0;
        }
        pwm_motor1=z;
        pwm_motor2=z;
        pc.printf("%f\n\r",z);
    }
}