Class library for internal ADC and DAC connected by SPI. This library support clock generator using TIM3 for switched-capacitor filter to smooth output signal of DAC. This library includes derivative class to support interrupt occured in end of AD conversion. Validated for ST Nucleo F401RE, F411RE. 内蔵 ADC と,SPI 接続の DAC のためのクラスライブラリ.DAC の出力信号を平滑化するためのスイッチトキャパシタフィルタ用のクロックは TIM3 を使用.ST Nucleo F401RE,F411RE で動作を確認.

Dependents:   UITDSP_ADDA_Example UIT2_MovingAv_Intr UIT2_VariableFIR UIT2_VowelSynthesizer ... more

Committer:
MikamiUitOpen
Date:
Sat Jul 25 05:40:26 2015 +0000
Revision:
8:543daa087bd5
Parent:
7:14cdca8b48f8
6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 4:03c4518de836 1 //------------------------------------------------------
MikamiUitOpen 4:03c4518de836 2 // Class for single DAC in MCP4921 -- Header
MikamiUitOpen 4:03c4518de836 3 // Fast version
MikamiUitOpen 0:2cdd5c91d975 4 //
MikamiUitOpen 4:03c4518de836 5 // Default pin assign
MikamiUitOpen 0:2cdd5c91d975 6 // D11 SPI Master Out Slave In
MikamiUitOpen 0:2cdd5c91d975 7 // D13 SPI Serial Clock
MikamiUitOpen 4:03c4518de836 8 // D10 SPI Slave Select ----------------------- TIM4
MikamiUitOpen 0:2cdd5c91d975 9 // D12 to MCP4921 LDAC pin
MikamiUitOpen 0:2cdd5c91d975 10 // D9 clock for Switched-capacitor filter ---- TIM3
MikamiUitOpen 0:2cdd5c91d975 11 //
MikamiUitOpen 4:03c4518de836 12 // Argument cs in constructor must be output of TIM4,
MikamiUitOpen 4:03c4518de836 13 // i.e. D10(PB_6), PB_7, D15(PB_8), or D14(PB_9)
MikamiUitOpen 0:2cdd5c91d975 14 //
MikamiUitOpen 4:03c4518de836 15 // Argument pin in function ScfClockTim3() can be
MikamiUitOpen 4:03c4518de836 16 // PA_6(D12), PB_4(D5), PC_6, PB_5(D4), PC_7(D9),
MikamiUitOpen 4:03c4518de836 17 // PC_8, or PC_9
MikamiUitOpen 0:2cdd5c91d975 18 //
MikamiUitOpen 6:9deca4a06c8c 19 // 2015/03/27, Copyright (c) 2015 MIKAMI, Naoki
MikamiUitOpen 4:03c4518de836 20 //------------------------------------------------------
MikamiUitOpen 0:2cdd5c91d975 21
MikamiUitOpen 0:2cdd5c91d975 22 #ifndef DAC_MCP4921_HPP
MikamiUitOpen 0:2cdd5c91d975 23 #define DAC_MCP4921_HPP
MikamiUitOpen 0:2cdd5c91d975 24
MikamiUitOpen 0:2cdd5c91d975 25 #include "mbed.h"
MikamiUitOpen 6:9deca4a06c8c 26 #include "TIM4_SlaveSelect.hpp"
MikamiUitOpen 0:2cdd5c91d975 27
MikamiUitOpen 0:2cdd5c91d975 28 namespace Mikami
MikamiUitOpen 0:2cdd5c91d975 29 {
MikamiUitOpen 0:2cdd5c91d975 30 class DAC_MCP4921
MikamiUitOpen 0:2cdd5c91d975 31 {
MikamiUitOpen 0:2cdd5c91d975 32 public:
MikamiUitOpen 0:2cdd5c91d975 33 // Constructor
MikamiUitOpen 0:2cdd5c91d975 34 DAC_MCP4921(
MikamiUitOpen 0:2cdd5c91d975 35 PinName mosi = SPI_MOSI, // D11
MikamiUitOpen 0:2cdd5c91d975 36 PinName sclk = SPI_SCK, // D13
MikamiUitOpen 0:2cdd5c91d975 37 PinName cs = SPI_CS, // D10
MikamiUitOpen 0:2cdd5c91d975 38 PinName ldac = SPI_MISO); // D12
MikamiUitOpen 0:2cdd5c91d975 39
MikamiUitOpen 0:2cdd5c91d975 40 // -1.0f <= value <= 1.0f
MikamiUitOpen 0:2cdd5c91d975 41 void Write(float value)
MikamiUitOpen 0:2cdd5c91d975 42 {
MikamiUitOpen 0:2cdd5c91d975 43 if (value < -1.0f) value = -1.0f;
MikamiUitOpen 0:2cdd5c91d975 44 if (value > 1.0f) value = 1.0f;
MikamiUitOpen 4:03c4518de836 45
MikamiUitOpen 7:14cdca8b48f8 46 WriteDac((value + 1.0f)*2047);
MikamiUitOpen 0:2cdd5c91d975 47 }
MikamiUitOpen 0:2cdd5c91d975 48
MikamiUitOpen 0:2cdd5c91d975 49 // 0 <= value <= 4095
MikamiUitOpen 0:2cdd5c91d975 50 void Write(uint16_t value)
MikamiUitOpen 0:2cdd5c91d975 51 { WriteDac((value > 4095) ? 4095 : value); }
MikamiUitOpen 5:ff25db28bc64 52
MikamiUitOpen 5:ff25db28bc64 53 // Check busy
MikamiUitOpen 5:ff25db28bc64 54 bool IsBusy()
MikamiUitOpen 5:ff25db28bc64 55 { return (mySpi_->SR & SPI_SR_BSY) == SPI_SR_BSY; }
MikamiUitOpen 5:ff25db28bc64 56
MikamiUitOpen 5:ff25db28bc64 57 // Set clock for switched-capacitor filter
MikamiUitOpen 5:ff25db28bc64 58 void ScfClockTim3(uint32_t clock, PinName pin = D9);
MikamiUitOpen 5:ff25db28bc64 59
MikamiUitOpen 5:ff25db28bc64 60 protected:
MikamiUitOpen 5:ff25db28bc64 61 void SlaveSelect() { ss_->SlaveSelect(); }
MikamiUitOpen 5:ff25db28bc64 62 void WriteSpi(uint16_t value) { mySpi_->DR = value; }
MikamiUitOpen 6:9deca4a06c8c 63
MikamiUitOpen 0:2cdd5c91d975 64 // generate LDAC negative-going pulse
MikamiUitOpen 0:2cdd5c91d975 65 void Ldac()
MikamiUitOpen 0:2cdd5c91d975 66 {
MikamiUitOpen 0:2cdd5c91d975 67 ld_.write(0);
MikamiUitOpen 0:2cdd5c91d975 68 ld_.write(0); // ensure width of "L" pulse
MikamiUitOpen 0:2cdd5c91d975 69 ld_.write(1);
MikamiUitOpen 0:2cdd5c91d975 70 }
MikamiUitOpen 0:2cdd5c91d975 71
MikamiUitOpen 0:2cdd5c91d975 72 private:
MikamiUitOpen 6:9deca4a06c8c 73 SPI spi_; // SPI object of mbed
MikamiUitOpen 6:9deca4a06c8c 74 TIM4_SlaveSelect* ss_; // Slave Select for DAC
MikamiUitOpen 6:9deca4a06c8c 75 DigitalOut ld_; // for LDAC
MikamiUitOpen 0:2cdd5c91d975 76
MikamiUitOpen 6:9deca4a06c8c 77 // Pointer for SPI
MikamiUitOpen 4:03c4518de836 78 SPI_TypeDef* mySpi_;
MikamiUitOpen 4:03c4518de836 79
MikamiUitOpen 0:2cdd5c91d975 80 // for inhibition of copy constructor
MikamiUitOpen 0:2cdd5c91d975 81 DAC_MCP4921(const DAC_MCP4921&);
MikamiUitOpen 0:2cdd5c91d975 82 // for inhibition of substitute operator
MikamiUitOpen 0:2cdd5c91d975 83 DAC_MCP4921& operator=(const DAC_MCP4921&);
MikamiUitOpen 0:2cdd5c91d975 84
MikamiUitOpen 0:2cdd5c91d975 85 // for internal use
MikamiUitOpen 0:2cdd5c91d975 86 virtual void WriteDac(uint16_t value)
MikamiUitOpen 0:2cdd5c91d975 87 {
MikamiUitOpen 0:2cdd5c91d975 88 while (IsBusy()) {}
MikamiUitOpen 0:2cdd5c91d975 89 SlaveSelect();
MikamiUitOpen 0:2cdd5c91d975 90 WriteSpi(value | 0x3000);
MikamiUitOpen 6:9deca4a06c8c 91 }
MikamiUitOpen 0:2cdd5c91d975 92 };
MikamiUitOpen 0:2cdd5c91d975 93 }
MikamiUitOpen 0:2cdd5c91d975 94 #endif // DAC_MCP4921_HPP