Moving average using interrupt for ST Nucleo F401RE. The number of average is controled by sw. This program displays the number of average on LCD device connected by I2C.

Dependencies:   UITDSP_ADDA mbed UIT_ACM1602NI UIT_AQM1602

Committer:
MikamiUitOpen
Date:
Sat Jul 25 05:31:40 2015 +0000
Revision:
5:19e433ec0a20
Parent:
4:7635c95836a0
6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:b26f86125165 1 //--------------------------------------------------------------
MikamiUitOpen 4:7635c95836a0 2 // 移動平均, 平均数:1, 2, 4, 8, 16, 32, 64:スイッチで選択
MikamiUitOpen 4:7635c95836a0 3 // 平均するデータ数,スイッチの状態を LCD 表示器に表示する
MikamiUitOpen 4:7635c95836a0 4 //
MikamiUitOpen 0:b26f86125165 5 // Analog Input : A0
MikamiUitOpen 4:7635c95836a0 6 // Analog Output: MCP4921 or 4922 using SPI
MikamiUitOpen 5:19e433ec0a20 7 // 2015/07/25, Copyright (c) 2015 MIKAMI, Naoki
MikamiUitOpen 0:b26f86125165 8 //--------------------------------------------------------------
MikamiUitOpen 0:b26f86125165 9
MikamiUitOpen 0:b26f86125165 10 #include "mbed.h"
MikamiUitOpen 0:b26f86125165 11
MikamiUitOpen 0:b26f86125165 12 #include "ADC_Interrupt.hpp" // for ADC using interrupt
MikamiUitOpen 5:19e433ec0a20 13 #include "DAC_MCP4921.hpp" // for DAC MCP4921, MCP4922
MikamiUitOpen 0:b26f86125165 14
MikamiUitOpen 0:b26f86125165 15 using namespace Mikami;
MikamiUitOpen 0:b26f86125165 16
MikamiUitOpen 4:7635c95836a0 17 // ACM1602Ni を使う場合は次の define 文をコメントにすること
MikamiUitOpen 5:19e433ec0a20 18 #define AQM1602
MikamiUitOpen 0:b26f86125165 19
MikamiUitOpen 4:7635c95836a0 20 #ifdef AQM1602
MikamiUitOpen 4:7635c95836a0 21 #include "AQM1602.hpp"
MikamiUitOpen 4:7635c95836a0 22 Aqm1602 Lcd_;
MikamiUitOpen 4:7635c95836a0 23 #else
MikamiUitOpen 4:7635c95836a0 24 #include "ACM1602NI.hpp"
MikamiUitOpen 4:7635c95836a0 25 Acm1602Ni Lcd_;
MikamiUitOpen 4:7635c95836a0 26 #endif
MikamiUitOpen 4:7635c95836a0 27
MikamiUitOpen 4:7635c95836a0 28 const int FS_ = 12000; // Sampling frequency: 12 kHz
MikamiUitOpen 4:7635c95836a0 29 ADC_Intr adc_(A0, FS_); // for AD using interrupt
MikamiUitOpen 5:19e433ec0a20 30 DAC_MCP4921 myDac_; // for DA
MikamiUitOpen 4:7635c95836a0 31
MikamiUitOpen 4:7635c95836a0 32 BusIn sw_(D2, D3, D4, D5); // for switch
MikamiUitOpen 0:b26f86125165 33
MikamiUitOpen 0:b26f86125165 34 const int M_ = 64; // Maximum of average count
MikamiUitOpen 0:b26f86125165 35 float xn_[M_];
MikamiUitOpen 0:b26f86125165 36 volatile int nAv_; // "volatile": to make sure
MikamiUitOpen 0:b26f86125165 37
MikamiUitOpen 0:b26f86125165 38 // Interrupt service routine for ADC
MikamiUitOpen 0:b26f86125165 39 void AdcIsr()
MikamiUitOpen 0:b26f86125165 40 {
MikamiUitOpen 0:b26f86125165 41 xn_[0] = adc_.Read(); // Read from A0
MikamiUitOpen 0:b26f86125165 42 //-----------------------------------------------
MikamiUitOpen 0:b26f86125165 43
MikamiUitOpen 0:b26f86125165 44 float yn = 0;
MikamiUitOpen 0:b26f86125165 45 for (int k=0; k<nAv_; k++) yn = yn + xn_[k];
MikamiUitOpen 0:b26f86125165 46 yn = yn/(float)nAv_; // yn: average
MikamiUitOpen 0:b26f86125165 47
MikamiUitOpen 0:b26f86125165 48 // Update input buffer
MikamiUitOpen 0:b26f86125165 49 for (int k = nAv_-1; k>0; k--)
MikamiUitOpen 0:b26f86125165 50 xn_[k] = xn_[k-1];
MikamiUitOpen 0:b26f86125165 51
MikamiUitOpen 0:b26f86125165 52 //-----------------------------------------------
MikamiUitOpen 0:b26f86125165 53 myDac_.Write(yn); // Write to DAC
MikamiUitOpen 0:b26f86125165 54 }
MikamiUitOpen 0:b26f86125165 55
MikamiUitOpen 0:b26f86125165 56 int main()
MikamiUitOpen 0:b26f86125165 57 {
MikamiUitOpen 2:a19243a20882 58 myDac_.ScfClockTim3(500000); // cutoff frequency: 5 kHz
MikamiUitOpen 4:7635c95836a0 59 sw_.mode(PullDown);
MikamiUitOpen 4:7635c95836a0 60 Lcd_.Clear();
MikamiUitOpen 4:7635c95836a0 61 adc_.SetIntrVec(AdcIsr); // Assign ISR for ADC interrupt
MikamiUitOpen 0:b26f86125165 62
MikamiUitOpen 0:b26f86125165 63 for (int n=0; n<M_; n++) xn_[n] = 0;
MikamiUitOpen 0:b26f86125165 64
MikamiUitOpen 0:b26f86125165 65 while (true)
MikamiUitOpen 0:b26f86125165 66 {
MikamiUitOpen 4:7635c95836a0 67 int sw = sw_.read();
MikamiUitOpen 0:b26f86125165 68 nAv_ = 1 << sw;
MikamiUitOpen 0:b26f86125165 69 if (nAv_ > 64) nAv_ = 64;
MikamiUitOpen 0:b26f86125165 70 printf("\r\nnAv = %d, sw = %d", nAv_, sw);
MikamiUitOpen 4:7635c95836a0 71 char str[17];
MikamiUitOpen 4:7635c95836a0 72 sprintf(str, "nAv : %2d", nAv_);
MikamiUitOpen 4:7635c95836a0 73 Lcd_.WriteStringXY(str, 0, 0);
MikamiUitOpen 4:7635c95836a0 74 sprintf(str, "sw : %2d", sw);
MikamiUitOpen 4:7635c95836a0 75 Lcd_.WriteStringXY(str, 0, 1);
MikamiUitOpen 0:b26f86125165 76
MikamiUitOpen 0:b26f86125165 77 wait(0.5f);
MikamiUitOpen 0:b26f86125165 78 }
MikamiUitOpen 0:b26f86125165 79 }