Library for build-in ADC and DAC in STM32F446 mounted on Nucleo F446RE. Nucleo F446RE に搭載されている STM32F446 の内蔵 ADC, DAC 用のライブラリ.

Dependents:   Demo_F446_AD_DA F446_MySoundMachine F446_ADF_Nlms F446_Spectrogram

F446_DAC.hpp

Committer:
MikamiUitOpen
Date:
2016-11-11
Revision:
0:c945b4fe9a48
Child:
1:6b9f2af6613d

File content as of revision 0:c945b4fe9a48:

//--------------------------------------------------------
//  Class for buit-in dual DAC on STM32F446 ---- Header
//      TIM3 is used for clock to external SCF
//
//  STM32F446 内蔵の DAC 用のクラス(ヘッダ)
//      TIM3 を外付けの SCF のクロックとして使用
//      Analog Out1: A2  (PA_4)
//      Analog Out2: D13 (PA_5)
//
//  2016/11/11, Copyright (c) 2016 MIKAMI, Naoki
//--------------------------------------------------------

#include "mbed.h"

#ifndef STM32F446xx
#error Select STM32F446.
#endif

#ifndef F446_DAC_DUAL_HPP
#define F446_DAC_DUAL_HPP

namespace Mikami
{
    class DacDual
    {
    public:
        // Constructor
        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
        void Write(float data1, float data2)
        {   WriteDac(ToUint16(data2), ToUint16(data1)); }

        // 0 <= data1, data2 <= 4095
        void Write(uint16_t data1, uint16_t data2)
        {   WriteDac(SatUint16(data2), SatUint16(data1)); }
        
        // Set TIM3 for clock of switched-capacitor filter
        void ScfClock(uint32_t clock);

    private:
        static const uint32_t swtrig_ = DAC_SWTRIGR_SWTRIG1
                                      | DAC_SWTRIGR_SWTRIG2;
        AnalogOut da1_, da2_;

        // Write dual-channel data
        void WriteDac(uint16_t val1, uint16_t val2)
        {
            DAC->DHR12RD = (val2 << 16) | val1;
            DAC->SWTRIGR = swtrig_;
        }

        // Saturate float to an unsigned 16-bit value
        uint16_t ToUint16(float val)
        {
            if (val < -1.0f) val = -1.0f;
            if (val >  1.0f) val =  1.0f;
            return (uint16_t)((val + 1.0f)*2047);
        }
        
        // Saturate to an unsigned 16-bit value
        uint16_t SatUint16(uint16_t val)
        {   return (val > 4095) ? 4095 : val; }

        // for inhibition of copy constructor
        DacDual(const DacDual&);
        // for inhibition of substitute operator
        DacDual& operator=(const DacDual&);     
    };
}
#endif  // F446_DAC_DUAL_HPP