不韋 呂
/
SDR_FM_Tx
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年5月号に掲載
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Wed Jul 13 2022 13:35:10 by 1.7.2