Signal Generator
Dependencies: IniManager RA8875 Watchdog mbed-rtos mbed
Fork of speaker_demo_Analog by
Diff: SignalGenDAC.cpp
- Revision:
- 5:49dd0c647a40
- Parent:
- 4:10281ddb673d
- Child:
- 6:1f48212fbaf9
--- a/SignalGenDAC.cpp Mon Jan 16 21:05:13 2017 +0000 +++ b/SignalGenDAC.cpp Mon Jan 16 22:57:59 2017 +0000 @@ -3,7 +3,7 @@ DigitalOut led(LED1); -#define PI 3.14159 +#define PI 3.14159 // for the sine-wave /// The linked list structure used to control the DMA transfer /// @@ -28,17 +28,6 @@ SignalGenDAC::SignalGenDAC(PinName _aout, float _minV, float _maxV) : minV(_minV), maxV(_maxV) { aout = new AnalogOut(_aout); -#if 1 - #include "mbed.h" - aout->write(0.25); - wait_ms(25); - aout->write(0.50); - wait_ms(25); - aout->write(0.75); - wait_ms(25); - aout->write(1.00); - wait_ms(25); -#endif } SignalGenDAC::~SignalGenDAC() { @@ -68,9 +57,8 @@ /* Load DMA Channel0 */ LPC_GPDMACH0->DMACCSrcAddr = (uint32_t)DACsignal; LPC_GPDMACH0->DMACCDestAddr = (uint32_t)&LPC_DAC->DACR; - LPC_GPDMACH0->DMACCLLI = (uint32_t)&llio; // Free Running - //LPC_GPDMACH0->DMACCLLI = 0; // One-Shot - + LPC_GPDMACH0->DMACCLLI = (uint32_t)&llio; + LPC_GPDMACH0->DMACCControl = numSamples // transfer size (0 - 11) = 64 | (0 << 12) // source burst size (12 - 14) = 1 | (0 << 15) // destination burst size (15 - 17) = 1 @@ -106,13 +94,20 @@ void SignalGenDAC::Stop(void) { printf("Stop()\r\n"); LPC_GPDMACH0->DMACCLLI = 0; + while (LPC_GPDMACH0->DMACCConfig & 1) + wait_ms(1); + aout->write(offset / maxV); isOn = false; led = 0; } -void SignalGenDAC::PrepareWaveform(SG_Mode mode, float frequency, float dutycycle, float voltage, float offset) { +void SignalGenDAC::PrepareWaveform(SG_Mode mode, float _frequency, float _dutycycle, float _voltage, float _offset) { int x, dcCount, firstQtr, lastQtr; + frequency = _frequency; + dutycycle = _dutycycle; + voltage = _voltage; + offset = _offset; float upp = rangelimit(offset + voltage/2, minV, maxV); float mid = rangelimit(offset, minV, maxV); float low = rangelimit(offset - voltage/2, minV, maxV); @@ -186,7 +181,9 @@ DACsignal[x] = ((uint16_t)(VoltSignal[x]/maxV * 1023) << 6); printf("%3d, %5.3f, %d\r\n", x, VoltSignal[x], DACsignal[x]); } - Start(false); + if (!isOn) { + aout->write(offset / maxV); + } } float SignalGenDAC::rangelimit(float value, float min, float max) {