Class library for internal ADC and DAC connected by SPI. ADC is triggered by TIM2. This library support clock generator using TIM3 for switched-capacitor filter to smooth output signal of DAC. This library includes derivative class to support interrupt occured in end of AD conversion. Slave select of SPI for DAC is generated using TIM4. Validated for ST Nucleo F401RE, F411RE. New version. 内蔵 ADC と,SPI 接続の DAC のためのクラスライブラリ.ADC の変換開始トリガは TIM2 で発生.DAC の出力信号を平滑化するためのスイッチトキャパシタフィルタ用のクロックは TIM3 を使用.DAC の SPI 用スレーブ選択信号は TIM4 で発生.ST Nucleo F401RE,F411RE で動作を確認.新バージョン

Dependents:   UIT2_MovingAverage UIT2_AllpassReverb UIT2_CombReverb UIT2_FIR_LPF_Symmetry ... more

Committer:
MikamiUitOpen
Date:
Mon Feb 02 23:33:01 2015 +0000
Revision:
21:3731753ebf24
Parent:
15:ab7eb29b69ea
22

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:6e0ed5adfe47 1 //------------------------------------------------------
MikamiUitOpen 0:6e0ed5adfe47 2 // Class for ADC using TIM2 trigger -- Header
MikamiUitOpen 9:72fe42a4323c 3 //
MikamiUitOpen 15:ab7eb29b69ea 4 // 2014/12/31, Copyright (c) 2014 MIKAMI, Naoki
MikamiUitOpen 0:6e0ed5adfe47 5 //------------------------------------------------------
MikamiUitOpen 0:6e0ed5adfe47 6
MikamiUitOpen 0:6e0ed5adfe47 7 #ifndef ADC_BASE_HPP
MikamiUitOpen 0:6e0ed5adfe47 8 #define ADC_BASE_HPP
MikamiUitOpen 0:6e0ed5adfe47 9
MikamiUitOpen 0:6e0ed5adfe47 10 #include "mbed.h"
MikamiUitOpen 0:6e0ed5adfe47 11
MikamiUitOpen 0:6e0ed5adfe47 12 namespace Mikami
MikamiUitOpen 0:6e0ed5adfe47 13 {
MikamiUitOpen 0:6e0ed5adfe47 14 class ADC_Base
MikamiUitOpen 0:6e0ed5adfe47 15 {
MikamiUitOpen 0:6e0ed5adfe47 16 private:
MikamiUitOpen 7:6a9c1633dd90 17 // Following object of AnalogIn class will be
MikamiUitOpen 7:6a9c1633dd90 18 // initialized by menber initializer
MikamiUitOpen 0:6e0ed5adfe47 19 AnalogIn adc_;
MikamiUitOpen 7:6a9c1633dd90 20 // Following two objects of AnalogIn class will be
MikamiUitOpen 15:ab7eb29b69ea 21 // initailized by regular executable statements
MikamiUitOpen 0:6e0ed5adfe47 22 AnalogIn* adc2_;
MikamiUitOpen 0:6e0ed5adfe47 23 AnalogIn* adc3_;
MikamiUitOpen 13:f2b8af192558 24
MikamiUitOpen 13:f2b8af192558 25 // Channel of ADC1
MikamiUitOpen 13:f2b8af192558 26 uint8_t ch1_, ch2_, ch3_;
MikamiUitOpen 0:6e0ed5adfe47 27
MikamiUitOpen 0:6e0ed5adfe47 28 // Set timer to generate sampling pulse for ADC
MikamiUitOpen 0:6e0ed5adfe47 29 void SetTim2(int frequency);
MikamiUitOpen 0:6e0ed5adfe47 30
MikamiUitOpen 13:f2b8af192558 31 // Exctract channel number
MikamiUitOpen 15:ab7eb29b69ea 32 uint8_t GetChannelNumber(PinName);
MikamiUitOpen 13:f2b8af192558 33
MikamiUitOpen 0:6e0ed5adfe47 34 // for inhibition of copy constructor
MikamiUitOpen 0:6e0ed5adfe47 35 ADC_Base(const ADC_Base&);
MikamiUitOpen 0:6e0ed5adfe47 36 // for inhibition of substitute operator
MikamiUitOpen 0:6e0ed5adfe47 37 ADC_Base& operator=(const ADC_Base&);
MikamiUitOpen 0:6e0ed5adfe47 38
MikamiUitOpen 0:6e0ed5adfe47 39 protected:
MikamiUitOpen 0:6e0ed5adfe47 40 // for normalize
MikamiUitOpen 0:6e0ed5adfe47 41 static const float AMP_ = 1.0f/2048.0f;
MikamiUitOpen 0:6e0ed5adfe47 42
MikamiUitOpen 8:f933fcd30408 43 ADC_TypeDef* const myAdc_;
MikamiUitOpen 8:f933fcd30408 44
MikamiUitOpen 0:6e0ed5adfe47 45 // Wait until completion of AD conversion
MikamiUitOpen 0:6e0ed5adfe47 46 void WaitDone()
MikamiUitOpen 0:6e0ed5adfe47 47 { while((myAdc_->SR & ADC_SR_EOC) == RESET); }
MikamiUitOpen 0:6e0ed5adfe47 48
MikamiUitOpen 0:6e0ed5adfe47 49 public:
MikamiUitOpen 13:f2b8af192558 50
MikamiUitOpen 0:6e0ed5adfe47 51 // Constructor
MikamiUitOpen 0:6e0ed5adfe47 52 // pin1: Pin Name for input as A0, A1, etc.
MikamiUitOpen 0:6e0ed5adfe47 53 // frequency: Sampling frequency
MikamiUitOpen 0:6e0ed5adfe47 54 // pin2: If use 2nd channel set this parameter
MikamiUitOpen 0:6e0ed5adfe47 55 // pin3: If use 3rd channel set this parameter
MikamiUitOpen 0:6e0ed5adfe47 56 ADC_Base(PinName pin1, int frequency,
MikamiUitOpen 0:6e0ed5adfe47 57 PinName pin2 = NC, PinName pin3 = NC);
MikamiUitOpen 0:6e0ed5adfe47 58
MikamiUitOpen 0:6e0ed5adfe47 59 // Read ADC with waiting, range: [0, 0x0FFF]
MikamiUitOpen 0:6e0ed5adfe47 60 virtual uint16_t Read_u16()
MikamiUitOpen 0:6e0ed5adfe47 61 {
MikamiUitOpen 0:6e0ed5adfe47 62 WaitDone();
MikamiUitOpen 0:6e0ed5adfe47 63 return myAdc_->DR;
MikamiUitOpen 0:6e0ed5adfe47 64 }
MikamiUitOpen 0:6e0ed5adfe47 65
MikamiUitOpen 0:6e0ed5adfe47 66 // Read ADC with waiting, range: [-1.0f, 1.0f]
MikamiUitOpen 0:6e0ed5adfe47 67 virtual float Read()
MikamiUitOpen 0:6e0ed5adfe47 68 {
MikamiUitOpen 0:6e0ed5adfe47 69 WaitDone();
MikamiUitOpen 0:6e0ed5adfe47 70 return AMP_*((int16_t)myAdc_->DR - 2048);
MikamiUitOpen 0:6e0ed5adfe47 71 }
MikamiUitOpen 0:6e0ed5adfe47 72
MikamiUitOpen 0:6e0ed5adfe47 73 // Select channel
MikamiUitOpen 13:f2b8af192558 74 void Select1stChannel() { myAdc_->SQR3 = ch1_; }
MikamiUitOpen 13:f2b8af192558 75 void Select2ndChannel() { myAdc_->SQR3 = ch2_; }
MikamiUitOpen 13:f2b8af192558 76 void Select3rdChannel() { myAdc_->SQR3 = ch3_; }
MikamiUitOpen 0:6e0ed5adfe47 77
MikamiUitOpen 0:6e0ed5adfe47 78 // Software start
MikamiUitOpen 0:6e0ed5adfe47 79 virtual void SoftStart()
MikamiUitOpen 0:6e0ed5adfe47 80 { myAdc_->CR2 |= ADC_CR2_SWSTART; }
MikamiUitOpen 0:6e0ed5adfe47 81
MikamiUitOpen 0:6e0ed5adfe47 82 uint32_t ReadSQR3() { return myAdc_->SQR3; }
MikamiUitOpen 0:6e0ed5adfe47 83 };
MikamiUitOpen 0:6e0ed5adfe47 84 }
MikamiUitOpen 0:6e0ed5adfe47 85 #endif // ADC_BASE_HPP