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:
Thu Oct 23 00:12:36 2014 +0000
Revision:
4:063b26cc467a
Parent:
2:8cbfd28344db
Child:
5:fd3e47335bfa
5

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 4:063b26cc467a 6 // 2014/10/23, 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 2:8cbfd28344db 17 const int FS_ = 10000; // Sampling frequency: 10 kHz
MikamiUitOpen 4:063b26cc467a 18 ADC_Intr adc_(A0, FS_, A1, A2); // for AD
MikamiUitOpen 4:063b26cc467a 19 DAC_MCP4922 myDac_; // 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 }