lab3 task1

Fork of ADCandticker_sample by William Marsh

Committer:
dhenis
Date:
Fri Feb 09 23:06:47 2018 +0000
Revision:
2:79508365d27f
Parent:
1:126dd2f5fc2d
1s;

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