![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Diff: main.cpp
- Revision:
- 0:5307f49cd305
- Child:
- 1:18e0f8aef32f
--- /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 + } +}