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:
Thu Oct 30 00:38:14 2014 +0000
Revision:
0:b26f86125165
Child:
2:a19243a20882
0

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 0:b26f86125165 6 // 2014/10/30, 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 #include "ScfClockTim3.hpp" // for clock supplied to SCF
MikamiUitOpen 0:b26f86125165 14
MikamiUitOpen 0:b26f86125165 15 using namespace Mikami;
MikamiUitOpen 0:b26f86125165 16
MikamiUitOpen 0:b26f86125165 17 const int FS_ = 12000; // Sampling frequency: 12 kHz
MikamiUitOpen 0:b26f86125165 18 ADC_Intr adc_(A0, FS_); // for AD using interrupt
MikamiUitOpen 0:b26f86125165 19 DAC_MCP4922 myDac_; // for DA
MikamiUitOpen 0:b26f86125165 20
MikamiUitOpen 0:b26f86125165 21 DigitalIn sw1_(D2, PullDown);
MikamiUitOpen 0:b26f86125165 22 DigitalIn sw2_(D3, PullDown);
MikamiUitOpen 0:b26f86125165 23 DigitalIn sw4_(D4, PullDown);
MikamiUitOpen 0:b26f86125165 24 DigitalIn sw8_(D5, PullDown);
MikamiUitOpen 0:b26f86125165 25
MikamiUitOpen 0:b26f86125165 26 const int M_ = 64; // Maximum of average count
MikamiUitOpen 0:b26f86125165 27 float xn_[M_];
MikamiUitOpen 0:b26f86125165 28 volatile int nAv_; // "volatile": to make sure
MikamiUitOpen 0:b26f86125165 29
MikamiUitOpen 0:b26f86125165 30 // Interrupt service routine for ADC
MikamiUitOpen 0:b26f86125165 31 void AdcIsr()
MikamiUitOpen 0:b26f86125165 32 {
MikamiUitOpen 0:b26f86125165 33 xn_[0] = adc_.Read(); // Read from A0
MikamiUitOpen 0:b26f86125165 34 //-----------------------------------------------
MikamiUitOpen 0:b26f86125165 35
MikamiUitOpen 0:b26f86125165 36 float yn = 0;
MikamiUitOpen 0:b26f86125165 37 for (int k=0; k<nAv_; k++) yn = yn + xn_[k];
MikamiUitOpen 0:b26f86125165 38 yn = yn/(float)nAv_; // yn: average
MikamiUitOpen 0:b26f86125165 39
MikamiUitOpen 0:b26f86125165 40 // Update input buffer
MikamiUitOpen 0:b26f86125165 41 for (int k = nAv_-1; k>0; k--)
MikamiUitOpen 0:b26f86125165 42 xn_[k] = xn_[k-1];
MikamiUitOpen 0:b26f86125165 43
MikamiUitOpen 0:b26f86125165 44 //-----------------------------------------------
MikamiUitOpen 0:b26f86125165 45 myDac_.Write(yn); // Write to DAC
MikamiUitOpen 0:b26f86125165 46 }
MikamiUitOpen 0:b26f86125165 47
MikamiUitOpen 0:b26f86125165 48 int main()
MikamiUitOpen 0:b26f86125165 49 {
MikamiUitOpen 0:b26f86125165 50 ScfClockTim3(500000); // cutoff frequency: 5 kHz
MikamiUitOpen 0:b26f86125165 51 adc_.SetIntrVec(AdcIsr); // Assign ISR for ADC interrupt
MikamiUitOpen 0:b26f86125165 52
MikamiUitOpen 0:b26f86125165 53 for (int n=0; n<M_; n++) xn_[n] = 0;
MikamiUitOpen 0:b26f86125165 54
MikamiUitOpen 0:b26f86125165 55 while (true)
MikamiUitOpen 0:b26f86125165 56 {
MikamiUitOpen 0:b26f86125165 57 int sw = (sw8_ << 3) | (sw4_ << 2) | (sw2_ << 1) | sw1_;
MikamiUitOpen 0:b26f86125165 58 nAv_ = 1 << sw;
MikamiUitOpen 0:b26f86125165 59 if (nAv_ > 64) nAv_ = 64;
MikamiUitOpen 0:b26f86125165 60 printf("\r\nnAv = %d, sw = %d", nAv_, sw);
MikamiUitOpen 0:b26f86125165 61
MikamiUitOpen 0:b26f86125165 62 wait(0.5f);
MikamiUitOpen 0:b26f86125165 63 }
MikamiUitOpen 0:b26f86125165 64 }