MEL_Kings / Mbed 2 deprecated Praktikum_2_4_AMSL_v2

Dependencies:   C12832_lcd mbed

Fork of Praktikum_2_4_ADC by MEL_Kings

Revision:
1:660fec290722
Parent:
0:8a8d53cb84e8
--- a/main.cpp	Wed Mar 07 10:20:07 2018 +0000
+++ b/main.cpp	Wed Mar 07 18:57:32 2018 +0000
@@ -1,16 +1,39 @@
 // Example to set up an interrupt based on the LPC TIMER0 match register, sford
- 
+ #include "C12832_lcd.h"
 #include "mbed.h"
 
+// Definitionen
+#define n 9 // n ist die Ordnung des Filters,
+        //         erfordert n+1 Koeffizienten
+int i;
+float x,y;    // Eingang, Ausgang
+int PZ;     // zeigt auf Ringpuffer p
+int PA;     // zeigt auf Koeffizienten a,b
+float p[n+1];   // Ringpuffer mit n Speichern (n=0 unbenutzt)
+float a[n+1];   // Koeffizienten
+
 DigitalOut myled(LED1);
-DigitalOut irqled(LED2);
+DigitalOut mypin(p21);
+AnalogIn input(p19);
+
+C12832_LCD lcd;
+
+void Init_Filter();
+float FIR(float x);
+
+volatile uint16_t poti, poti_f;
 
 void myhandler() {                                      //Interrupt Service Routine, wird durch den Timer0_Vektor gestartet
+     mypin=1;
+   
     // do something!
-    irqled = !irqled;
-    
+    poti= input.read_u16();
+   
+    poti_f=FIR(poti);
+      mypin=0;
+   
     // clear the TIMER0 interrupt
-    LPC_TIM0->IR = 1;                                   //Reset Timer0 Interrupt Flag
+    LPC_TIM0->IR = 1;                                //Reset Timer0 Interrupt Flag
 }
 
 int main() {
@@ -25,11 +48,11 @@
     LPC_TIM0->PR = 0;
 
     // calculate period (1 interrupt every second)
-    uint32_t period = SystemCoreClock / 20;                              //Period ist die Periodenlänge     /4 ursprünlgich für eine Sekunde
+    uint32_t period = SystemCoreClock / 4;                              //Period ist die Periodenlänge     /4 ursprünlgich für eine Sekunde
                                                                         //SystemCoreClock ist eine Konstante mit dem Wert
 
     // set match register and enable interrupt    
-    LPC_TIM0->MR0 = period;                                             //Vergleichswert des Timers wird gesetzt mit Period
+    LPC_TIM0->MR0 = period/10000;                                             //Vergleichswert des Timers wird gesetzt mit Period
     LPC_TIM0->MCR |= 1 << 0;    // interrupt on match                   //Einstellung, dass ein Interrupt ausgelöst wird beim Match
     LPC_TIM0->MCR |= 1 << 1;    // reset on match                       //Einstellung, dass der Timerwert auf Null zurückgesetzt wird bei Match
 
@@ -39,12 +62,60 @@
 
     // start the timer
     LPC_TIM0->TCR = 1;                                                  //Einstellung, dass der Timer gestartet wird
+    
+    Init_Filter();
 
     // hang around!   
-    while(1) {                                                          //while Schleife, in der die erste LED getoggelt wird
+    while(1) {    
+    
+       lcd.cls();
+       lcd.locate(0,0);
+       lcd.printf("%d",poti_f);                                                       //while Schleife, in der die erste LED getoggelt wird
+        
         myled = 1;
         wait(0.2);
         myled = 0;
         wait(0.2);
     }
-}
\ No newline at end of file
+}
+
+void Init_Filter(){
+    // ***** Initialisierung am Anfang der Main-Routine
+// füer gleitende Mittelwertbildung:
+
+            a[  0]=  0.1;
+            a[  1]=  0.1;
+            a[  2]=  0.1;
+            a[  3]=  0.1;
+            a[  4]=  0.1;
+            a[  5]=  0.1;
+            a[  6]=  0.1;
+            a[  7]=  0.1;
+            a[  8]=  0.1;
+            a[  9]=  0.1;
+
+  for (PZ=1 ; PZ<=n ; PZ=PZ+1) p[PZ]=0; //Speicher loeschen
+  PZ = 1;           // erstes Ringpufferelement definieren
+    
+    }
+
+float FIR(float x){
+    
+//********* Beginn des Digitalfilters, Eingang ist x *******
+       
+    
+  y = a[0]*x;           // Aktuellen Messwert mit Koeff. multipliz.
+  for (PA=1 ; PA<=n ; PA = PA+1) // PA rotiert rechts herum von 1 bis n
+      {
+      y = y + a[PA]*p[PZ];  // Teilprodukte aufsummieren
+      if (PZ<=1) PZ = n; else PZ = PZ -1;   // PZ rotiert links herum
+      }
+  if (PZ<n) PZ = PZ +1; else PZ = 1; // PZ weiter fuer naechsten Messwert
+  p[PZ] = x;           // Aktuellen Messwert in Ringpuffer einschieben
+  
+  return y;
+    //mypin = 0; // FIR dauert 12 µs
+//********* Ende des Digitalfilters, Ausgang ist y *********
+    
+    
+    }
\ No newline at end of file