Lab3-task1
Fork of ADCandticker_sample by
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 00002 // LAB 3 SAMPLE PROGRAM 1 00003 // Revised for mbed 5 00004 00005 #include "mbed.h" 00006 00007 00008 00009 Ticker tick; // Ticker for reading analog 00010 AnalogIn ain(A0) ; // Analog input 00011 DigitalOut led1(LED_RED); 00012 00013 DigitalOut lede1(PTD4) ; // Extend LED 00014 DigitalOut lede2(PTD5) ; 00015 DigitalOut lede3(PTD2) ; 00016 DigitalOut lede4(PTD3) ; 00017 DigitalOut lede5(PTD1) ; 00018 00019 00020 InterruptIn button(PTD0); //add button 00021 volatile int pressEvent = 0 ; 00022 00023 void buttonCallback() 00024 { 00025 pressEvent = 1; 00026 } 00027 00028 Serial pc(USBTX, USBRX); // tx, rx, for debugging 00029 00030 // Message type 00031 typedef struct { 00032 uint16_t analog; /* Analog input value */ 00033 } message_t; 00034 00035 // Mail box 00036 Mail<message_t, 2> mailbox; 00037 00038 // Function called every 10ms to read ADC 00039 // Low pass filter 00040 // Every 10th value is sent to mailbox 00041 volatile int samples = 0 ; 00042 volatile uint16_t smoothed = 0 ; 00043 void readA0() { 00044 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ; 00045 samples++ ; 00046 if (samples == 10) { 00047 // send to thread 00048 message_t *mess = mailbox.alloc() ; // may fail but does not block 00049 if (mess) { 00050 mess->analog = smoothed ; 00051 mailbox.put(mess); // fails but does not block if full 00052 } 00053 samples = 0; 00054 } 00055 } 00056 00057 // Write voltage digits 00058 // v Voltage as scale int, e.g. 3.30 is 330 00059 void vToString(int v, char* s) { 00060 s[3] = '0' + (v % 10) ; 00061 v = v / 10 ; 00062 s[2] = '0' + (v % 10) ; 00063 v = v / 10 ; 00064 s[0] = '0' + (v % 10) ; 00065 } 00066 00067 // Main program 00068 // Initialise variables 00069 // Attach ISR for ticker 00070 // Procss messages from mailbox 00071 int main() { 00072 button.mode(PullUp); 00073 button.fall(&buttonCallback); 00074 00075 led1 = 1 ; // turn off 00076 // led2 = 0; 00077 int volts = 0.0 ; 00078 // const int vToString = 100 ; 00079 // const int threshold = 55; 00080 // const std::array <int,6>threshold{55,110,165,220,275,330}; 00081 int threshold[6] = {55,110,165,220,275,330}; 00082 int counter = 0 ; 00083 char vstring[] = "X.XX\r\n" ; 00084 00085 00086 tick.attach_us(callback(&readA0), 10000); // ticks every 10ms 00087 00088 // tick1.attach_us(callback(&readA0), 10000); // ticks every 10ms 00089 while (true) { 00090 if (pressEvent == 1) 00091 { 00092 for(int i =0;i<6;i++) 00093 { 00094 threshold[i] = (volts/6)*(i+1); 00095 00096 pressEvent = 0; 00097 } 00098 } 00099 00100 osEvent evt = mailbox.get(); // wait for mail 00101 if (evt.status == osEventMail) { 00102 message_t* mess = (message_t*)evt.value.p ; 00103 volts = (mess->analog * 330) / 0xffff ; 00104 mailbox.free(mess) ; // free the message space 00105 00106 if (volts<=(threshold[0])) 00107 { 00108 led1 = 1 ; 00109 lede1 = 0; 00110 lede2 = 0; 00111 lede3 = 0; 00112 lede4 = 0; 00113 lede5 = 0; 00114 } 00115 00116 if ((volts<=threshold[1])&&(volts>threshold[0])) 00117 { 00118 led1 = 1 ; 00119 lede1 = 1; 00120 lede2 = 0; 00121 lede3 = 0; 00122 lede4 = 0; 00123 lede5 = 0; 00124 } 00125 if ((volts<=threshold[2])&&(volts>threshold[1])) 00126 { 00127 led1 = 1 ; 00128 lede1 = 1; 00129 lede2 = 1; 00130 lede3 = 0; 00131 lede4 = 0; 00132 lede5 = 0; 00133 } 00134 if ((volts<=threshold[3])&&(volts>threshold[2])) 00135 { 00136 led1 = 1 ; 00137 lede1 = 1; 00138 lede2 = 1; 00139 lede3 = 1; 00140 lede4 = 0; 00141 lede5 = 0; 00142 } 00143 if ((volts<=threshold[4])&&(volts>threshold[3])) 00144 { 00145 led1 = 0 ; 00146 lede1 = 1; 00147 lede2 = 1; 00148 lede3 = 1; 00149 lede4 = 1; 00150 lede5 = 0; 00151 } 00152 if ((volts<=threshold[5])&&(volts>threshold[4])) 00153 { 00154 led1 = 0 ; 00155 lede1 = 1; 00156 lede2 = 1; 00157 lede3 = 1; 00158 lede4 = 1; 00159 lede5 = 1; 00160 } 00161 vToString(volts, vstring) ; 00162 // vToString(threshold[5], vstring1) ; 00163 counter++ ; 00164 if (counter == 10) { // limit bandwidth of serial 00165 { 00166 pc.printf(vstring); 00167 // 00168 00169 } 00170 counter = 0 ; 00171 } 00172 } 00173 00174 } 00175 }
Generated on Sun Jul 31 2022 05:48:57 by
1.7.2
