ADCandticker_lab-3

Fork of ADCandticker_lab-3_edwin by Edwin Kadavy

Committer:
edwinkad
Date:
Thu Feb 01 18:05:47 2018 +0000
Revision:
2:fe6ada70739c
Parent:
1:126dd2f5fc2d
Child:
3:ac78d4a2dd3f
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WilliamMarshQMUL 0:ad3cdc525b99 1
WilliamMarshQMUL 0:ad3cdc525b99 2 // LAB 3 SAMPLE PROGRAM 1
WilliamMarshQMUL 1:126dd2f5fc2d 3 // Revised for mbed 5
WilliamMarshQMUL 0:ad3cdc525b99 4
WilliamMarshQMUL 0:ad3cdc525b99 5 #include "mbed.h"
WilliamMarshQMUL 1:126dd2f5fc2d 6
WilliamMarshQMUL 0:ad3cdc525b99 7
WilliamMarshQMUL 0:ad3cdc525b99 8 Ticker tick; // Ticker for reading analog
WilliamMarshQMUL 0:ad3cdc525b99 9 AnalogIn ain(A0) ; // Analog input
edwinkad 2:fe6ada70739c 10 DigitalOut led1(PTA13); // Red LED
edwinkad 2:fe6ada70739c 11 DigitalOut led2(PTD3); // Red LED
edwinkad 2:fe6ada70739c 12 DigitalOut led3(PTD2); // Red LED
edwinkad 2:fe6ada70739c 13 DigitalOut led4(PTD0); // Red LED
edwinkad 2:fe6ada70739c 14 DigitalOut led5(PTD5); // Red LED
edwinkad 2:fe6ada70739c 15
WilliamMarshQMUL 0:ad3cdc525b99 16
WilliamMarshQMUL 0:ad3cdc525b99 17 Serial pc(USBTX, USBRX); // tx, rx, for debugging
WilliamMarshQMUL 0:ad3cdc525b99 18
WilliamMarshQMUL 0:ad3cdc525b99 19 // Message type
WilliamMarshQMUL 0:ad3cdc525b99 20 typedef struct {
edwinkad 2:fe6ada70739c 21 uint16_t analog; /* Analog input value */
WilliamMarshQMUL 0:ad3cdc525b99 22 } message_t;
WilliamMarshQMUL 0:ad3cdc525b99 23
WilliamMarshQMUL 0:ad3cdc525b99 24 // Mail box
WilliamMarshQMUL 0:ad3cdc525b99 25 Mail<message_t, 2> mailbox;
WilliamMarshQMUL 0:ad3cdc525b99 26
WilliamMarshQMUL 0:ad3cdc525b99 27 // Function called every 10ms to read ADC
edwinkad 2:fe6ada70739c 28 // Low pass filter
WilliamMarshQMUL 0:ad3cdc525b99 29 // Every 10th value is sent to mailbox
WilliamMarshQMUL 0:ad3cdc525b99 30 volatile int samples = 0 ;
edwinkad 2:fe6ada70739c 31 volatile uint16_t smoothed = 0 ;
edwinkad 2:fe6ada70739c 32 void readA0()
edwinkad 2:fe6ada70739c 33 {
WilliamMarshQMUL 0:ad3cdc525b99 34 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
WilliamMarshQMUL 0:ad3cdc525b99 35 samples++ ;
WilliamMarshQMUL 0:ad3cdc525b99 36 if (samples == 10) {
WilliamMarshQMUL 0:ad3cdc525b99 37 // send to thread
WilliamMarshQMUL 0:ad3cdc525b99 38 message_t *mess = mailbox.alloc() ; // may fail but does not block
WilliamMarshQMUL 0:ad3cdc525b99 39 if (mess) {
WilliamMarshQMUL 0:ad3cdc525b99 40 mess->analog = smoothed ;
WilliamMarshQMUL 0:ad3cdc525b99 41 mailbox.put(mess); // fails but does not block if full
WilliamMarshQMUL 0:ad3cdc525b99 42 }
WilliamMarshQMUL 0:ad3cdc525b99 43 samples = 0;
edwinkad 2:fe6ada70739c 44 }
WilliamMarshQMUL 0:ad3cdc525b99 45 }
WilliamMarshQMUL 0:ad3cdc525b99 46
WilliamMarshQMUL 0:ad3cdc525b99 47 // Write voltage digits
WilliamMarshQMUL 0:ad3cdc525b99 48 // v Voltage as scale int, e.g. 3.30 is 330
edwinkad 2:fe6ada70739c 49 void vToString(int v, char* s)
edwinkad 2:fe6ada70739c 50 {
WilliamMarshQMUL 0:ad3cdc525b99 51 s[3] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 52 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 53 s[2] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 54 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 55 s[0] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 56 }
WilliamMarshQMUL 0:ad3cdc525b99 57
WilliamMarshQMUL 0:ad3cdc525b99 58 // Main program
WilliamMarshQMUL 0:ad3cdc525b99 59 // Initialise variables
WilliamMarshQMUL 0:ad3cdc525b99 60 // Attach ISR for ticker
edwinkad 2:fe6ada70739c 61 // Procss messages from mailbox
edwinkad 2:fe6ada70739c 62 int main()
edwinkad 2:fe6ada70739c 63 {
edwinkad 2:fe6ada70739c 64 led1 = 1 ; // turn off
WilliamMarshQMUL 0:ad3cdc525b99 65 int volts = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 66 const int threshold = 100 ;
WilliamMarshQMUL 0:ad3cdc525b99 67 int counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 68 char vstring[] = "X.XX\r\n" ;
WilliamMarshQMUL 0:ad3cdc525b99 69
WilliamMarshQMUL 0:ad3cdc525b99 70 tick.attach_us(callback(&readA0), 10000); // ticks every 10ms
WilliamMarshQMUL 0:ad3cdc525b99 71 while (true) {
edwinkad 2:fe6ada70739c 72 osEvent evt = mailbox.get(); // wait for mail
WilliamMarshQMUL 0:ad3cdc525b99 73 if (evt.status == osEventMail) {
WilliamMarshQMUL 0:ad3cdc525b99 74 message_t* mess = (message_t*)evt.value.p ;
WilliamMarshQMUL 0:ad3cdc525b99 75 volts = (mess->analog * 330) / 0xffff ;
WilliamMarshQMUL 0:ad3cdc525b99 76 mailbox.free(mess) ; // free the message space
edwinkad 2:fe6ada70739c 77 if (volts > 55 && volts < 109) {
edwinkad 2:fe6ada70739c 78 led1 = 1 ;
edwinkad 2:fe6ada70739c 79 led2 = 0 ;
edwinkad 2:fe6ada70739c 80 led3 = 0 ;
edwinkad 2:fe6ada70739c 81 led4 = 0 ;
edwinkad 2:fe6ada70739c 82 led5 = 0 ;
edwinkad 2:fe6ada70739c 83 } else if (volts > 110 && volts < 164) {
edwinkad 2:fe6ada70739c 84 led1 = 1 ;
edwinkad 2:fe6ada70739c 85 led2 = 1 ;
edwinkad 2:fe6ada70739c 86 led3 = 0 ;
edwinkad 2:fe6ada70739c 87 led4 = 0 ;
edwinkad 2:fe6ada70739c 88 led5 = 0 ;
edwinkad 2:fe6ada70739c 89 } else if (volts > 165 && volts < 219) {
edwinkad 2:fe6ada70739c 90 led1 = 1 ;
edwinkad 2:fe6ada70739c 91 led2 = 1 ;
edwinkad 2:fe6ada70739c 92 led3 = 1 ;
edwinkad 2:fe6ada70739c 93 led4 = 0 ;
edwinkad 2:fe6ada70739c 94 led5 = 0 ;
edwinkad 2:fe6ada70739c 95 } else if (volts > 220 && volts < 274) {
edwinkad 2:fe6ada70739c 96 led1 = 1 ;
edwinkad 2:fe6ada70739c 97 led2 = 1 ;
edwinkad 2:fe6ada70739c 98 led3 = 1 ;
edwinkad 2:fe6ada70739c 99 led4 = 1 ;
edwinkad 2:fe6ada70739c 100 led5 = 0 ;
edwinkad 2:fe6ada70739c 101 } else if (volts > 275) {
edwinkad 2:fe6ada70739c 102 led1 = 1 ;
edwinkad 2:fe6ada70739c 103 led2 = 1 ;
edwinkad 2:fe6ada70739c 104 led3 = 1 ;
edwinkad 2:fe6ada70739c 105 led4 = 1 ;
edwinkad 2:fe6ada70739c 106 led5 = 1 ;
edwinkad 2:fe6ada70739c 107 } else {
edwinkad 2:fe6ada70739c 108 led1 = 0 ;
edwinkad 2:fe6ada70739c 109 led2 = 0 ;
edwinkad 2:fe6ada70739c 110 led3 = 0 ;
edwinkad 2:fe6ada70739c 111 led4 = 0 ;
edwinkad 2:fe6ada70739c 112 led5 = 0 ;
edwinkad 2:fe6ada70739c 113 }
WilliamMarshQMUL 0:ad3cdc525b99 114 vToString(volts, vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 115 counter++ ;
WilliamMarshQMUL 0:ad3cdc525b99 116 if (counter == 10) { // limit bandwidth of serial
WilliamMarshQMUL 0:ad3cdc525b99 117 pc.printf(vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 118 counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 119 }
WilliamMarshQMUL 0:ad3cdc525b99 120 }
WilliamMarshQMUL 0:ad3cdc525b99 121
WilliamMarshQMUL 0:ad3cdc525b99 122 }
WilliamMarshQMUL 0:ad3cdc525b99 123 }