AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年5月号に掲載

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers F446_DAC_Dual.hpp Source File

F446_DAC_Dual.hpp

00001 //--------------------------------------------------------
00002 //  STM32F446 内蔵の DAC 用のクラス
00003 //      A2  (PA_4): 左
00004 //      D13 (PA_5): 右
00005 //  D13 は LD2 (緑) が接続されているため,高い電圧を出力した場合に
00006 //  クリップされる.これを防止するためには SB21 を OFF にする
00007 //
00008 //  2020/08/11, Copyright (c) 2020 MIKAMI, Naoki
00009 //--------------------------------------------------------
00010 
00011 #include "mbed.h"
00012 
00013 #ifndef STM32F446xx
00014 #error Select NUCLEO-F446RE.
00015 #endif
00016 
00017 #ifndef F446_DAC_DUAL_HPP
00018 #define F446_DAC_DUAL_HPP
00019 
00020 namespace Mikami
00021 {
00022     class DacDual
00023     {
00024     public:
00025         // コンストラクタ
00026         DacDual() : da1_(PA_4), da2_(PA_5)
00027         {
00028             DAC->CR = DAC_CR_EN1 | DAC_CR_TEN1 | DAC_CR_TSEL1 |
00029                       DAC_CR_EN2 | DAC_CR_TEN2 | DAC_CR_TSEL2;
00030         }
00031 
00032         virtual ~DacDual() {}
00033 
00034         // -1.0f <= data1, data2 <= 1.0f
00035         //      data1: 左, data2: 右
00036        void Write(float data1, float data2)
00037         {   WriteDac(ToUint16(data1), ToUint16(data2)); }
00038 
00039         // 0 <= data1, data2 <= 4095
00040         //      data1: 左, data2: 右
00041         void Write(uint16_t data1, uint16_t data2)
00042         {   WriteDac(__USAT(data1, BIT_WIDTH_),
00043                      __USAT(data2, BIT_WIDTH_)); }
00044 
00045     private:
00046         static const uint32_t SWTRIG_ = DAC_SWTRIGR_SWTRIG1
00047                                       | DAC_SWTRIGR_SWTRIG2;
00048         static const int BIT_WIDTH_ = 12;
00049         AnalogOut da1_, da2_;
00050 
00051         // 両方のチャンネルへ出力する
00052         void WriteDac(uint16_t val1, uint16_t val2)
00053         {
00054             DAC->DHR12RD = __PKHBT(val1, val2, 16);
00055             DAC->SWTRIGR = SWTRIG_;
00056         }
00057 
00058         // 飽和処理を行い uint16_t 型のデータを戻り値とする
00059         uint16_t ToUint16(float val)
00060         {
00061             return __USAT((val + 1.0f)*2047.0f, BIT_WIDTH_);
00062         }
00063 
00064         // コピー・コンストラクタ,代入演算子の禁止のため
00065         DacDual(const DacDual&);
00066         DacDual& operator=(const DacDual&);     
00067     };
00068 }
00069 #endif  // F446_DAC_DUAL_HPP