Praktikum2_4_AMSL_v1
Dependencies: C12832_lcd mbed
Fork of TimerInterruptExample by
main.cpp@1:b6aa27661206, 2018-03-07 (annotated)
- Committer:
- slueke
- Date:
- Wed Mar 07 18:56:32 2018 +0000
- Revision:
- 1:b6aa27661206
- Parent:
- 0:a6ea53688962
Praktikum2_4_AMSL_v1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
simon | 0:a6ea53688962 | 1 | #include "mbed.h" |
slueke | 1:b6aa27661206 | 2 | #include "C12832_lcd.h" |
slueke | 1:b6aa27661206 | 3 | |
slueke | 1:b6aa27661206 | 4 | // Definitionen |
slueke | 1:b6aa27661206 | 5 | #define n 9 // n ist die Ordnung des Filters, |
slueke | 1:b6aa27661206 | 6 | // erfordert n+1 Koeffizienten |
slueke | 1:b6aa27661206 | 7 | int i; |
slueke | 1:b6aa27661206 | 8 | float x,y; // Eingang, Ausgang |
slueke | 1:b6aa27661206 | 9 | int PZ; // zeigt auf Ringpuffer p |
slueke | 1:b6aa27661206 | 10 | int PA; // zeigt auf Koeffizienten a,b |
slueke | 1:b6aa27661206 | 11 | float p[n+1]; // Ringpuffer mit n Speichern (n=0 unbenutzt) |
slueke | 1:b6aa27661206 | 12 | float a[n+1]; // Koeffizienten |
slueke | 1:b6aa27661206 | 13 | |
simon | 0:a6ea53688962 | 14 | |
simon | 0:a6ea53688962 | 15 | DigitalOut myled(LED1); |
slueke | 1:b6aa27661206 | 16 | DigitalOut mypin(p21); |
slueke | 1:b6aa27661206 | 17 | C12832_LCD lcd; |
slueke | 1:b6aa27661206 | 18 | |
slueke | 1:b6aa27661206 | 19 | volatile uint16_t poti, poti_f; |
slueke | 1:b6aa27661206 | 20 | |
slueke | 1:b6aa27661206 | 21 | AnalogIn input(p19); |
slueke | 1:b6aa27661206 | 22 | void Init_Filter(); |
slueke | 1:b6aa27661206 | 23 | float FIR(float x); |
slueke | 1:b6aa27661206 | 24 | |
slueke | 1:b6aa27661206 | 25 | //--------------------------------------------------------------------- |
slueke | 1:b6aa27661206 | 26 | |
simon | 0:a6ea53688962 | 27 | |
simon | 0:a6ea53688962 | 28 | void myhandler() { |
slueke | 1:b6aa27661206 | 29 | mypin=1; |
slueke | 1:b6aa27661206 | 30 | |
simon | 0:a6ea53688962 | 31 | // do something! |
slueke | 1:b6aa27661206 | 32 | poti= input.read_u16(); |
slueke | 1:b6aa27661206 | 33 | |
slueke | 1:b6aa27661206 | 34 | poti_f=FIR(poti); |
slueke | 1:b6aa27661206 | 35 | mypin=0; |
slueke | 1:b6aa27661206 | 36 | |
simon | 0:a6ea53688962 | 37 | // clear the TIMER0 interrupt |
simon | 0:a6ea53688962 | 38 | LPC_TIM0->IR = 1; |
slueke | 1:b6aa27661206 | 39 | |
simon | 0:a6ea53688962 | 40 | } |
simon | 0:a6ea53688962 | 41 | |
simon | 0:a6ea53688962 | 42 | int main() { |
slueke | 1:b6aa27661206 | 43 | |
simon | 0:a6ea53688962 | 44 | // power up TIMER0 (PCONP[1]) |
simon | 0:a6ea53688962 | 45 | LPC_SC->PCONP |= 1 << 1; |
simon | 0:a6ea53688962 | 46 | |
simon | 0:a6ea53688962 | 47 | // reset and set TIMER0 to timer mode |
simon | 0:a6ea53688962 | 48 | LPC_TIM0->TCR = 0x2; |
simon | 0:a6ea53688962 | 49 | LPC_TIM0->CTCR = 0x0; |
simon | 0:a6ea53688962 | 50 | |
simon | 0:a6ea53688962 | 51 | // set no prescaler |
simon | 0:a6ea53688962 | 52 | LPC_TIM0->PR = 0; |
simon | 0:a6ea53688962 | 53 | |
simon | 0:a6ea53688962 | 54 | // calculate period (1 interrupt every second) |
simon | 0:a6ea53688962 | 55 | uint32_t period = SystemCoreClock / 4; |
simon | 0:a6ea53688962 | 56 | |
simon | 0:a6ea53688962 | 57 | // set match register and enable interrupt |
slueke | 1:b6aa27661206 | 58 | LPC_TIM0->MR0 = period/10000; |
simon | 0:a6ea53688962 | 59 | LPC_TIM0->MCR |= 1 << 0; // interrupt on match |
simon | 0:a6ea53688962 | 60 | LPC_TIM0->MCR |= 1 << 1; // reset on match |
simon | 0:a6ea53688962 | 61 | |
simon | 0:a6ea53688962 | 62 | // enable the vector in the interrupt controller |
simon | 0:a6ea53688962 | 63 | NVIC_SetVector(TIMER0_IRQn, (uint32_t)&myhandler); |
simon | 0:a6ea53688962 | 64 | NVIC_EnableIRQ(TIMER0_IRQn); |
simon | 0:a6ea53688962 | 65 | |
simon | 0:a6ea53688962 | 66 | // start the timer |
simon | 0:a6ea53688962 | 67 | LPC_TIM0->TCR = 1; |
simon | 0:a6ea53688962 | 68 | |
slueke | 1:b6aa27661206 | 69 | Init_Filter(); |
slueke | 1:b6aa27661206 | 70 | |
simon | 0:a6ea53688962 | 71 | // hang around! |
simon | 0:a6ea53688962 | 72 | while(1) { |
slueke | 1:b6aa27661206 | 73 | lcd.cls(); |
slueke | 1:b6aa27661206 | 74 | lcd.locate(0,0); |
slueke | 1:b6aa27661206 | 75 | lcd.printf("%f",poti); |
slueke | 1:b6aa27661206 | 76 | |
slueke | 1:b6aa27661206 | 77 | wait(0.2); |
slueke | 1:b6aa27661206 | 78 | myled = 0; |
slueke | 1:b6aa27661206 | 79 | wait(0.2); |
slueke | 1:b6aa27661206 | 80 | |
simon | 0:a6ea53688962 | 81 | } |
simon | 0:a6ea53688962 | 82 | } |
slueke | 1:b6aa27661206 | 83 | void Init_Filter(){ |
slueke | 1:b6aa27661206 | 84 | // ***** Initialisierung am Anfang der Main-Routine |
slueke | 1:b6aa27661206 | 85 | // füer gleitende Mittelwertbildung: |
slueke | 1:b6aa27661206 | 86 | |
slueke | 1:b6aa27661206 | 87 | a[ 0]= 0.1; |
slueke | 1:b6aa27661206 | 88 | a[ 1]= 0.1; |
slueke | 1:b6aa27661206 | 89 | a[ 2]= 0.1; |
slueke | 1:b6aa27661206 | 90 | a[ 3]= 0.1; |
slueke | 1:b6aa27661206 | 91 | a[ 4]= 0.1; |
slueke | 1:b6aa27661206 | 92 | a[ 5]= 0.1; |
slueke | 1:b6aa27661206 | 93 | a[ 6]= 0.1; |
slueke | 1:b6aa27661206 | 94 | a[ 7]= 0.1; |
slueke | 1:b6aa27661206 | 95 | a[ 8]= 0.1; |
slueke | 1:b6aa27661206 | 96 | a[ 9]= 0.1; |
slueke | 1:b6aa27661206 | 97 | |
slueke | 1:b6aa27661206 | 98 | for (PZ=1 ; PZ<=n ; PZ=PZ+1) p[PZ]=0; //Speicher loeschen |
slueke | 1:b6aa27661206 | 99 | PZ = 1; // erstes Ringpufferelement definieren |
slueke | 1:b6aa27661206 | 100 | |
slueke | 1:b6aa27661206 | 101 | } |
slueke | 1:b6aa27661206 | 102 | |
slueke | 1:b6aa27661206 | 103 | float FIR(float x){ |
slueke | 1:b6aa27661206 | 104 | |
slueke | 1:b6aa27661206 | 105 | //********* Beginn des Digitalfilters, Eingang ist x ******* |
slueke | 1:b6aa27661206 | 106 | |
slueke | 1:b6aa27661206 | 107 | |
slueke | 1:b6aa27661206 | 108 | y = a[0]*x; // Aktuellen Messwert mit Koeff. multipliz. |
slueke | 1:b6aa27661206 | 109 | for (PA=1 ; PA<=n ; PA = PA+1) // PA rotiert rechts herum von 1 bis n |
slueke | 1:b6aa27661206 | 110 | { |
slueke | 1:b6aa27661206 | 111 | y = y + a[PA]*p[PZ]; // Teilprodukte aufsummieren |
slueke | 1:b6aa27661206 | 112 | if (PZ<=1) PZ = n; else PZ = PZ -1; // PZ rotiert links herum |
slueke | 1:b6aa27661206 | 113 | } |
slueke | 1:b6aa27661206 | 114 | if (PZ<n) PZ = PZ +1; else PZ = 1; // PZ weiter fuer naechsten Messwert |
slueke | 1:b6aa27661206 | 115 | p[PZ] = x; // Aktuellen Messwert in Ringpuffer einschieben |
slueke | 1:b6aa27661206 | 116 | |
slueke | 1:b6aa27661206 | 117 | return y; |
slueke | 1:b6aa27661206 | 118 | //mypin = 0; // FIR dauert 12 µs |
slueke | 1:b6aa27661206 | 119 | //********* Ende des Digitalfilters, Ausgang ist y ********* |
slueke | 1:b6aa27661206 | 120 | |
slueke | 1:b6aa27661206 | 121 | |
slueke | 1:b6aa27661206 | 122 | } |