Anastasios Barlas / Mbed OS DACandticker_sample_with_debug

Fork of DACandticker_sample_with_debug by William Marsh

Committer:
AnastasiosBarlas
Date:
Wed Feb 14 15:56:02 2018 +0000
Revision:
4:78ec71fcb981
Parent:
3:fcf87401c1b2
Version 3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnastasiosBarlas 3:fcf87401c1b2 1 //LAB 3 SAMPLE PROGRAM 2
AnastasiosBarlas 3:fcf87401c1b2 2 // Revised for mbed 5
WilliamMarshQMUL 1:284229960d6a 3
WilliamMarshQMUL 0:5307f49cd305 4 #include "mbed.h"
WilliamMarshQMUL 0:5307f49cd305 5 #include "sineTable.h"
WilliamMarshQMUL 0:5307f49cd305 6
AnastasiosBarlas 3:fcf87401c1b2 7 Ticker tickout ; // Creates periodic interrupt
WilliamMarshQMUL 0:5307f49cd305 8 AnalogOut ao(PTE30) ; // Analog output
WilliamMarshQMUL 0:5307f49cd305 9
AnastasiosBarlas 3:fcf87401c1b2 10 Ticker tick; // Ticker for reading analog
AnastasiosBarlas 3:fcf87401c1b2 11 AnalogIn ain(A0) ; // Analog input
AnastasiosBarlas 3:fcf87401c1b2 12 DigitalOut led1(LED_RED);
AnastasiosBarlas 3:fcf87401c1b2 13
AnastasiosBarlas 3:fcf87401c1b2 14
AnastasiosBarlas 3:fcf87401c1b2 15 Serial pc(USBTX, USBRX); // tx, rx, for debugging
AnastasiosBarlas 3:fcf87401c1b2 16
AnastasiosBarlas 3:fcf87401c1b2 17 // Message type
AnastasiosBarlas 3:fcf87401c1b2 18 typedef struct {
AnastasiosBarlas 3:fcf87401c1b2 19 uint16_t analog; /* Analog input value */
AnastasiosBarlas 3:fcf87401c1b2 20 } message_t;
AnastasiosBarlas 3:fcf87401c1b2 21
AnastasiosBarlas 3:fcf87401c1b2 22 // Mail box
AnastasiosBarlas 3:fcf87401c1b2 23 Mail<message_t, 2> mailbox;
WilliamMarshQMUL 0:5307f49cd305 24
AnastasiosBarlas 3:fcf87401c1b2 25 // Function called every 10ms to read ADC
AnastasiosBarlas 3:fcf87401c1b2 26 // Low pass filter
AnastasiosBarlas 3:fcf87401c1b2 27 // Every 10th value is sent to mailbox
AnastasiosBarlas 3:fcf87401c1b2 28 volatile int samples = 0 ;
AnastasiosBarlas 3:fcf87401c1b2 29 volatile uint16_t smoothed = 0 ;
AnastasiosBarlas 3:fcf87401c1b2 30 void readA0() {
AnastasiosBarlas 3:fcf87401c1b2 31 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
AnastasiosBarlas 3:fcf87401c1b2 32 samples++ ;
AnastasiosBarlas 3:fcf87401c1b2 33 if (samples == 10) {
AnastasiosBarlas 3:fcf87401c1b2 34 // send to thread
AnastasiosBarlas 3:fcf87401c1b2 35 message_t *mess = mailbox.alloc() ; // may fail but does not block
AnastasiosBarlas 3:fcf87401c1b2 36 if (mess) {
AnastasiosBarlas 3:fcf87401c1b2 37 mess->analog = smoothed ;
AnastasiosBarlas 3:fcf87401c1b2 38 mailbox.put(mess); // fails but does not block if full
AnastasiosBarlas 3:fcf87401c1b2 39 }
AnastasiosBarlas 3:fcf87401c1b2 40 samples = 0;
AnastasiosBarlas 3:fcf87401c1b2 41 }
WilliamMarshQMUL 0:5307f49cd305 42 }
WilliamMarshQMUL 0:5307f49cd305 43
AnastasiosBarlas 3:fcf87401c1b2 44 // Write voltage digits
AnastasiosBarlas 3:fcf87401c1b2 45 // v Voltage as scale int, e.g. 3.30 is 330
AnastasiosBarlas 3:fcf87401c1b2 46 void vToString(int v, char* s) {
AnastasiosBarlas 3:fcf87401c1b2 47 s[3] = '0' + (v % 10) ;
AnastasiosBarlas 3:fcf87401c1b2 48 v = v / 10 ;
AnastasiosBarlas 3:fcf87401c1b2 49 s[2] = '0' + (v % 10) ;
AnastasiosBarlas 3:fcf87401c1b2 50 v = v / 10 ;
AnastasiosBarlas 3:fcf87401c1b2 51 s[0] = '0' + (v % 10) ;
AnastasiosBarlas 3:fcf87401c1b2 52 }
WilliamMarshQMUL 0:5307f49cd305 53
AnastasiosBarlas 3:fcf87401c1b2 54 volatile int index = 0 ; // index into array of sin values
WilliamMarshQMUL 0:5307f49cd305 55 void writeAout() {
WilliamMarshQMUL 0:5307f49cd305 56 ao.write_u16(sine[index]) ;
WilliamMarshQMUL 0:5307f49cd305 57 index = (index + 1) % 64 ;
WilliamMarshQMUL 0:5307f49cd305 58 }
WilliamMarshQMUL 0:5307f49cd305 59
AnastasiosBarlas 3:fcf87401c1b2 60 // Main program
AnastasiosBarlas 3:fcf87401c1b2 61 // Initialise variables
AnastasiosBarlas 3:fcf87401c1b2 62 // Attach ISR for ticker
AnastasiosBarlas 3:fcf87401c1b2 63 // Procss messages from mailbox
WilliamMarshQMUL 0:5307f49cd305 64 int main() {
AnastasiosBarlas 3:fcf87401c1b2 65
AnastasiosBarlas 3:fcf87401c1b2 66 int update_us = 1000 ;
AnastasiosBarlas 3:fcf87401c1b2 67 float tempupdate = 0.0;
AnastasiosBarlas 3:fcf87401c1b2 68 int volts = 0;
AnastasiosBarlas 3:fcf87401c1b2 69 led1 = 1 ; // turn off
AnastasiosBarlas 3:fcf87401c1b2 70 int counter = 0 ;
AnastasiosBarlas 3:fcf87401c1b2 71 char vstring[] = "X.XX\r\n" ;
AnastasiosBarlas 3:fcf87401c1b2 72
AnastasiosBarlas 3:fcf87401c1b2 73 tick.attach_us(callback(&readA0), 10000); // ticks every 10ms
AnastasiosBarlas 3:fcf87401c1b2 74
AnastasiosBarlas 4:78ec71fcb981 75
AnastasiosBarlas 3:fcf87401c1b2 76 while (true)
AnastasiosBarlas 3:fcf87401c1b2 77 {
AnastasiosBarlas 3:fcf87401c1b2 78 osEvent evt = mailbox.get(); // wait for mail
AnastasiosBarlas 3:fcf87401c1b2 79 if (evt.status == osEventMail)
AnastasiosBarlas 3:fcf87401c1b2 80 {
AnastasiosBarlas 3:fcf87401c1b2 81 message_t* mess = (message_t*)evt.value.p ;
AnastasiosBarlas 3:fcf87401c1b2 82 volts = (mess->analog * 330) / 0xffff ;
AnastasiosBarlas 3:fcf87401c1b2 83 mailbox.free(mess) ; // free the message space
AnastasiosBarlas 3:fcf87401c1b2 84
AnastasiosBarlas 3:fcf87401c1b2 85 update_us = 1000000/((1+(49*volts/330))*64) ;
AnastasiosBarlas 3:fcf87401c1b2 86 tickout.detach() ;
AnastasiosBarlas 3:fcf87401c1b2 87 tickout.attach_us(callback(&writeAout), update_us);
AnastasiosBarlas 3:fcf87401c1b2 88
AnastasiosBarlas 3:fcf87401c1b2 89 // vToString(volts, vstring) ;
AnastasiosBarlas 3:fcf87401c1b2 90
AnastasiosBarlas 3:fcf87401c1b2 91 /* counter++ ;
AnastasiosBarlas 3:fcf87401c1b2 92 if (counter == 10) { // limit bandwidth of
AnastasiosBarlas 3:fcf87401c1b2 93 pc.printf(vstring);
AnastasiosBarlas 3:fcf87401c1b2 94 pc.printf("%d\n",update_us);
AnastasiosBarlas 3:fcf87401c1b2 95 counter = 0 ;
AnastasiosBarlas 3:fcf87401c1b2 96 }
AnastasiosBarlas 3:fcf87401c1b2 97 */
AnastasiosBarlas 3:fcf87401c1b2 98 }
AnastasiosBarlas 3:fcf87401c1b2 99
WilliamMarshQMUL 0:5307f49cd305 100 }
AnastasiosBarlas 3:fcf87401c1b2 101 }