Lab 3 ADC

Fork of ADCandticker_sample by William Marsh

Committer:
Bossman
Date:
Fri Feb 09 21:00:57 2018 +0000
Revision:
2:9d5147fbeded
Parent:
1:126dd2f5fc2d
Version 1

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
Bossman 2:9d5147fbeded 10 DigitalOut lede1(PTD0); // Red LED
Bossman 2:9d5147fbeded 11 DigitalOut lede2(PTD5) ;
Bossman 2:9d5147fbeded 12 DigitalOut lede3(PTD2) ;
Bossman 2:9d5147fbeded 13 DigitalOut lede4(PTD3) ;
Bossman 2:9d5147fbeded 14 DigitalOut lede5(PTD1) ;
Bossman 2:9d5147fbeded 15 //InterruptIn button(PTD4);
WilliamMarshQMUL 0:ad3cdc525b99 16
WilliamMarshQMUL 0:ad3cdc525b99 17 Serial pc(USBTX, USBRX); // tx, rx, for debugging
WilliamMarshQMUL 0:ad3cdc525b99 18
Bossman 2:9d5147fbeded 19 DigitalIn b1(PTD4, PullUp);
Bossman 2:9d5147fbeded 20 Thread pollT ; // thread to poll
Bossman 2:9d5147fbeded 21 volatile int pressEvent=0;
Bossman 2:9d5147fbeded 22 enum buttonPos { up, down, bounce }; // Button positions // three options of button position
Bossman 2:9d5147fbeded 23
Bossman 2:9d5147fbeded 24 void polling() {
Bossman 2:9d5147fbeded 25 buttonPos pos = up ;// initial position
Bossman 2:9d5147fbeded 26 int bcounter = 0 ;
Bossman 2:9d5147fbeded 27 while (true) {
Bossman 2:9d5147fbeded 28 switch (pos) {
Bossman 2:9d5147fbeded 29 case up :
Bossman 2:9d5147fbeded 30 if (!b1.read()) { // now down
Bossman 2:9d5147fbeded 31 pressEvent = 1 ; // transition occurred
Bossman 2:9d5147fbeded 32 pos = down ; // action and update position
Bossman 2:9d5147fbeded 33 }
Bossman 2:9d5147fbeded 34 break ;
Bossman 2:9d5147fbeded 35 case down :
Bossman 2:9d5147fbeded 36 if (b1 == 1) { // no longer down. what the default value of b1?- > it depends and doesnt have initial value
Bossman 2:9d5147fbeded 37 bcounter = 3 ; // wait four cycles
Bossman 2:9d5147fbeded 38 pos = bounce ;
Bossman 2:9d5147fbeded 39 }
Bossman 2:9d5147fbeded 40 break ;
Bossman 2:9d5147fbeded 41 case bounce :
Bossman 2:9d5147fbeded 42 if (b1 == 0) { // down again - button has bounced
Bossman 2:9d5147fbeded 43 pos = down ; // no event
Bossman 2:9d5147fbeded 44 } else if (bcounter == 0) {
Bossman 2:9d5147fbeded 45 pos = up ; // delay passed - reset to up
Bossman 2:9d5147fbeded 46 } else {
Bossman 2:9d5147fbeded 47 bcounter-- ; // continue waiting
Bossman 2:9d5147fbeded 48 }
Bossman 2:9d5147fbeded 49 break ;
Bossman 2:9d5147fbeded 50 }
Bossman 2:9d5147fbeded 51 Thread::wait(30);
Bossman 2:9d5147fbeded 52 }
Bossman 2:9d5147fbeded 53 }
WilliamMarshQMUL 0:ad3cdc525b99 54 // Message type
WilliamMarshQMUL 0:ad3cdc525b99 55 typedef struct {
WilliamMarshQMUL 0:ad3cdc525b99 56 uint16_t analog; /* Analog input value */
WilliamMarshQMUL 0:ad3cdc525b99 57 } message_t;
WilliamMarshQMUL 0:ad3cdc525b99 58
WilliamMarshQMUL 0:ad3cdc525b99 59 // Mail box
WilliamMarshQMUL 0:ad3cdc525b99 60 Mail<message_t, 2> mailbox;
WilliamMarshQMUL 0:ad3cdc525b99 61
WilliamMarshQMUL 0:ad3cdc525b99 62 // Function called every 10ms to read ADC
WilliamMarshQMUL 0:ad3cdc525b99 63 // Low pass filter
WilliamMarshQMUL 0:ad3cdc525b99 64 // Every 10th value is sent to mailbox
WilliamMarshQMUL 0:ad3cdc525b99 65 volatile int samples = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 66 volatile uint16_t smoothed = 0 ;
Bossman 2:9d5147fbeded 67
Bossman 2:9d5147fbeded 68
Bossman 2:9d5147fbeded 69
Bossman 2:9d5147fbeded 70
WilliamMarshQMUL 0:ad3cdc525b99 71 void readA0() {
WilliamMarshQMUL 0:ad3cdc525b99 72 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
WilliamMarshQMUL 0:ad3cdc525b99 73 samples++ ;
WilliamMarshQMUL 0:ad3cdc525b99 74 if (samples == 10) {
WilliamMarshQMUL 0:ad3cdc525b99 75 // send to thread
WilliamMarshQMUL 0:ad3cdc525b99 76 message_t *mess = mailbox.alloc() ; // may fail but does not block
WilliamMarshQMUL 0:ad3cdc525b99 77 if (mess) {
WilliamMarshQMUL 0:ad3cdc525b99 78 mess->analog = smoothed ;
WilliamMarshQMUL 0:ad3cdc525b99 79 mailbox.put(mess); // fails but does not block if full
WilliamMarshQMUL 0:ad3cdc525b99 80 }
WilliamMarshQMUL 0:ad3cdc525b99 81 samples = 0;
WilliamMarshQMUL 0:ad3cdc525b99 82 }
WilliamMarshQMUL 0:ad3cdc525b99 83 }
WilliamMarshQMUL 0:ad3cdc525b99 84
WilliamMarshQMUL 0:ad3cdc525b99 85 // Write voltage digits
WilliamMarshQMUL 0:ad3cdc525b99 86 // v Voltage as scale int, e.g. 3.30 is 330
WilliamMarshQMUL 0:ad3cdc525b99 87 void vToString(int v, char* s) {
WilliamMarshQMUL 0:ad3cdc525b99 88 s[3] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 89 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 90 s[2] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 91 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 92 s[0] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 93 }
WilliamMarshQMUL 0:ad3cdc525b99 94
WilliamMarshQMUL 0:ad3cdc525b99 95 // Main program
WilliamMarshQMUL 0:ad3cdc525b99 96 // Initialise variables
WilliamMarshQMUL 0:ad3cdc525b99 97 // Attach ISR for ticker
WilliamMarshQMUL 0:ad3cdc525b99 98 // Procss messages from mailbox
WilliamMarshQMUL 0:ad3cdc525b99 99 int main() {
Bossman 2:9d5147fbeded 100
Bossman 2:9d5147fbeded 101
Bossman 2:9d5147fbeded 102 //led1 = 1 ; // turn off
WilliamMarshQMUL 0:ad3cdc525b99 103 int volts = 0 ;
Bossman 2:9d5147fbeded 104 //const int threshold = 100 ;
Bossman 2:9d5147fbeded 105 bool max_volts = false;
Bossman 2:9d5147fbeded 106 bool detector = false;
WilliamMarshQMUL 0:ad3cdc525b99 107 int counter = 0 ;
Bossman 2:9d5147fbeded 108 int threshold[6] = {55,110,165,220,275,330};
WilliamMarshQMUL 0:ad3cdc525b99 109 char vstring[] = "X.XX\r\n" ;
Bossman 2:9d5147fbeded 110 pollT.start(callback(polling));
Bossman 2:9d5147fbeded 111
WilliamMarshQMUL 0:ad3cdc525b99 112
WilliamMarshQMUL 0:ad3cdc525b99 113 tick.attach_us(callback(&readA0), 10000); // ticks every 10ms
WilliamMarshQMUL 0:ad3cdc525b99 114 while (true) {
Bossman 2:9d5147fbeded 115
Bossman 2:9d5147fbeded 116
Bossman 2:9d5147fbeded 117 osEvent evt = mailbox.get(); // wait for mail
Bossman 2:9d5147fbeded 118
Bossman 2:9d5147fbeded 119 if (pressEvent) { // main event
Bossman 2:9d5147fbeded 120 pressEvent = 0 ; // clear the event variable
Bossman 2:9d5147fbeded 121
Bossman 2:9d5147fbeded 122 max_volts = !max_volts;
Bossman 2:9d5147fbeded 123 detector = false;
Bossman 2:9d5147fbeded 124 }
Bossman 2:9d5147fbeded 125
WilliamMarshQMUL 0:ad3cdc525b99 126 if (evt.status == osEventMail) {
WilliamMarshQMUL 0:ad3cdc525b99 127 message_t* mess = (message_t*)evt.value.p ;
WilliamMarshQMUL 0:ad3cdc525b99 128 volts = (mess->analog * 330) / 0xffff ;
WilliamMarshQMUL 0:ad3cdc525b99 129 mailbox.free(mess) ; // free the message space
Bossman 2:9d5147fbeded 130
Bossman 2:9d5147fbeded 131 if ((volts<=(threshold[0]))&&(max_volts==false))
Bossman 2:9d5147fbeded 132 {
Bossman 2:9d5147fbeded 133
Bossman 2:9d5147fbeded 134 lede1 = 0;
Bossman 2:9d5147fbeded 135 lede2 = 0;
Bossman 2:9d5147fbeded 136 lede3 = 0;
Bossman 2:9d5147fbeded 137 lede4 = 0;
Bossman 2:9d5147fbeded 138 lede5 = 0;
Bossman 2:9d5147fbeded 139
Bossman 2:9d5147fbeded 140 }
Bossman 2:9d5147fbeded 141
Bossman 2:9d5147fbeded 142 else if ((volts<=threshold[1])&&(volts>threshold[0])&&(max_volts==false))
Bossman 2:9d5147fbeded 143 {
Bossman 2:9d5147fbeded 144
Bossman 2:9d5147fbeded 145 lede1 = 1;
Bossman 2:9d5147fbeded 146 lede2 = 0;
Bossman 2:9d5147fbeded 147 lede3 = 0;
Bossman 2:9d5147fbeded 148 lede4 = 0;
Bossman 2:9d5147fbeded 149 lede5 = 0;
Bossman 2:9d5147fbeded 150 }
Bossman 2:9d5147fbeded 151 else if ((volts<=threshold[2])&&(volts>threshold[1])&&(max_volts==false))
Bossman 2:9d5147fbeded 152 {
Bossman 2:9d5147fbeded 153
Bossman 2:9d5147fbeded 154 lede1 = 1;
Bossman 2:9d5147fbeded 155 lede2 = 1;
Bossman 2:9d5147fbeded 156 lede3 = 0;
Bossman 2:9d5147fbeded 157 lede4 = 0;
Bossman 2:9d5147fbeded 158 lede5 = 0;
Bossman 2:9d5147fbeded 159 }
Bossman 2:9d5147fbeded 160 else if ((volts<=threshold[3])&&(volts>threshold[2])&&(max_volts==false))
Bossman 2:9d5147fbeded 161 {
Bossman 2:9d5147fbeded 162
Bossman 2:9d5147fbeded 163 lede1 = 1;
Bossman 2:9d5147fbeded 164 lede2 = 1;
Bossman 2:9d5147fbeded 165 lede3 = 1;
Bossman 2:9d5147fbeded 166 lede4 = 0;
Bossman 2:9d5147fbeded 167 lede5 = 0;
Bossman 2:9d5147fbeded 168 }
Bossman 2:9d5147fbeded 169 else if ((volts<=threshold[4])&&(volts>threshold[3])&&(max_volts==false))
Bossman 2:9d5147fbeded 170 {
Bossman 2:9d5147fbeded 171
Bossman 2:9d5147fbeded 172 lede1 = 1;
Bossman 2:9d5147fbeded 173 lede2 = 1;
Bossman 2:9d5147fbeded 174 lede3 = 1;
Bossman 2:9d5147fbeded 175 lede4 = 1;
Bossman 2:9d5147fbeded 176 lede5 = 0;
Bossman 2:9d5147fbeded 177 }
Bossman 2:9d5147fbeded 178 else if (((volts<=threshold[5])&&(volts>threshold[4]))||(max_volts==true))
Bossman 2:9d5147fbeded 179 {
Bossman 2:9d5147fbeded 180
Bossman 2:9d5147fbeded 181 lede1 = 1;
Bossman 2:9d5147fbeded 182 lede2 = 1;
Bossman 2:9d5147fbeded 183 lede3 = 1;
Bossman 2:9d5147fbeded 184 lede4 = 1;
Bossman 2:9d5147fbeded 185 lede5 = 1;
Bossman 2:9d5147fbeded 186 if(volts >= threshold[4]){
Bossman 2:9d5147fbeded 187
Bossman 2:9d5147fbeded 188 max_volts = false;
Bossman 2:9d5147fbeded 189
Bossman 2:9d5147fbeded 190 }
Bossman 2:9d5147fbeded 191 }
Bossman 2:9d5147fbeded 192
Bossman 2:9d5147fbeded 193
Bossman 2:9d5147fbeded 194
Bossman 2:9d5147fbeded 195
Bossman 2:9d5147fbeded 196
Bossman 2:9d5147fbeded 197
WilliamMarshQMUL 0:ad3cdc525b99 198 vToString(volts, vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 199 counter++ ;
WilliamMarshQMUL 0:ad3cdc525b99 200 if (counter == 10) { // limit bandwidth of serial
WilliamMarshQMUL 0:ad3cdc525b99 201 pc.printf(vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 202 counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 203 }
WilliamMarshQMUL 0:ad3cdc525b99 204 }
WilliamMarshQMUL 0:ad3cdc525b99 205
WilliamMarshQMUL 0:ad3cdc525b99 206 }
WilliamMarshQMUL 0:ad3cdc525b99 207 }