En este programa se presenta un PID con entrada y salida analogica

Dependencies:   TextLCD mbed

/media/uploads/amarincan/pid-button.jpg

Files at this revision

API Documentation at this revision

Comitter:
amarincan
Date:
Wed Nov 13 02:55:38 2013 +0000
Commit message:
se cambio una funcion privada a publica

Changed in this revision

DebouncedIn.cpp Show annotated file Show diff for this revision Revisions of this file
DebouncedIn.h Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 4ba2d502801f DebouncedIn.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DebouncedIn.cpp	Wed Nov 13 02:55:38 2013 +0000
@@ -0,0 +1,91 @@
+#include "DebouncedIn.h"
+#include "mbed.h"
+ 
+/*
+ * Constructor
+ */
+DebouncedIn::DebouncedIn(PinName in) 
+    : _in(in) {    
+        
+    // reset all the flags and counters    
+    _samples = 0;
+    _output = 0;
+    _output_last = 0;
+    _rising_flag = 0;
+    _falling_flag = 0;
+    _state_counter = 0;
+    
+    // Attach ticker
+    _ticker.attach(this, &DebouncedIn::_sample, 0.005);     
+}
+  
+void DebouncedIn::_sample() {
+ 
+    // take a sample
+    _samples = _samples >> 1; // shift left
+      
+    if (_in) {
+        _samples |= 0x80;
+    }  
+      
+    // examine the sample window, look for steady state
+    if (_samples == 0x00) {
+        _output = 0;
+    } 
+    else if (_samples == 0xFF) {
+        _output = 1;
+    }
+ 
+ 
+    // Rising edge detection
+    if ((_output == 1) && (_output_last == 0)) {
+        _rising_flag++;
+        _state_counter = 0;
+    }
+ 
+    // Falling edge detection
+    else if ((_output == 0) && (_output_last == 1)) {
+        _falling_flag++;
+        _state_counter = 0;
+    }
+    
+    // steady state
+    else {
+        _state_counter++;
+    }
+    
+   // update the output
+    _output_last = _output;
+    
+}
+ 
+ 
+ 
+// return number of rising edges
+int DebouncedIn::rising(void) {
+    int return_value = _rising_flag; 
+    _rising_flag = 0;
+    return(return_value);
+}
+ 
+// return number of falling edges
+int DebouncedIn::falling(void) {
+    int return_value = _falling_flag; 
+    _falling_flag = 0;
+    return(return_value);
+}
+ 
+// return number of ticsk we've bene steady for
+int DebouncedIn::steady(void) {
+return(_state_counter);
+}
+ 
+// return the debounced status
+int DebouncedIn::read(void) {
+    return(_output);
+}
+ 
+// shorthand for read()
+DebouncedIn::operator int() {
+    return read();
+}
\ No newline at end of file
diff -r 000000000000 -r 4ba2d502801f DebouncedIn.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DebouncedIn.h	Wed Nov 13 02:55:38 2013 +0000
@@ -0,0 +1,32 @@
+#include "mbed.h"
+ 
+    class DebouncedIn {
+        public:      
+             DebouncedIn(PinName in);
+ 
+             int read (void);
+             operator int();
+              
+             int rising(void);
+             int falling(void);
+             int steady(void);
+              
+        private :    
+               // objects
+               DigitalIn _in;    
+               Ticker _ticker;
+ 
+               // function to take a sample, and update flags
+               void _sample(void);
+ 
+               // counters and flags
+               int _samples;
+               int _output;
+               int _output_last;
+               int _rising_flag;
+               int _falling_flag;
+               int _state_counter;
+ 
+    };
+    
+            
diff -r 000000000000 -r 4ba2d502801f TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Wed Nov 13 02:55:38 2013 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/simon/code/TextLCD/#44f34c09bd37
diff -r 000000000000 -r 4ba2d502801f main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Nov 13 02:55:38 2013 +0000
@@ -0,0 +1,242 @@
+#include "mbed.h"
+#include "DebouncedIn.h"
+#include "TextLCD.h"
+
+
+AnalogIn Vin(PTB3);
+AnalogOut Vout(PTE30);
+
+TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
+ 
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DebouncedIn button1(PTC12);
+DebouncedIn button2(PTC13);
+DebouncedIn button3(PTC16);
+DebouncedIn button4(PTC17);
+ 
+/*    codigos movimiento del curzor
+      18 para izquierda
+      1A para derecha
+*/      
+ 
+ 
+int C1=0x0E; // solo muestra el curzor
+int C2=0x18; // desplaza izquierda
+int C3=0x1A; // desplaza derecha
+int C4=0x0C; // quito cursor bajo
+int i; // indice de la variable
+int j;
+int Kp, Ki, Kd, Sp,  yr, cycle, med2 , c; 
+float med,pid,ap, err, ai, ad,err_v;
+int main() {
+    
+    lcd.writeCommand(0x0E);
+    lcd.printf("Sp=     Kp=");
+    lcd.locate(0,1);
+    lcd.printf("Ki=     Kd=");
+    lcd.locate(2,0);
+    lcd.printf("=");
+
+    while(1) {
+      
+    
+     if(button1.falling()) {
+                                        
+            switch(i) {
+                case 0:
+                    lcd.locate(2,0);
+                    lcd.printf("=     ");
+                    lcd.locate(3,0);
+                    lcd.printf("%d",++Sp);
+                    
+                    break;
+                case 1:
+                    lcd.locate(10,0);
+                    lcd.printf("=     ");
+                    lcd.locate(11,0);
+                    lcd.printf("%d",++Kp);
+                    break;
+                case 2:
+                    
+                    lcd.locate(2,1);
+                    lcd.printf("=     ");
+                    lcd.locate(3,1);
+                    lcd.printf("%d",++Ki);
+                    break;
+                case 3:
+                    lcd.locate(10,1);
+                    lcd.printf("=     ");
+                    lcd.locate(11,1);
+                    lcd.printf("%d",++Kd);
+                    break;
+            }
+        }
+        if(button2.falling()) {
+            switch(i) {
+                case 0:
+                    if(Sp<0) {
+                        Sp=0;
+                    }
+                    lcd.locate(2,0);
+                    lcd.printf("=     ");
+                    lcd.locate(3,0);
+                    lcd.printf("%d",Sp--);
+                    break;
+                case 1:
+                    if(Kp<0) {
+                        Kp=0;
+                    }
+                    lcd.locate(10,0);
+                    lcd.printf("=     ");
+                    lcd.locate(11,0);
+                    lcd.printf("%d",Kp--);
+                    break;
+                case 2:
+                   
+                    if(Ki<0) {
+                        Ki=0;
+                    }
+                    lcd.locate(2,1);
+                    lcd.printf("=     ");
+                    lcd.locate(3,1);
+                    lcd.printf("%d",Ki--);
+                    break;
+                case 3:
+                   
+                    if(Kd<0) {
+                        Kd=0;
+                    }
+                    lcd.locate(10,1);
+                    lcd.printf("=     ");
+                    lcd.locate(11,1);
+                    lcd.printf("%d",Kd--);
+                    break;
+            }
+        }
+        if(button3.falling()) {
+            i++;
+            if(i>3) {
+                i=0;
+            }
+            switch (i) {
+                case 0:
+                    lcd.locate(2,0);
+                    lcd.printf("=");
+                    break;
+                case 1:
+                    lcd.locate(10,0);
+                    lcd.printf("=");
+                    break;
+                case 2:
+                    lcd.locate(2,1);
+                    lcd.printf("=");
+                    break;
+                case 3:
+                    lcd.locate(10,1);
+                    lcd.printf("=");
+                    break;
+            }
+        }       
+    
+              
+           if (button4.falling()){
+           break;     //sale del bucle si pisan suiche4
+               }
+                        
+                                        }
+           lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
+           lcd.cls(); //borra la pantalla
+           lcd.printf("   GUARDADOS!"); 
+           wait(2);
+           lcd.cls();
+           lcd.printf(" INICIA EL PID");
+           wait(2);
+           // se imprimen los parches del control  *****************************************
+           lcd.cls();
+         
+           
+           lcd.printf("Er%d",err);
+           lcd.locate(8,0);
+           lcd.printf("Me%d",med2);
+           lcd.locate(0,1);
+           lcd.printf("Sp%d",Sp);
+           lcd.locate(8,1);
+           lcd.printf("Pid%d",pid);
+           //wait(5);
+           
+           // CICLO PRINCIPAL CONTROLADOR PID
+         
+           while(1) {
+                              //leer puerto analogo y asignar a med
+           med=Vin.read();
+           med2=med*100;
+           err = (Sp-med2);
+           float kp2;
+           kp2=Kp*0.001;
+           ap = kp2*err;
+           float ki2;
+           ki2=Ki*0.001;           
+           ai =(ki2*err)+ai;    //calculo de la integral del error
+           float kd2;
+           kd2=Kd*0.0001;
+           ad = kd2*(err-err_v); //calculo de la accion derivativa
+           err_v=err;          //guarda el error
+           pid = (ap+ai+ad);
+           
+              // se verifica que pid sea menor o igual la valor maximo *****************
+            if (pid > .99999){
+           pid=1;
+           } 
+           
+           // se verifica que pid sea positivo **************************************
+           if (pid <0){
+           pid=0;
+           } 
+           
+            //wait(.5);
+            
+           
+           
+           // se verifica que la accion integral no sea muy grande
+           if (ai > 999){
+           ai=1000;
+           } 
+          
+           
+           Vout=pid;
+          
+                     
+           //****se muestran las variables******************************************
+          if(c>600){           
+           lcd.locate(2,0);
+           lcd.printf("      "); 
+           lcd.locate(0,0);
+           lcd.printf("Er%2.2f",err);
+           lcd.locate(10,0);
+           lcd.printf("      ");
+           lcd.locate(8,0);
+           lcd.printf("Me%d",med2);
+           lcd.locate(2,1);
+           lcd.printf("      ");
+           lcd.locate(0,1);
+           lcd.printf("Sp%d",Sp);
+           lcd.locate(10,1);
+           lcd.printf("      ");
+           lcd.locate(8,1);
+           lcd.printf("Pid%4.3f",pid);
+           c=0;
+           }
+           else 
+           c++;
+          
+                           
+           
+            
+           
+           
+           
+           //  se envia el valor pid a puerto analogico de salida (D/A) **************
+           //  se repite el ciclo
+           }
+}
\ No newline at end of file
diff -r 000000000000 -r 4ba2d502801f mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Nov 13 02:55:38 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f
\ No newline at end of file