Prototype program of AD and DA using classes in UIT_ADDA. This program uses interrupt of ADC. Second channnel input is used to control volume of output for ST Nucleo F401RE. UIT_ADDA のクラスを使った AD および DA のためのプログラムの雛形.ADC の割り込みを使うバージョン.2番目のチャンネルの ADC の入力は,出力信号の大きさをコントロールするために使う.ST Nucleo F401 用.

Dependencies:   UIT_ACM1602NI UIT_ADDA mbed

Committer:
MikamiUitOpen
Date:
Mon Oct 20 08:01:48 2014 +0000
Revision:
1:43a38eaed0fc
Parent:
0:494ae18d3b30
Child:
2:8cbfd28344db
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:494ae18d3b30 1 //--------------------------------------------------------------
MikamiUitOpen 1:43a38eaed0fc 2 // 割り込みを使って AD DA を行う場合の雛形2(入力:2 チャンネル)
MikamiUitOpen 0:494ae18d3b30 3 // Analog Input : A0
MikamiUitOpen 0:494ae18d3b30 4 // Analog Output: MCP4922 using SPI
MikamiUitOpen 1:43a38eaed0fc 5 // A2: used for control volume of output
MikamiUitOpen 0:494ae18d3b30 6 // 2014/10/20, Copyright (c) 2014 MIKAMI, Naoki
MikamiUitOpen 0:494ae18d3b30 7 //--------------------------------------------------------------
MikamiUitOpen 0:494ae18d3b30 8
MikamiUitOpen 0:494ae18d3b30 9 #include "mbed.h"
MikamiUitOpen 0:494ae18d3b30 10
MikamiUitOpen 0:494ae18d3b30 11 #include "ADC_Interrupt.hpp" // for ADC using interrupt
MikamiUitOpen 0:494ae18d3b30 12 #include "DAC_MCP4922.hpp" // for DAC MCP4922
MikamiUitOpen 0:494ae18d3b30 13 #include "ScfClockTim3.hpp" // for clock supplied to SCF
MikamiUitOpen 0:494ae18d3b30 14
MikamiUitOpen 0:494ae18d3b30 15 using namespace Mikami;
MikamiUitOpen 0:494ae18d3b30 16
MikamiUitOpen 0:494ae18d3b30 17 const int FS_ = 10000; // Sampling frequency: 24 kHz
MikamiUitOpen 0:494ae18d3b30 18 ADC_Intr adc_(A0, FS_, A1, A2); // for AD
MikamiUitOpen 0:494ae18d3b30 19 DAC_MCP4922 myDac_(DAC_MCP4922::DAC_A); // for DA
MikamiUitOpen 0:494ae18d3b30 20
MikamiUitOpen 0:494ae18d3b30 21 uint16_t a2_ = 0;
MikamiUitOpen 0:494ae18d3b30 22 uint16_t a21_ = 0;
MikamiUitOpen 0:494ae18d3b30 23 float vol_ = 1.0f;
MikamiUitOpen 0:494ae18d3b30 24
MikamiUitOpen 0:494ae18d3b30 25 // Interrupt service routine for ADC
MikamiUitOpen 0:494ae18d3b30 26 void AdcIsr()
MikamiUitOpen 0:494ae18d3b30 27 {
MikamiUitOpen 0:494ae18d3b30 28 float xn = adc_.Read(); // Read from A0
MikamiUitOpen 0:494ae18d3b30 29
MikamiUitOpen 0:494ae18d3b30 30 adc_.Select3rdChannel(); // Enable A2
MikamiUitOpen 0:494ae18d3b30 31 adc_.SoftStart(); // ADC start for A2 input
MikamiUitOpen 0:494ae18d3b30 32
MikamiUitOpen 0:494ae18d3b30 33 float yn = vol_*xn; // Volume control by VR
MikamiUitOpen 0:494ae18d3b30 34 myDac_.Write(yn); // to DAC
MikamiUitOpen 0:494ae18d3b30 35
MikamiUitOpen 0:494ae18d3b30 36 // Read value which controls volume
MikamiUitOpen 0:494ae18d3b30 37 a2_ = adc_.ReadWait_u16();
MikamiUitOpen 0:494ae18d3b30 38
MikamiUitOpen 0:494ae18d3b30 39 adc_.Select1stChannel(); // Enable A0
MikamiUitOpen 0:494ae18d3b30 40 adc_.ClearPending_EnableIRQ(); // Clear pending interrupt
MikamiUitOpen 0:494ae18d3b30 41 }
MikamiUitOpen 0:494ae18d3b30 42
MikamiUitOpen 0:494ae18d3b30 43 int main()
MikamiUitOpen 0:494ae18d3b30 44 {
MikamiUitOpen 0:494ae18d3b30 45 ScfClockTim3(420000); // cutoff frequency: 4.2 kHz
MikamiUitOpen 0:494ae18d3b30 46 adc_.SetIntrVec(AdcIsr); // Assign ISR for ADC interrupt
MikamiUitOpen 0:494ae18d3b30 47
MikamiUitOpen 0:494ae18d3b30 48 while (true)
MikamiUitOpen 0:494ae18d3b30 49 {
MikamiUitOpen 0:494ae18d3b30 50 if (abs(a2_ - a21_) > 10)
MikamiUitOpen 0:494ae18d3b30 51 {
MikamiUitOpen 0:494ae18d3b30 52 vol_ = ((float)a2_)/4095.0f;
MikamiUitOpen 0:494ae18d3b30 53 a21_ = a2_;
MikamiUitOpen 0:494ae18d3b30 54 }
MikamiUitOpen 0:494ae18d3b30 55 wait(0.1f);
MikamiUitOpen 0:494ae18d3b30 56 }
MikamiUitOpen 0:494ae18d3b30 57 }