Digital to analog conversion. Reads analog signal (voltage) and depending on it, sets the frequency to produce the analog output for sine wave.

Fork of DACandticker_sample by William Marsh

Revision:
0:5307f49cd305
Child:
1:18e0f8aef32f
diff -r 000000000000 -r 5307f49cd305 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Feb 01 13:38:02 2017 +0000
@@ -0,0 +1,62 @@
+// Lab 3 Example Program 2
+// -----------------------
+// Periodically write to the AnalogOut to create a sine wave
+// Alternate between two fixed frequencies every 5 sec
+//
+// THIS VERSION HAS DEBUGGING CODE USING THE SERIAL PORT
+
+#include "mbed.h"
+#include "rtos.h"
+#include "sineTable.h"
+
+Ticker tick ;          // Creates periodic interrupt
+AnalogOut ao(PTE30) ;  // Analog output
+
+// --- following code for debugging ---
+Thread debugT ;
+Serial pc(USBTX, USBRX); // tx, rx, useful for debugging
+
+// Put a simple reprsentation of the sine wave
+//  to the serial output. ONLY at low frequency
+void debug(int index) {
+    int sine4 = sine[index] >> 11 ; // get top 5 bits
+    pc.putc('*') ;
+    while (sine4--) pc.putc('*') ;
+    pc.putc('\n') ;
+    //pc.putc('\r') ;  
+}
+
+volatile int index = 0 ; // this variable is not just for debugging!!
+
+void debugCallback() {
+    while (true) {
+        Thread::signal_wait(0x1) ;
+        debug(index) ;  // there is a race condition here
+    }
+}
+// ---- end of debugging code ---------
+
+// Function called every periodically
+// Write new value to AnalogOut 
+void writeAout() {
+    ao.write_u16(sine[index]) ;
+    debugT.signal_set(0x1) ; // DEBUGGING low frequency only
+    index = (index + 1) % 64 ;   
+}
+
+// Control the frequency of updates
+//   Alternative between two frequencies      
+int main() {
+    int update_us = 100000 ; // 100ms
+    debugT.start(&debugCallback) ;
+    while (true) {
+        pc.printf("Update at 64 x 100ms giving about 0.15Hz\n");
+        tick.attach_us(callback(&writeAout), update_us); // setup ticker to write to AnalogOut
+        Thread::wait(30000) ; // wait 30 sec - 30000ms
+        update_us = 150000 ; // 150ms
+        pc.printf("Update at 64 x 150ms giving about 0.1Hz\n");
+        tick.attach_us(callback(&writeAout), update_us); // setup ticker to write to AnalogOut
+        Thread::wait(30000) ; // wait 30 sec - 30000ms
+        update_us = 100000 ; // 100ms
+    }
+}