ADCandticker_lab-3

Fork of ADCandticker_lab-3_edwin by Edwin Kadavy

Committer:
edwinkad
Date:
Sun Feb 11 21:00:45 2018 +0000
Revision:
3:ac78d4a2dd3f
Parent:
2:fe6ada70739c
Edwin;

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 Ticker tick; // Ticker for reading analog
WilliamMarshQMUL 0:ad3cdc525b99 8 AnalogIn ain(A0) ; // Analog input
edwinkad 3:ac78d4a2dd3f 9 DigitalIn b1(PTC9, PullUp);
edwinkad 3:ac78d4a2dd3f 10 DigitalOut led1(PTA13); // Red LED
edwinkad 3:ac78d4a2dd3f 11 DigitalOut led2(PTD5); // Yellow LED
edwinkad 3:ac78d4a2dd3f 12 DigitalOut led3(PTD0); // Green LED
edwinkad 3:ac78d4a2dd3f 13 DigitalOut led4(PTD2); // Green LED
edwinkad 3:ac78d4a2dd3f 14 DigitalOut led5(PTD3); // Green 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
edwinkad 3:ac78d4a2dd3f 27
WilliamMarshQMUL 0:ad3cdc525b99 28 // Function called every 10ms to read ADC
edwinkad 2:fe6ada70739c 29 // Low pass filter
WilliamMarshQMUL 0:ad3cdc525b99 30 // Every 10th value is sent to mailbox
WilliamMarshQMUL 0:ad3cdc525b99 31 volatile int samples = 0 ;
edwinkad 2:fe6ada70739c 32 volatile uint16_t smoothed = 0 ;
edwinkad 2:fe6ada70739c 33 void readA0()
edwinkad 2:fe6ada70739c 34 {
WilliamMarshQMUL 0:ad3cdc525b99 35 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
WilliamMarshQMUL 0:ad3cdc525b99 36 samples++ ;
WilliamMarshQMUL 0:ad3cdc525b99 37 if (samples == 10) {
WilliamMarshQMUL 0:ad3cdc525b99 38 // send to thread
WilliamMarshQMUL 0:ad3cdc525b99 39 message_t *mess = mailbox.alloc() ; // may fail but does not block
WilliamMarshQMUL 0:ad3cdc525b99 40 if (mess) {
WilliamMarshQMUL 0:ad3cdc525b99 41 mess->analog = smoothed ;
WilliamMarshQMUL 0:ad3cdc525b99 42 mailbox.put(mess); // fails but does not block if full
WilliamMarshQMUL 0:ad3cdc525b99 43 }
WilliamMarshQMUL 0:ad3cdc525b99 44 samples = 0;
edwinkad 2:fe6ada70739c 45 }
WilliamMarshQMUL 0:ad3cdc525b99 46 }
WilliamMarshQMUL 0:ad3cdc525b99 47
WilliamMarshQMUL 0:ad3cdc525b99 48 // Write voltage digits
WilliamMarshQMUL 0:ad3cdc525b99 49 // v Voltage as scale int, e.g. 3.30 is 330
edwinkad 2:fe6ada70739c 50 void vToString(int v, char* s)
edwinkad 2:fe6ada70739c 51 {
WilliamMarshQMUL 0:ad3cdc525b99 52 s[3] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 53 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 54 s[2] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 55 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 56 s[0] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 57 }
edwinkad 3:ac78d4a2dd3f 58 Thread pollV; // thread to set new max voltage
edwinkad 3:ac78d4a2dd3f 59 volatile int pressEvent = 0 ; // Variabe set by the polling thread
edwinkad 3:ac78d4a2dd3f 60 enum buttonPos { up, down, bounce }; // Button positions
edwinkad 3:ac78d4a2dd3f 61
edwinkad 3:ac78d4a2dd3f 62 void switchPoll(){
edwinkad 3:ac78d4a2dd3f 63 buttonPos pos = up ;
edwinkad 3:ac78d4a2dd3f 64 int bcounter = 0 ;
edwinkad 3:ac78d4a2dd3f 65 while (true) {
edwinkad 3:ac78d4a2dd3f 66 switch (pos) {
edwinkad 3:ac78d4a2dd3f 67 case up :
edwinkad 3:ac78d4a2dd3f 68 if (!b1.read()) { // now down
edwinkad 3:ac78d4a2dd3f 69 pressEvent = 1 ; // transition occurred
edwinkad 3:ac78d4a2dd3f 70 pos = down ;
edwinkad 3:ac78d4a2dd3f 71 }
edwinkad 3:ac78d4a2dd3f 72 break ;
edwinkad 3:ac78d4a2dd3f 73 case down :
edwinkad 3:ac78d4a2dd3f 74 if (b1 == 1) { // no longer down
edwinkad 3:ac78d4a2dd3f 75 bcounter = 3 ; // wait four cycles
edwinkad 3:ac78d4a2dd3f 76 pos = bounce ;
edwinkad 3:ac78d4a2dd3f 77 }
edwinkad 3:ac78d4a2dd3f 78 break ;
edwinkad 3:ac78d4a2dd3f 79 case bounce :
edwinkad 3:ac78d4a2dd3f 80 if (b1 == 0) { // down again - button has bounced
edwinkad 3:ac78d4a2dd3f 81 pos = down ; // no event
edwinkad 3:ac78d4a2dd3f 82 } else if (bcounter == 0) {
edwinkad 3:ac78d4a2dd3f 83 pos = up ; // delay passed - reset to up
edwinkad 3:ac78d4a2dd3f 84 } else {
edwinkad 3:ac78d4a2dd3f 85 bcounter-- ; // continue waiting
edwinkad 3:ac78d4a2dd3f 86 }
edwinkad 3:ac78d4a2dd3f 87 break ;
edwinkad 3:ac78d4a2dd3f 88 }
edwinkad 3:ac78d4a2dd3f 89 Thread::wait(30);
edwinkad 3:ac78d4a2dd3f 90 }
edwinkad 3:ac78d4a2dd3f 91 }
WilliamMarshQMUL 0:ad3cdc525b99 92
WilliamMarshQMUL 0:ad3cdc525b99 93 // Main program
WilliamMarshQMUL 0:ad3cdc525b99 94 // Initialise variables
WilliamMarshQMUL 0:ad3cdc525b99 95 // Attach ISR for ticker
edwinkad 2:fe6ada70739c 96 // Procss messages from mailbox
edwinkad 2:fe6ada70739c 97 int main()
edwinkad 2:fe6ada70739c 98 {
edwinkad 3:ac78d4a2dd3f 99 pollV.start(callback(switchPoll));
edwinkad 3:ac78d4a2dd3f 100 //led1 = 1 ; // turn off
WilliamMarshQMUL 0:ad3cdc525b99 101 int volts = 0 ;
edwinkad 3:ac78d4a2dd3f 102 int newVolts=330;
WilliamMarshQMUL 0:ad3cdc525b99 103 const int threshold = 100 ;
WilliamMarshQMUL 0:ad3cdc525b99 104 int counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 105 char vstring[] = "X.XX\r\n" ;
WilliamMarshQMUL 0:ad3cdc525b99 106
WilliamMarshQMUL 0:ad3cdc525b99 107 tick.attach_us(callback(&readA0), 10000); // ticks every 10ms
WilliamMarshQMUL 0:ad3cdc525b99 108 while (true) {
edwinkad 2:fe6ada70739c 109 osEvent evt = mailbox.get(); // wait for mail
WilliamMarshQMUL 0:ad3cdc525b99 110 if (evt.status == osEventMail) {
WilliamMarshQMUL 0:ad3cdc525b99 111 message_t* mess = (message_t*)evt.value.p ;
WilliamMarshQMUL 0:ad3cdc525b99 112 volts = (mess->analog * 330) / 0xffff ;
edwinkad 3:ac78d4a2dd3f 113 if (pressEvent) {
edwinkad 3:ac78d4a2dd3f 114 pressEvent = 0 ; // clear the event variable
edwinkad 3:ac78d4a2dd3f 115 newVolts=volts;
edwinkad 3:ac78d4a2dd3f 116 }
WilliamMarshQMUL 0:ad3cdc525b99 117 mailbox.free(mess) ; // free the message space
edwinkad 3:ac78d4a2dd3f 118 if (volts >= ((newVolts/6)*1) && volts < ((newVolts/6)*2)) {
edwinkad 2:fe6ada70739c 119 led1 = 1 ;
edwinkad 2:fe6ada70739c 120 led2 = 0 ;
edwinkad 2:fe6ada70739c 121 led3 = 0 ;
edwinkad 2:fe6ada70739c 122 led4 = 0 ;
edwinkad 2:fe6ada70739c 123 led5 = 0 ;
edwinkad 3:ac78d4a2dd3f 124 } else if (volts >= ((newVolts/6)*2) && volts < ((newVolts/6)*3)) {
edwinkad 2:fe6ada70739c 125 led1 = 1 ;
edwinkad 2:fe6ada70739c 126 led2 = 1 ;
edwinkad 2:fe6ada70739c 127 led3 = 0 ;
edwinkad 2:fe6ada70739c 128 led4 = 0 ;
edwinkad 2:fe6ada70739c 129 led5 = 0 ;
edwinkad 3:ac78d4a2dd3f 130 } else if (volts >= ((newVolts/6)*3) && volts < ((newVolts/6)*4)) {
edwinkad 2:fe6ada70739c 131 led1 = 1 ;
edwinkad 2:fe6ada70739c 132 led2 = 1 ;
edwinkad 2:fe6ada70739c 133 led3 = 1 ;
edwinkad 2:fe6ada70739c 134 led4 = 0 ;
edwinkad 2:fe6ada70739c 135 led5 = 0 ;
edwinkad 3:ac78d4a2dd3f 136 } else if (volts >= ((newVolts/6)*4) && volts < ((newVolts/6)*5)) {
edwinkad 2:fe6ada70739c 137 led1 = 1 ;
edwinkad 2:fe6ada70739c 138 led2 = 1 ;
edwinkad 2:fe6ada70739c 139 led3 = 1 ;
edwinkad 2:fe6ada70739c 140 led4 = 1 ;
edwinkad 2:fe6ada70739c 141 led5 = 0 ;
edwinkad 3:ac78d4a2dd3f 142 } else if (volts >= ((newVolts/6)*5)) {
edwinkad 2:fe6ada70739c 143 led1 = 1 ;
edwinkad 2:fe6ada70739c 144 led2 = 1 ;
edwinkad 2:fe6ada70739c 145 led3 = 1 ;
edwinkad 2:fe6ada70739c 146 led4 = 1 ;
edwinkad 2:fe6ada70739c 147 led5 = 1 ;
edwinkad 2:fe6ada70739c 148 } else {
edwinkad 2:fe6ada70739c 149 led1 = 0 ;
edwinkad 2:fe6ada70739c 150 led2 = 0 ;
edwinkad 2:fe6ada70739c 151 led3 = 0 ;
edwinkad 2:fe6ada70739c 152 led4 = 0 ;
edwinkad 2:fe6ada70739c 153 led5 = 0 ;
edwinkad 2:fe6ada70739c 154 }
WilliamMarshQMUL 0:ad3cdc525b99 155 vToString(volts, vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 156 counter++ ;
WilliamMarshQMUL 0:ad3cdc525b99 157 if (counter == 10) { // limit bandwidth of serial
WilliamMarshQMUL 0:ad3cdc525b99 158 pc.printf(vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 159 counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 160 }
WilliamMarshQMUL 0:ad3cdc525b99 161 }
WilliamMarshQMUL 0:ad3cdc525b99 162
WilliamMarshQMUL 0:ad3cdc525b99 163 }
WilliamMarshQMUL 0:ad3cdc525b99 164 }