Added one channel mode
Dependents: CW_Decoder_using_FFT_on_F446
Fork of F446_AD_DA by
F446_DAC.hpp@0:c945b4fe9a48, 2016-11-11 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Fri Nov 11 06:28:48 2016 +0000
- Revision:
- 0:c945b4fe9a48
- Child:
- 1:6b9f2af6613d
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:c945b4fe9a48 | 1 | //-------------------------------------------------------- |
MikamiUitOpen | 0:c945b4fe9a48 | 2 | // Class for buit-in dual DAC on STM32F446 ---- Header |
MikamiUitOpen | 0:c945b4fe9a48 | 3 | // TIM3 is used for clock to external SCF |
MikamiUitOpen | 0:c945b4fe9a48 | 4 | // |
MikamiUitOpen | 0:c945b4fe9a48 | 5 | // STM32F446 内蔵の DAC 用のクラス(ヘッダ) |
MikamiUitOpen | 0:c945b4fe9a48 | 6 | // TIM3 を外付けの SCF のクロックとして使用 |
MikamiUitOpen | 0:c945b4fe9a48 | 7 | // Analog Out1: A2 (PA_4) |
MikamiUitOpen | 0:c945b4fe9a48 | 8 | // Analog Out2: D13 (PA_5) |
MikamiUitOpen | 0:c945b4fe9a48 | 9 | // |
MikamiUitOpen | 0:c945b4fe9a48 | 10 | // 2016/11/11, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 0:c945b4fe9a48 | 11 | //-------------------------------------------------------- |
MikamiUitOpen | 0:c945b4fe9a48 | 12 | |
MikamiUitOpen | 0:c945b4fe9a48 | 13 | #include "mbed.h" |
MikamiUitOpen | 0:c945b4fe9a48 | 14 | |
MikamiUitOpen | 0:c945b4fe9a48 | 15 | #ifndef STM32F446xx |
MikamiUitOpen | 0:c945b4fe9a48 | 16 | #error Select STM32F446. |
MikamiUitOpen | 0:c945b4fe9a48 | 17 | #endif |
MikamiUitOpen | 0:c945b4fe9a48 | 18 | |
MikamiUitOpen | 0:c945b4fe9a48 | 19 | #ifndef F446_DAC_DUAL_HPP |
MikamiUitOpen | 0:c945b4fe9a48 | 20 | #define F446_DAC_DUAL_HPP |
MikamiUitOpen | 0:c945b4fe9a48 | 21 | |
MikamiUitOpen | 0:c945b4fe9a48 | 22 | namespace Mikami |
MikamiUitOpen | 0:c945b4fe9a48 | 23 | { |
MikamiUitOpen | 0:c945b4fe9a48 | 24 | class DacDual |
MikamiUitOpen | 0:c945b4fe9a48 | 25 | { |
MikamiUitOpen | 0:c945b4fe9a48 | 26 | public: |
MikamiUitOpen | 0:c945b4fe9a48 | 27 | // Constructor |
MikamiUitOpen | 0:c945b4fe9a48 | 28 | DacDual() : da1_(PA_4), da2_(PA_5) |
MikamiUitOpen | 0:c945b4fe9a48 | 29 | { |
MikamiUitOpen | 0:c945b4fe9a48 | 30 | DAC->CR = DAC_CR_EN1 | DAC_CR_TEN1 | DAC_CR_TSEL1 | |
MikamiUitOpen | 0:c945b4fe9a48 | 31 | DAC_CR_EN2 | DAC_CR_TEN2 | DAC_CR_TSEL2; |
MikamiUitOpen | 0:c945b4fe9a48 | 32 | } |
MikamiUitOpen | 0:c945b4fe9a48 | 33 | |
MikamiUitOpen | 0:c945b4fe9a48 | 34 | virtual ~DacDual() {} |
MikamiUitOpen | 0:c945b4fe9a48 | 35 | |
MikamiUitOpen | 0:c945b4fe9a48 | 36 | // -1.0f <= data1, data2 <= 1.0f |
MikamiUitOpen | 0:c945b4fe9a48 | 37 | void Write(float data1, float data2) |
MikamiUitOpen | 0:c945b4fe9a48 | 38 | { WriteDac(ToUint16(data2), ToUint16(data1)); } |
MikamiUitOpen | 0:c945b4fe9a48 | 39 | |
MikamiUitOpen | 0:c945b4fe9a48 | 40 | // 0 <= data1, data2 <= 4095 |
MikamiUitOpen | 0:c945b4fe9a48 | 41 | void Write(uint16_t data1, uint16_t data2) |
MikamiUitOpen | 0:c945b4fe9a48 | 42 | { WriteDac(SatUint16(data2), SatUint16(data1)); } |
MikamiUitOpen | 0:c945b4fe9a48 | 43 | |
MikamiUitOpen | 0:c945b4fe9a48 | 44 | // Set TIM3 for clock of switched-capacitor filter |
MikamiUitOpen | 0:c945b4fe9a48 | 45 | void ScfClock(uint32_t clock); |
MikamiUitOpen | 0:c945b4fe9a48 | 46 | |
MikamiUitOpen | 0:c945b4fe9a48 | 47 | private: |
MikamiUitOpen | 0:c945b4fe9a48 | 48 | static const uint32_t swtrig_ = DAC_SWTRIGR_SWTRIG1 |
MikamiUitOpen | 0:c945b4fe9a48 | 49 | | DAC_SWTRIGR_SWTRIG2; |
MikamiUitOpen | 0:c945b4fe9a48 | 50 | AnalogOut da1_, da2_; |
MikamiUitOpen | 0:c945b4fe9a48 | 51 | |
MikamiUitOpen | 0:c945b4fe9a48 | 52 | // Write dual-channel data |
MikamiUitOpen | 0:c945b4fe9a48 | 53 | void WriteDac(uint16_t val1, uint16_t val2) |
MikamiUitOpen | 0:c945b4fe9a48 | 54 | { |
MikamiUitOpen | 0:c945b4fe9a48 | 55 | DAC->DHR12RD = (val2 << 16) | val1; |
MikamiUitOpen | 0:c945b4fe9a48 | 56 | DAC->SWTRIGR = swtrig_; |
MikamiUitOpen | 0:c945b4fe9a48 | 57 | } |
MikamiUitOpen | 0:c945b4fe9a48 | 58 | |
MikamiUitOpen | 0:c945b4fe9a48 | 59 | // Saturate float to an unsigned 16-bit value |
MikamiUitOpen | 0:c945b4fe9a48 | 60 | uint16_t ToUint16(float val) |
MikamiUitOpen | 0:c945b4fe9a48 | 61 | { |
MikamiUitOpen | 0:c945b4fe9a48 | 62 | if (val < -1.0f) val = -1.0f; |
MikamiUitOpen | 0:c945b4fe9a48 | 63 | if (val > 1.0f) val = 1.0f; |
MikamiUitOpen | 0:c945b4fe9a48 | 64 | return (uint16_t)((val + 1.0f)*2047); |
MikamiUitOpen | 0:c945b4fe9a48 | 65 | } |
MikamiUitOpen | 0:c945b4fe9a48 | 66 | |
MikamiUitOpen | 0:c945b4fe9a48 | 67 | // Saturate to an unsigned 16-bit value |
MikamiUitOpen | 0:c945b4fe9a48 | 68 | uint16_t SatUint16(uint16_t val) |
MikamiUitOpen | 0:c945b4fe9a48 | 69 | { return (val > 4095) ? 4095 : val; } |
MikamiUitOpen | 0:c945b4fe9a48 | 70 | |
MikamiUitOpen | 0:c945b4fe9a48 | 71 | // for inhibition of copy constructor |
MikamiUitOpen | 0:c945b4fe9a48 | 72 | DacDual(const DacDual&); |
MikamiUitOpen | 0:c945b4fe9a48 | 73 | // for inhibition of substitute operator |
MikamiUitOpen | 0:c945b4fe9a48 | 74 | DacDual& operator=(const DacDual&); |
MikamiUitOpen | 0:c945b4fe9a48 | 75 | }; |
MikamiUitOpen | 0:c945b4fe9a48 | 76 | } |
MikamiUitOpen | 0:c945b4fe9a48 | 77 | #endif // F446_DAC_DUAL_HPP |