
Codigo derivada de levant y comunicacion serial con matlab
Fork of SC_accelerometer by
Diff: main.cpp
- Revision:
- 2:31492faba62d
- Parent:
- 1:2d5e4ef32912
--- a/main.cpp Tue Sep 01 05:26:51 2015 +0000 +++ b/main.cpp Sun Sep 06 04:48:46 2015 +0000 @@ -1,57 +1,75 @@ #include "mbed.h" #include "MMA8451Q.h" +#include "math.h" +#define MMA8451_I2C_ADDRESS (0x1d<<1) + Serial pc(USBTX, USBRX); -#define MMA8451_I2C_ADDRESS (0x1d<<1) +char val; + +uint8_t t; + +int8_t t_total; +uint16_t n; +uint16_t i=0; + +float signal; //senal que representa la funcion +float dt,signo; +float L=4.0; +float lambda, alfa; +float z0=0; +float z1=0; int main(void) { pc.baud(115200); - + + /******************* Inicializacion *********************/ + t =0; //inicializo variable de tiempo en 0 msec + t_total=9; + dt=0.015; //10 milisegundos + n=(uint16_t)(t_total/dt); //numero de muestras + + lambda=1.1*sqrt(L); //en z0 lambda=1.5L^(1/2) + alfa=0.5*L; //en z1 alfa=1.1L + + + /******************* Acelerometro ************************/ MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); PwmOut rled(LED_RED); PwmOut gled(LED_GREEN); PwmOut bled(LED_BLUE); - - while (true) { - rled = 1.0 - abs(acc.getAccX()); - gled = 1.0 - abs(acc.getAccY()); - bled = 1.0 - abs(acc.getAccZ()); - wait(0.2); - - pc.printf("%.2f \r\n ",acc.getAccX()); -// pc.printf("eje y = %.2f \n\r ",acc.getAccY()); -// pc.printf("eje z = %.2f \n\n\r",acc.getAccZ()); + + pc.printf("%c \r\n",'a'); //palabra que indica que comienze la recepcion + + for(i=0; i<n; i++) { + + rled = 1.0 - abs(acc.getAccX());//gled = 1.0 - abs(acc.getAccY()); //bled = 1.0 - abs(acc.getAccZ()); + + signal = acc.getAccX(); //senal del eje x del acelerometro + + if ((z0-signal)>0){ + signo=1.0; + } + else{ + signo=-1.0; + } + + z0= z0+ dt*(z1-(lambda*sqrt(abs(z0-signal)))*signo) ; //z0n=z0+dt*z1-dt*lambda*sqrt(abs(z0-f))*sign(z0-f); + z1= z1 - dt*(alfa*signo); //z1n=z1-dt*alfa*sign(z0-f); + + wait(dt); + t = t+dt; //al tiempo le doy incremento de 100 msec + + /************* El programa enviara datos cada 10 mili segundos **************/ + pc.printf("%i \r\n",(int8_t)(signal*100)); //imprime el valor de la funcion + pc.printf("%i \r\n",(int8_t)(z0*100)); //imprime el valor de la funcion + pc.printf("%i \r\n\n",(int8_t)(z1*100)); //imprime el valor de la funcion + + +// pc.printf("%.2f \r\n ",signal); //imprime el valor de la funcion +// pc.printf("%.2f \r\n ",z0); //imprime el valor de la funcion +// pc.printf("%.2f \r\n\n",z1); //imprime el valor de la funcion + + } } - -/**********Código de Matlab para leer la señal del acelerometro**************/ -/* -clear all; -close all; -clc; -%% ======================== ACELEROMETRO =============================== %% -display('Start'); - -delete(instrfind); -pause(0.1); -mbed = serial('COM5'); -set(mbed,'BaudRate',115200,'DataBits', 8, 'Parity', 'none','StopBits', 1, 'FlowControl', 'none','Terminator','CR/LF'); -fopen(mbed); - -for i = 1 : 20 - A = fscanf(mbed,'%f'); - y(1,i)=int8(A*100); - pause(0.1); -end - -plot(y); -axis ([0 i -200 200]); -xlabel('time') -ylabel('Voltage') - -fclose(mbed); -delete(mbed); -clear mbed; - -display('End'); -*/ \ No newline at end of file