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:
Wed Nov 12 10:36:56 2014 +0000
Revision:
2:a19243a20882
Parent:
0:b26f86125165
Child:
4:7635c95836a0
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:b26f86125165 1 //--------------------------------------------------------------
MikamiUitOpen 0:b26f86125165 2 // 移動平均, 平均数:1, 2, 4, 8, 16, 32, 64:スイッチで選択
MikamiUitOpen 0:b26f86125165 3 // スイッチの状態を printf() で表示する
MikamiUitOpen 0:b26f86125165 4 // Analog Input : A0
MikamiUitOpen 0:b26f86125165 5 // Analog Output: MCP4922 using SPI
MikamiUitOpen 2:a19243a20882 6 // 2014/11/12, Copyright (c) 2014 MIKAMI, Naoki
MikamiUitOpen 0:b26f86125165 7 //--------------------------------------------------------------
MikamiUitOpen 0:b26f86125165 8
MikamiUitOpen 0:b26f86125165 9 #include "mbed.h"
MikamiUitOpen 0:b26f86125165 10
MikamiUitOpen 0:b26f86125165 11 #include "ADC_Interrupt.hpp" // for ADC using interrupt
MikamiUitOpen 0:b26f86125165 12 #include "DAC_MCP4922.hpp" // for DAC MCP4922
MikamiUitOpen 0:b26f86125165 13
MikamiUitOpen 0:b26f86125165 14 using namespace Mikami;
MikamiUitOpen 0:b26f86125165 15
MikamiUitOpen 0:b26f86125165 16 const int FS_ = 12000; // Sampling frequency: 12 kHz
MikamiUitOpen 0:b26f86125165 17 ADC_Intr adc_(A0, FS_); // for AD using interrupt
MikamiUitOpen 0:b26f86125165 18 DAC_MCP4922 myDac_; // for DA
MikamiUitOpen 0:b26f86125165 19
MikamiUitOpen 0:b26f86125165 20 DigitalIn sw1_(D2, PullDown);
MikamiUitOpen 0:b26f86125165 21 DigitalIn sw2_(D3, PullDown);
MikamiUitOpen 0:b26f86125165 22 DigitalIn sw4_(D4, PullDown);
MikamiUitOpen 0:b26f86125165 23 DigitalIn sw8_(D5, PullDown);
MikamiUitOpen 0:b26f86125165 24
MikamiUitOpen 0:b26f86125165 25 const int M_ = 64; // Maximum of average count
MikamiUitOpen 0:b26f86125165 26 float xn_[M_];
MikamiUitOpen 0:b26f86125165 27 volatile int nAv_; // "volatile": to make sure
MikamiUitOpen 0:b26f86125165 28
MikamiUitOpen 0:b26f86125165 29 // Interrupt service routine for ADC
MikamiUitOpen 0:b26f86125165 30 void AdcIsr()
MikamiUitOpen 0:b26f86125165 31 {
MikamiUitOpen 0:b26f86125165 32 xn_[0] = adc_.Read(); // Read from A0
MikamiUitOpen 0:b26f86125165 33 //-----------------------------------------------
MikamiUitOpen 0:b26f86125165 34
MikamiUitOpen 0:b26f86125165 35 float yn = 0;
MikamiUitOpen 0:b26f86125165 36 for (int k=0; k<nAv_; k++) yn = yn + xn_[k];
MikamiUitOpen 0:b26f86125165 37 yn = yn/(float)nAv_; // yn: average
MikamiUitOpen 0:b26f86125165 38
MikamiUitOpen 0:b26f86125165 39 // Update input buffer
MikamiUitOpen 0:b26f86125165 40 for (int k = nAv_-1; k>0; k--)
MikamiUitOpen 0:b26f86125165 41 xn_[k] = xn_[k-1];
MikamiUitOpen 0:b26f86125165 42
MikamiUitOpen 0:b26f86125165 43 //-----------------------------------------------
MikamiUitOpen 0:b26f86125165 44 myDac_.Write(yn); // Write to DAC
MikamiUitOpen 0:b26f86125165 45 }
MikamiUitOpen 0:b26f86125165 46
MikamiUitOpen 0:b26f86125165 47 int main()
MikamiUitOpen 0:b26f86125165 48 {
MikamiUitOpen 2:a19243a20882 49 myDac_.ScfClockTim3(500000); // cutoff frequency: 5 kHz
MikamiUitOpen 0:b26f86125165 50 adc_.SetIntrVec(AdcIsr); // Assign ISR for ADC interrupt
MikamiUitOpen 0:b26f86125165 51
MikamiUitOpen 0:b26f86125165 52 for (int n=0; n<M_; n++) xn_[n] = 0;
MikamiUitOpen 0:b26f86125165 53
MikamiUitOpen 0:b26f86125165 54 while (true)
MikamiUitOpen 0:b26f86125165 55 {
MikamiUitOpen 0:b26f86125165 56 int sw = (sw8_ << 3) | (sw4_ << 2) | (sw2_ << 1) | sw1_;
MikamiUitOpen 0:b26f86125165 57 nAv_ = 1 << sw;
MikamiUitOpen 0:b26f86125165 58 if (nAv_ > 64) nAv_ = 64;
MikamiUitOpen 0:b26f86125165 59 printf("\r\nnAv = %d, sw = %d", nAv_, sw);
MikamiUitOpen 0:b26f86125165 60
MikamiUitOpen 0:b26f86125165 61 wait(0.5f);
MikamiUitOpen 0:b26f86125165 62 }
MikamiUitOpen 0:b26f86125165 63 }