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

Dependencies:   mbed

Revision:
0:7a653530c8ce
diff -r 000000000000 -r 7a653530c8ce F446_DAC_Dual.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/F446_DAC_Dual.hpp	Sat Aug 29 11:26:29 2020 +0000
@@ -0,0 +1,69 @@
+//--------------------------------------------------------
+//  STM32F446 内蔵の DAC 用のクラス
+//      A2  (PA_4): 左
+//      D13 (PA_5): 右
+//  D13 は LD2 (緑) が接続されているため,高い電圧を出力した場合に
+//  クリップされる.これを防止するためには SB21 を OFF にする
+//
+//  2020/08/11, Copyright (c) 2020 MIKAMI, Naoki
+//--------------------------------------------------------
+
+#include "mbed.h"
+
+#ifndef STM32F446xx
+#error Select NUCLEO-F446RE.
+#endif
+
+#ifndef F446_DAC_DUAL_HPP
+#define F446_DAC_DUAL_HPP
+
+namespace Mikami
+{
+    class DacDual
+    {
+    public:
+        // コンストラクタ
+        DacDual() : da1_(PA_4), da2_(PA_5)
+        {
+            DAC->CR = DAC_CR_EN1 | DAC_CR_TEN1 | DAC_CR_TSEL1 |
+                      DAC_CR_EN2 | DAC_CR_TEN2 | DAC_CR_TSEL2;
+        }
+
+        virtual ~DacDual() {}
+
+        // -1.0f <= data1, data2 <= 1.0f
+        //      data1: 左, data2: 右
+       void Write(float data1, float data2)
+        {   WriteDac(ToUint16(data1), ToUint16(data2)); }
+
+        // 0 <= data1, data2 <= 4095
+        //      data1: 左, data2: 右
+        void Write(uint16_t data1, uint16_t data2)
+        {   WriteDac(__USAT(data1, BIT_WIDTH_),
+                     __USAT(data2, BIT_WIDTH_)); }
+
+    private:
+        static const uint32_t SWTRIG_ = DAC_SWTRIGR_SWTRIG1
+                                      | DAC_SWTRIGR_SWTRIG2;
+        static const int BIT_WIDTH_ = 12;
+        AnalogOut da1_, da2_;
+
+        // 両方のチャンネルへ出力する
+        void WriteDac(uint16_t val1, uint16_t val2)
+        {
+            DAC->DHR12RD = __PKHBT(val1, val2, 16);
+            DAC->SWTRIGR = SWTRIG_;
+        }
+
+        // 飽和処理を行い uint16_t 型のデータを戻り値とする
+        uint16_t ToUint16(float val)
+        {
+            return __USAT((val + 1.0f)*2047.0f, BIT_WIDTH_);
+        }
+
+        // コピー・コンストラクタ,代入演算子の禁止のため
+        DacDual(const DacDual&);
+        DacDual& operator=(const DacDual&);     
+    };
+}
+#endif  // F446_DAC_DUAL_HPP
\ No newline at end of file