Tobore Denedo / Mbed OS DACandticker_sample_copy

Fork of DACandticker_sample by William Marsh

Committer:
Tobden
Date:
Thu Feb 15 17:30:18 2018 +0000
Revision:
3:30484e9b750a
Parent:
2:e27fd3b65155
Modified version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WilliamMarshQMUL 0:5307f49cd305 1 // Lab 3 Example Program 2
WilliamMarshQMUL 0:5307f49cd305 2 // -----------------------
WilliamMarshQMUL 0:5307f49cd305 3 // Periodically write to the AnalogOut to create a sine wave
WilliamMarshQMUL 0:5307f49cd305 4 // Alternate between two fixed frequencies every 5 sec
WilliamMarshQMUL 0:5307f49cd305 5 //
WilliamMarshQMUL 2:e27fd3b65155 6 // Updated for mbed 5
WilliamMarshQMUL 2:e27fd3b65155 7
WilliamMarshQMUL 1:18e0f8aef32f 8 // THIS VERSION HAS NO DEBUGGING CODE
WilliamMarshQMUL 0:5307f49cd305 9
WilliamMarshQMUL 0:5307f49cd305 10 #include "mbed.h"
WilliamMarshQMUL 0:5307f49cd305 11 #include "sineTable.h"
WilliamMarshQMUL 0:5307f49cd305 12
WilliamMarshQMUL 0:5307f49cd305 13 Ticker tick ; // Creates periodic interrupt
Tobden 3:30484e9b750a 14 Ticker tick2; // Creates another periodic interrupt
WilliamMarshQMUL 0:5307f49cd305 15 AnalogOut ao(PTE30) ; // Analog output
Tobden 3:30484e9b750a 16 AnalogIn ain(A0) ;
Tobden 3:30484e9b750a 17 Serial pc(USBTX, USBRX); // tx, rx, for debugging
Tobden 3:30484e9b750a 18 //volatile int t;
Tobden 3:30484e9b750a 19
Tobden 3:30484e9b750a 20 // Message type
Tobden 3:30484e9b750a 21 typedef struct {
Tobden 3:30484e9b750a 22 uint16_t analog; /* Analog input value */
Tobden 3:30484e9b750a 23 } message_t;
Tobden 3:30484e9b750a 24
Tobden 3:30484e9b750a 25 // Mail box
Tobden 3:30484e9b750a 26 Mail<message_t, 2> mailbox;
Tobden 3:30484e9b750a 27
Tobden 3:30484e9b750a 28 // Function called every 10ms to read ADC
Tobden 3:30484e9b750a 29 // Low pass filter
Tobden 3:30484e9b750a 30 // Every 10th value is sent to mailbox
Tobden 3:30484e9b750a 31 volatile int samples = 0 ;
Tobden 3:30484e9b750a 32 volatile uint16_t smoothed = 0 ;
Tobden 3:30484e9b750a 33 void readA0() {
Tobden 3:30484e9b750a 34 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
Tobden 3:30484e9b750a 35 samples++ ;
Tobden 3:30484e9b750a 36 if (samples == 10) {
Tobden 3:30484e9b750a 37 // send to thread
Tobden 3:30484e9b750a 38 message_t *mess = mailbox.alloc() ; // may fail but does not block
Tobden 3:30484e9b750a 39 if (mess) {
Tobden 3:30484e9b750a 40 mess->analog = smoothed ;
Tobden 3:30484e9b750a 41 mailbox.put(mess); // fails but does not block if full
Tobden 3:30484e9b750a 42 }
Tobden 3:30484e9b750a 43 samples = 0;
Tobden 3:30484e9b750a 44 }
Tobden 3:30484e9b750a 45 }
Tobden 3:30484e9b750a 46
Tobden 3:30484e9b750a 47 // Write voltage digits
Tobden 3:30484e9b750a 48 // v Voltage as scale int, e.g. 3.30 is 330
Tobden 3:30484e9b750a 49 void vToString(int v, char* s) {
Tobden 3:30484e9b750a 50 s[3] = '0' + (v % 10) ;
Tobden 3:30484e9b750a 51 v = v / 10 ;
Tobden 3:30484e9b750a 52 s[2] = '0' + (v % 10) ;
Tobden 3:30484e9b750a 53 v = v / 10 ;
Tobden 3:30484e9b750a 54 s[0] = '0' + (v % 10) ;
Tobden 3:30484e9b750a 55 }
Tobden 3:30484e9b750a 56
WilliamMarshQMUL 0:5307f49cd305 57
WilliamMarshQMUL 1:18e0f8aef32f 58 // Function called periodically
WilliamMarshQMUL 1:18e0f8aef32f 59 // Write new value to AnalogOut
WilliamMarshQMUL 2:e27fd3b65155 60 volatile int index = 0 ; // index into array of sin values
WilliamMarshQMUL 0:5307f49cd305 61 void writeAout() {
WilliamMarshQMUL 0:5307f49cd305 62 ao.write_u16(sine[index]) ;
WilliamMarshQMUL 0:5307f49cd305 63 index = (index + 1) % 64 ;
WilliamMarshQMUL 0:5307f49cd305 64 }
WilliamMarshQMUL 0:5307f49cd305 65
WilliamMarshQMUL 0:5307f49cd305 66 // Control the frequency of updates
WilliamMarshQMUL 0:5307f49cd305 67 // Alternative between two frequencies
WilliamMarshQMUL 0:5307f49cd305 68 int main() {
Tobden 3:30484e9b750a 69 int volts = 0 ;
Tobden 3:30484e9b750a 70 int counter = 0 ;
Tobden 3:30484e9b750a 71 char vstring[] = "X.XX\r\n" ;
Tobden 3:30484e9b750a 72
Tobden 3:30484e9b750a 73 tick2.attach_us(callback(&readA0), 10000); // ticks every 10ms
WilliamMarshQMUL 1:18e0f8aef32f 74 int update_us = 1000 ; // 1ms
WilliamMarshQMUL 0:5307f49cd305 75 while (true) {
Tobden 3:30484e9b750a 76 osEvent evt = mailbox.get(); // wait for mail
Tobden 3:30484e9b750a 77 if (evt.status == osEventMail) {
Tobden 3:30484e9b750a 78 message_t* mess = (message_t*)evt.value.p ;
Tobden 3:30484e9b750a 79 volts = (mess->analog * 330) / 0xffff ;
Tobden 3:30484e9b750a 80 mailbox.free(mess) ; // free the message space
Tobden 3:30484e9b750a 81
Tobden 3:30484e9b750a 82 //t = 1000000/((1+(49*volts/330))*64);
Tobden 3:30484e9b750a 83 //update_us = t;
Tobden 3:30484e9b750a 84 update_us = 1000000/((1+(49*volts/330))*64);
Tobden 3:30484e9b750a 85 tick.attach_us(callback(&writeAout), update_us);
Tobden 3:30484e9b750a 86 // if (volts > threshold) led1 = 0 ; else led1 = 1 ;
Tobden 3:30484e9b750a 87 vToString(volts, vstring) ;
Tobden 3:30484e9b750a 88 counter++ ;
Tobden 3:30484e9b750a 89 if (counter == 10) { // limit bandwidth of serial
Tobden 3:30484e9b750a 90 pc.printf(vstring) ;
Tobden 3:30484e9b750a 91 counter = 0 ;
Tobden 3:30484e9b750a 92 }
Tobden 3:30484e9b750a 93 }
Tobden 3:30484e9b750a 94 // setup ticker to write to AnalogOut
Tobden 3:30484e9b750a 95 //Thread::wait(30000) ; // wait 30 sec - 30000ms
Tobden 3:30484e9b750a 96 // The varying update time for the ticker
Tobden 3:30484e9b750a 97
Tobden 3:30484e9b750a 98 //tick.attach_us(callback(&writeAout), update_us); // setup ticker to write to AnalogOut
Tobden 3:30484e9b750a 99 // Thread::wait(30000) ; // wait 30 sec - 30000ms
Tobden 3:30484e9b750a 100 // update_us = 1000 ; // 1ms
WilliamMarshQMUL 0:5307f49cd305 101 }
WilliamMarshQMUL 0:5307f49cd305 102 }