STM32F446 の内蔵 ADC, DAC を 2 チャンネルで使うためのライブラリ.このライブラリを登録した際のプログラム: Demo_DSP_ADDA_Dual. Library for build-in ADC and DAC in STM32F446 using with dual channels.
Dependents: F446_DSP_Oscilloscope Demo_DSP_ADDA_Dual TrG_Oscilloscope
Diff: DSP_DacDual.hpp
- Revision:
- 0:c02c700a8ecf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DSP_DacDual.hpp Tue Sep 22 04:52:53 2020 +0000 @@ -0,0 +1,58 @@ +//-------------------------------------------------------- +// STM32F446 内蔵の DAC 用のクラス(ヘッダ) +// A2 (PA_4): 左 +// D13 (PA_5): 右 +// +// 2020/09/22, Copyright (c) 2020 MIKAMI, Naoki +//-------------------------------------------------------- + +#include "mbed.h" +#include "PeripheralPins.h" // pin_function() で使用 +// PeripheralPins.c が含まれるディレクトリ: +// mbed-dev\targets\TARGET_STM\TARGET_STM32F4\ +// TARGET_STM32F446xE\TARGET_NUCLEO_F446RE + +#ifndef STM32F446xx +#error Select NUCLEO-F446RE. +#endif + +#ifndef F446_DAC_DUAL_HPP +#define F446_DAC_DUAL_HPP + +namespace Mikami +{ + class DspDacDual + { + public: + // コンストラクタ + DspDacDual(); + + virtual ~DspDacDual() {} + + // -1.0f <= data1, data2 <= 1.0f + void Write(float data1, float data2) + { WriteDac(ToUint16(data1), ToUint16(data2)); } + + // 0 <= data1, data2 <= 4095 + void Write(uint16_t data1, uint16_t data2) + { WriteDac(__USAT(data1, BIT_WIDTH_), + __USAT(data2, BIT_WIDTH_)); } + + private: + static const int BIT_WIDTH_ = 12; + DAC_TypeDef* const DAC_; // DA 変換器に対応する構造体のポインタ + + // float 型のデータを uint16_t 型に変換,飽和処理付き + uint16_t ToUint16(float val) + { return __USAT((val + 1.0f)*2047.0f, BIT_WIDTH_); } + + // 2チャンネル分を同時に DAC に書き込む + void WriteDac(uint16_t val1, uint16_t val2) + { DAC->DHR12RD = __PKHBT(val1, val2, 16); } + + // コピー・コンストラクタ,代入演算子の禁止のため + DspDacDual(const DspDacDual&); + DspDacDual& operator=(const DspDacDual&); + }; +} +#endif // F446_DAC_DUAL_HPP \ No newline at end of file