Edwin Kadavy / Mbed OS ADCandticker_lab-3_edwin

Fork of ADCandticker_sample by William Marsh

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 // LAB 3 SAMPLE PROGRAM 1
00003 //   Revised for mbed 5
00004 
00005 #include "mbed.h"
00006 
00007 
00008 Ticker tick;                // Ticker for reading analog
00009 AnalogIn ain(A0) ;          // Analog input
00010 DigitalOut led1(PTA13);   // Red LED
00011 DigitalOut led2(PTD3);   // Red LED
00012 DigitalOut led3(PTD2);   // Red LED
00013 DigitalOut led4(PTD0);   // Red LED
00014 DigitalOut led5(PTD5);   // Red LED
00015 
00016 
00017 Serial pc(USBTX, USBRX); // tx, rx, for debugging
00018 
00019 // Message type
00020 typedef struct {
00021     uint16_t analog; /* Analog input value */
00022 } message_t;
00023 
00024 // Mail box
00025 Mail<message_t, 2> mailbox;
00026 
00027 // Function called every 10ms to read ADC
00028 // Low pass filter
00029 // Every 10th value is sent to mailbox
00030 volatile int samples = 0 ;
00031 volatile uint16_t smoothed = 0 ;
00032 void readA0()
00033 {
00034     smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
00035     samples++ ;
00036     if (samples == 10) {
00037         // send to thread
00038         message_t *mess = mailbox.alloc() ; // may fail but does not block
00039         if (mess) {
00040             mess->analog = smoothed ;
00041             mailbox.put(mess); // fails but does not block if full
00042         }
00043         samples = 0;
00044     }
00045 }
00046 
00047 // Write voltage digits
00048 //   v  Voltage as scale int, e.g. 3.30 is 330
00049 void vToString(int v, char* s)
00050 {
00051     s[3] = '0' + (v % 10) ;
00052     v = v / 10 ;
00053     s[2] = '0' + (v % 10) ;
00054     v = v / 10 ;
00055     s[0] = '0' + (v % 10) ;
00056 }
00057 
00058 // Main program
00059 //   Initialise variables
00060 //   Attach ISR for ticker
00061 //   Procss messages from mailbox
00062 int main()
00063 {
00064     led1 = 1 ; // turn off
00065     int volts = 0 ;
00066     const int threshold = 100 ;
00067     int counter = 0 ;
00068     char vstring[] = "X.XX\r\n" ;
00069 
00070     tick.attach_us(callback(&readA0), 10000); // ticks every 10ms
00071     while (true) {
00072         osEvent evt = mailbox.get(); // wait for mail
00073         if (evt.status == osEventMail) {
00074             message_t* mess = (message_t*)evt.value.p ;
00075             volts = (mess->analog * 330) / 0xffff ;
00076             mailbox.free(mess) ;  // free the message space
00077             if (volts > 55 && volts < 109) {
00078                 led1 = 1 ;
00079                 led2 = 0 ;
00080                 led3 = 0 ;
00081                 led4 = 0 ;
00082                 led5 = 0 ;
00083             } else if (volts > 110 && volts < 164) {
00084                 led1 = 1 ;
00085                 led2 = 1 ;
00086                 led3 = 0 ;
00087                 led4 = 0 ;
00088                 led5 = 0 ;
00089             } else if (volts > 165 && volts < 219) {
00090                 led1 = 1 ;
00091                 led2 = 1 ;
00092                 led3 = 1 ;
00093                 led4 = 0 ;
00094                 led5 = 0 ;
00095             } else if (volts > 220 && volts < 274) {
00096                 led1 = 1 ;
00097                 led2 = 1 ;
00098                 led3 = 1 ;
00099                 led4 = 1 ;
00100                 led5 = 0 ;
00101             } else if (volts > 275) {
00102                 led1 = 1 ;
00103                 led2 = 1 ;
00104                 led3 = 1 ;
00105                 led4 = 1 ;
00106                 led5 = 1 ;
00107             } else {
00108                 led1 = 0 ;
00109                 led2 = 0 ;
00110                 led3 = 0 ;
00111                 led4 = 0 ;
00112                 led5 = 0 ;
00113             }
00114             vToString(volts, vstring) ;
00115             counter++ ;
00116             if (counter == 10) {  // limit bandwidth of serial
00117                 pc.printf(vstring) ;
00118                 counter = 0 ;
00119             }
00120         }
00121 
00122     }
00123 }