不韋 呂 / UIT_ADDA

Dependents:   UIT2_MovingAverage UIT2_AllpassReverb UIT2_CombReverb UIT2_FIR_LPF_Symmetry ... more

Committer:
MikamiUitOpen
Date:
Sun Dec 21 08:07:09 2014 +0000
Revision:
14:6c60601c1834
Parent:
11:a764fe59d343
Child:
16:0001d3e93bee
15

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 14:6c60601c1834 4 // 2014/12/21, Copyright (c) 2014 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 0:6e0ed5adfe47 12 PinName cs, PinName ldac, int hz)
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 0:6e0ed5adfe47 20 // Set SPI format and bus frequency
MikamiUitOpen 0:6e0ed5adfe47 21 spi_.format(16, 0);
MikamiUitOpen 0:6e0ed5adfe47 22 spi_.frequency(hz);
MikamiUitOpen 0:6e0ed5adfe47 23
MikamiUitOpen 0:6e0ed5adfe47 24 // timer prescaler is set same value of boud rate for SPI
MikamiUitOpen 0:6e0ed5adfe47 25 uint16_t psc = (2 << ((mySpi_->CR1 >> 3) & 0x07)) - 1;
MikamiUitOpen 0:6e0ed5adfe47 26 ss_ = new Tim4_ss(psc, 18, cs);
MikamiUitOpen 0:6e0ed5adfe47 27
MikamiUitOpen 0:6e0ed5adfe47 28 // Set DAC to 0
MikamiUitOpen 0:6e0ed5adfe47 29 WriteDac(0);
MikamiUitOpen 0:6e0ed5adfe47 30 while (IsBusy()) {}
MikamiUitOpen 0:6e0ed5adfe47 31 }
MikamiUitOpen 0:6e0ed5adfe47 32
MikamiUitOpen 0:6e0ed5adfe47 33 void DAC_MCP4922::Write(float value)
MikamiUitOpen 0:6e0ed5adfe47 34 {
MikamiUitOpen 0:6e0ed5adfe47 35 if (value < -1.0f) value = -1.0f;
MikamiUitOpen 0:6e0ed5adfe47 36 if (value > 1.0f) value = 1.0f;
MikamiUitOpen 0:6e0ed5adfe47 37
MikamiUitOpen 0:6e0ed5adfe47 38 WriteDac((uint16_t)((value + 1.0f)*2047));
MikamiUitOpen 0:6e0ed5adfe47 39 }
MikamiUitOpen 0:6e0ed5adfe47 40
MikamiUitOpen 0:6e0ed5adfe47 41 void DAC_MCP4922::Write(uint16_t value)
MikamiUitOpen 0:6e0ed5adfe47 42 {
MikamiUitOpen 0:6e0ed5adfe47 43 WriteDac((value > 4095) ? 4095 : value);
MikamiUitOpen 0:6e0ed5adfe47 44 }
MikamiUitOpen 0:6e0ed5adfe47 45
MikamiUitOpen 0:6e0ed5adfe47 46 void DAC_MCP4922::Ldac()
MikamiUitOpen 0:6e0ed5adfe47 47 {
MikamiUitOpen 0:6e0ed5adfe47 48 ld_.write(0);
MikamiUitOpen 0:6e0ed5adfe47 49 ld_.write(0); // ensure width of "L" pulse
MikamiUitOpen 0:6e0ed5adfe47 50 ld_.write(1);
MikamiUitOpen 0:6e0ed5adfe47 51 }
MikamiUitOpen 0:6e0ed5adfe47 52
MikamiUitOpen 0:6e0ed5adfe47 53 void DAC_MCP4922::WriteDac(uint16_t value)
MikamiUitOpen 0:6e0ed5adfe47 54 {
MikamiUitOpen 0:6e0ed5adfe47 55 ss_->SlaveSelect();
MikamiUitOpen 0:6e0ed5adfe47 56 mySpi_->DR = value | wcr_;
MikamiUitOpen 0:6e0ed5adfe47 57 }
MikamiUitOpen 8:f933fcd30408 58
MikamiUitOpen 14:6c60601c1834 59 void DAC_MCP4922::ScfClockTim3(uint32_t clock, PinName pin)
MikamiUitOpen 8:f933fcd30408 60 {
MikamiUitOpen 14:6c60601c1834 61 if ( (pin != PA_6) && (pin != PB_4) && (pin != PB_5) &&
MikamiUitOpen 14:6c60601c1834 62 (pin != PC_6) && (pin != PC_7) && (pin != PC_8) && (pin != PC_9) )
MikamiUitOpen 14:6c60601c1834 63 {
MikamiUitOpen 14:6c60601c1834 64 fprintf(stderr, "\r\nIllegal pin name in DAC_MCP4922::ScfClockTim3()\r\n");
MikamiUitOpen 14:6c60601c1834 65 while (true) {}
MikamiUitOpen 14:6c60601c1834 66 }
MikamiUitOpen 14:6c60601c1834 67
MikamiUitOpen 14:6c60601c1834 68 PwmOut clockSCF(pin);
MikamiUitOpen 8:f933fcd30408 69
MikamiUitOpen 8:f933fcd30408 70 TIM3->ARR = SystemCoreClock/clock - 1;
MikamiUitOpen 8:f933fcd30408 71 TIM3->PSC = 0;
MikamiUitOpen 8:f933fcd30408 72 // Set capture/compare register 2
MikamiUitOpen 14:6c60601c1834 73 if ( (pin == PA_6) || (pin == PB_4) || (pin == PC_6) )
MikamiUitOpen 14:6c60601c1834 74 TIM3->CCR1 = (TIM3->ARR + 1)/2;
MikamiUitOpen 14:6c60601c1834 75 if ( (pin == PB_5) || (pin == PC_7) )
MikamiUitOpen 14:6c60601c1834 76 TIM3->CCR2 = (TIM3->ARR + 1)/2;
MikamiUitOpen 14:6c60601c1834 77 if (pin == PC_8)
MikamiUitOpen 14:6c60601c1834 78 TIM3->CCR3 = (TIM3->ARR + 1)/2;
MikamiUitOpen 14:6c60601c1834 79 if (pin == PC_9)
MikamiUitOpen 14:6c60601c1834 80 TIM3->CCR4 = (TIM3->ARR + 1)/2;
MikamiUitOpen 8:f933fcd30408 81 }
MikamiUitOpen 0:6e0ed5adfe47 82 }