不韋 呂 / UIT_ADDA

Dependents:   UIT2_MovingAverage UIT2_AllpassReverb UIT2_CombReverb UIT2_FIR_LPF_Symmetry ... more

Committer:
MikamiUitOpen
Date:
Sun Jan 11 02:20:04 2015 +0000
Revision:
16:0001d3e93bee
Parent:
14:6c60601c1834
Child:
17:fd4f92ad4323
17

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:6e0ed5adfe47 1 //------------------------------------------------------
MikamiUitOpen 0:6e0ed5adfe47 2 // Class for single DAC in MCP4922
MikamiUitOpen 0:6e0ed5adfe47 3 //
MikamiUitOpen 16:0001d3e93bee 4 // 2015/01/03, Copyright (c) 2015 MIKAMI, Naoki
MikamiUitOpen 0:6e0ed5adfe47 5 //------------------------------------------------------
MikamiUitOpen 0:6e0ed5adfe47 6
MikamiUitOpen 0:6e0ed5adfe47 7 #include "DAC_MCP4922.hpp"
MikamiUitOpen 0:6e0ed5adfe47 8
MikamiUitOpen 0:6e0ed5adfe47 9 namespace Mikami
MikamiUitOpen 0:6e0ed5adfe47 10 {
MikamiUitOpen 0:6e0ed5adfe47 11 DAC_MCP4922::DAC_MCP4922(DAC dac, PinName mosi, PinName sclk,
MikamiUitOpen 16:0001d3e93bee 12 PinName cs, PinName ldac)
MikamiUitOpen 0:6e0ed5adfe47 13 : wcr_(dac | 0x3000), spi_(mosi, NC, sclk),
MikamiUitOpen 0:6e0ed5adfe47 14 ld_(ldac, 0), mySpi_((SPI_TypeDef*)NULL)
MikamiUitOpen 0:6e0ed5adfe47 15 {
MikamiUitOpen 0:6e0ed5adfe47 16 if ( (mosi == PA_7) || (mosi == PB_5) ) mySpi_ = SPI1;
MikamiUitOpen 0:6e0ed5adfe47 17 if ( (mosi == PB_15) || (mosi == PC_3) ) mySpi_ = SPI2;
MikamiUitOpen 0:6e0ed5adfe47 18 if ( mosi == PC_12 ) mySpi_ = SPI3;
MikamiUitOpen 0:6e0ed5adfe47 19
MikamiUitOpen 16:0001d3e93bee 20 // Set SPI format
MikamiUitOpen 0:6e0ed5adfe47 21 spi_.format(16, 0);
MikamiUitOpen 16:0001d3e93bee 22 // Clock source of F401 for SPI1 : 84 MHz,
MikamiUitOpen 16:0001d3e93bee 23 // SPI2, SPI3 : 42 MHz
MikamiUitOpen 16:0001d3e93bee 24 mySpi_->CR1 = (mySpi_->CR1 & ~SPI_CR1_BR);
MikamiUitOpen 16:0001d3e93bee 25 if (mySpi_ == SPI1) mySpi_->CR1 += SPI_CR1_BR_0;
MikamiUitOpen 16:0001d3e93bee 26 #ifdef __STM32F411xE_H
MikamiUitOpen 16:0001d3e93bee 27 mySpi_->CR1 += SPI_CR1_BR_0;
MikamiUitOpen 16:0001d3e93bee 28 #endif // __STM32F411xE_H
MikamiUitOpen 16:0001d3e93bee 29
MikamiUitOpen 0:6e0ed5adfe47 30 // timer prescaler is set same value of boud rate for SPI
MikamiUitOpen 0:6e0ed5adfe47 31 uint16_t psc = (2 << ((mySpi_->CR1 >> 3) & 0x07)) - 1;
MikamiUitOpen 0:6e0ed5adfe47 32 ss_ = new Tim4_ss(psc, 18, cs);
MikamiUitOpen 0:6e0ed5adfe47 33
MikamiUitOpen 0:6e0ed5adfe47 34 // Set DAC to 0
MikamiUitOpen 0:6e0ed5adfe47 35 WriteDac(0);
MikamiUitOpen 0:6e0ed5adfe47 36 while (IsBusy()) {}
MikamiUitOpen 0:6e0ed5adfe47 37 }
MikamiUitOpen 0:6e0ed5adfe47 38
MikamiUitOpen 0:6e0ed5adfe47 39 void DAC_MCP4922::Write(float value)
MikamiUitOpen 0:6e0ed5adfe47 40 {
MikamiUitOpen 0:6e0ed5adfe47 41 if (value < -1.0f) value = -1.0f;
MikamiUitOpen 0:6e0ed5adfe47 42 if (value > 1.0f) value = 1.0f;
MikamiUitOpen 0:6e0ed5adfe47 43
MikamiUitOpen 0:6e0ed5adfe47 44 WriteDac((uint16_t)((value + 1.0f)*2047));
MikamiUitOpen 0:6e0ed5adfe47 45 }
MikamiUitOpen 0:6e0ed5adfe47 46
MikamiUitOpen 0:6e0ed5adfe47 47 void DAC_MCP4922::Write(uint16_t value)
MikamiUitOpen 0:6e0ed5adfe47 48 {
MikamiUitOpen 0:6e0ed5adfe47 49 WriteDac((value > 4095) ? 4095 : value);
MikamiUitOpen 0:6e0ed5adfe47 50 }
MikamiUitOpen 0:6e0ed5adfe47 51
MikamiUitOpen 0:6e0ed5adfe47 52 void DAC_MCP4922::Ldac()
MikamiUitOpen 0:6e0ed5adfe47 53 {
MikamiUitOpen 0:6e0ed5adfe47 54 ld_.write(0);
MikamiUitOpen 0:6e0ed5adfe47 55 ld_.write(0); // ensure width of "L" pulse
MikamiUitOpen 0:6e0ed5adfe47 56 ld_.write(1);
MikamiUitOpen 0:6e0ed5adfe47 57 }
MikamiUitOpen 0:6e0ed5adfe47 58
MikamiUitOpen 0:6e0ed5adfe47 59 void DAC_MCP4922::WriteDac(uint16_t value)
MikamiUitOpen 0:6e0ed5adfe47 60 {
MikamiUitOpen 0:6e0ed5adfe47 61 ss_->SlaveSelect();
MikamiUitOpen 0:6e0ed5adfe47 62 mySpi_->DR = value | wcr_;
MikamiUitOpen 0:6e0ed5adfe47 63 }
MikamiUitOpen 8:f933fcd30408 64
MikamiUitOpen 14:6c60601c1834 65 void DAC_MCP4922::ScfClockTim3(uint32_t clock, PinName pin)
MikamiUitOpen 8:f933fcd30408 66 {
MikamiUitOpen 14:6c60601c1834 67 if ( (pin != PA_6) && (pin != PB_4) && (pin != PB_5) &&
MikamiUitOpen 14:6c60601c1834 68 (pin != PC_6) && (pin != PC_7) && (pin != PC_8) && (pin != PC_9) )
MikamiUitOpen 14:6c60601c1834 69 {
MikamiUitOpen 14:6c60601c1834 70 fprintf(stderr, "\r\nIllegal pin name in DAC_MCP4922::ScfClockTim3()\r\n");
MikamiUitOpen 14:6c60601c1834 71 while (true) {}
MikamiUitOpen 14:6c60601c1834 72 }
MikamiUitOpen 14:6c60601c1834 73
MikamiUitOpen 14:6c60601c1834 74 PwmOut clockSCF(pin);
MikamiUitOpen 8:f933fcd30408 75
MikamiUitOpen 8:f933fcd30408 76 TIM3->ARR = SystemCoreClock/clock - 1;
MikamiUitOpen 8:f933fcd30408 77 TIM3->PSC = 0;
MikamiUitOpen 8:f933fcd30408 78 // Set capture/compare register 2
MikamiUitOpen 14:6c60601c1834 79 if ( (pin == PA_6) || (pin == PB_4) || (pin == PC_6) )
MikamiUitOpen 14:6c60601c1834 80 TIM3->CCR1 = (TIM3->ARR + 1)/2;
MikamiUitOpen 14:6c60601c1834 81 if ( (pin == PB_5) || (pin == PC_7) )
MikamiUitOpen 14:6c60601c1834 82 TIM3->CCR2 = (TIM3->ARR + 1)/2;
MikamiUitOpen 14:6c60601c1834 83 if (pin == PC_8)
MikamiUitOpen 14:6c60601c1834 84 TIM3->CCR3 = (TIM3->ARR + 1)/2;
MikamiUitOpen 14:6c60601c1834 85 if (pin == PC_9)
MikamiUitOpen 14:6c60601c1834 86 TIM3->CCR4 = (TIM3->ARR + 1)/2;
MikamiUitOpen 8:f933fcd30408 87 }
MikamiUitOpen 0:6e0ed5adfe47 88 }