Signal Generator

Dependencies:   IniManager RA8875 Watchdog mbed-rtos mbed

Fork of speaker_demo_Analog by jim hamblen

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) {