Codigo derivada de levant y comunicacion serial con matlab

Dependencies:   MMA8451Q mbed

Fork of SC_accelerometer by Simulaciones Computacionales

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