embed simulator

Dependencies:   mbed C12832

Committer:
kwstasfane1
Date:
Thu Apr 22 16:40:49 2021 +0000
Revision:
5:faf243e88b50
Parent:
4:ce121f9e6db5
submitted code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kwstasfane1 5:faf243e88b50 1 /* Written by Konstantinos Fane */
kwstasfane1 0:167e85b50250 2
kwstasfane1 0:167e85b50250 3 #include "mbed.h"
kwstasfane1 0:167e85b50250 4 #include <string>
kwstasfane1 0:167e85b50250 5 #include "C12832.h"
kwstasfane1 0:167e85b50250 6
kwstasfane1 0:167e85b50250 7 // LCD display
kwstasfane1 0:167e85b50250 8 C12832 lcd(p5, p7, p6, p8, p11);
kwstasfane1 0:167e85b50250 9
kwstasfane1 0:167e85b50250 10 //dummy measurement values
kwstasfane1 0:167e85b50250 11 float m_freq_hz; // = 120730.546423; //*10^6 Hz
kwstasfane1 3:e3e73c36a565 12 float m_t_interval_ms; //= 988.056475;
kwstasfane1 0:167e85b50250 13
kwstasfane1 0:167e85b50250 14 //result to be displayed
kwstasfane1 0:167e85b50250 15 float m_result;
kwstasfane1 0:167e85b50250 16
kwstasfane1 0:167e85b50250 17 //variables used for frequency, period and time interval measruements
kwstasfane1 0:167e85b50250 18 float count1 = 0.0;
kwstasfane1 3:e3e73c36a565 19 float ton = 0.0;
kwstasfane1 3:e3e73c36a565 20 float toff = 0.0;
kwstasfane1 3:e3e73c36a565 21 float period = 0.0;
kwstasfane1 0:167e85b50250 22
kwstasfane1 0:167e85b50250 23 const char* range_scale [3][3] = {
kwstasfane1 0:167e85b50250 24 {"MHz","KHz","Hz"},
kwstasfane1 0:167e85b50250 25 {"ms","ms","s"},
kwstasfane1 0:167e85b50250 26 {"ms","ms","s"}
kwstasfane1 0:167e85b50250 27 };
kwstasfane1 0:167e85b50250 28
kwstasfane1 5:faf243e88b50 29 /* flag to hold which measurement mode to display, 0 = Frequency Measurement
kwstasfane1 5:faf243e88b50 30 * 1 = Period Measurement, 2 = Time interval Measurement
kwstasfane1 0:167e85b50250 31 * to match the index of message display arrays */
kwstasfane1 0:167e85b50250 32 int dsp_mode = 0;
kwstasfane1 0:167e85b50250 33 const char* mode_msg [] = {"Frequency", "Period", "Time Interval"};
kwstasfane1 0:167e85b50250 34
kwstasfane1 0:167e85b50250 35 /* flag to hold which measurement range to display
kwstasfane1 5:faf243e88b50 36 * 0 = High Range, 1 = Medium Range, 2 = Low Range */
kwstasfane1 0:167e85b50250 37 int dsp_range = 0;
kwstasfane1 0:167e85b50250 38 const char* range_msg [] = {"High Resolution", "Medium Resolution", "Low Resolution"};
kwstasfane1 0:167e85b50250 39
kwstasfane1 0:167e85b50250 40 int dsp_time_interval = 0; //0=R-R, 1=F-F, 2=R-F, 3=F-R
kwstasfane1 0:167e85b50250 41
kwstasfane1 3:e3e73c36a565 42 //result string
kwstasfane1 3:e3e73c36a565 43 const char* res[] = {""};
kwstasfane1 3:e3e73c36a565 44
kwstasfane1 0:167e85b50250 45 //Interrupt to be used in actual implementation to read the input square wave signal
kwstasfane1 0:167e85b50250 46 InterruptIn squareIN(p17);
kwstasfane1 0:167e85b50250 47
kwstasfane1 0:167e85b50250 48 //User interface measurement mode and range selection buttons
kwstasfane1 0:167e85b50250 49 InterruptIn mode(p12);
kwstasfane1 3:e3e73c36a565 50 InterruptIn range(p15);
kwstasfane1 3:e3e73c36a565 51 InterruptIn time_interval(p13);
kwstasfane1 0:167e85b50250 52
kwstasfane1 0:167e85b50250 53 //user defined functions to implement the user interface
kwstasfane1 0:167e85b50250 54 void user_interface_disp();
kwstasfane1 0:167e85b50250 55 void mode_select();
kwstasfane1 0:167e85b50250 56 void range_select();
kwstasfane1 0:167e85b50250 57 void time_interval_type_select();
kwstasfane1 0:167e85b50250 58 void result_calculator();
kwstasfane1 0:167e85b50250 59
kwstasfane1 0:167e85b50250 60 //interrupt service routines
kwstasfane1 3:e3e73c36a565 61 void start_t1_isr();
kwstasfane1 3:e3e73c36a565 62 void start_t2_isr();
kwstasfane1 0:167e85b50250 63
kwstasfane1 3:e3e73c36a565 64 Ticker ui_disp; //generate the 1s interrupt, to measure frequency (direct frequency measurement)
kwstasfane1 5:faf243e88b50 65 Ticker result_calc; //generate 100us interrupt, to calculate a new result
kwstasfane1 3:e3e73c36a565 66 Timer t1;
kwstasfane1 3:e3e73c36a565 67 Timer t2;
kwstasfane1 0:167e85b50250 68
kwstasfane1 0:167e85b50250 69 int main()
kwstasfane1 0:167e85b50250 70 {
kwstasfane1 5:faf243e88b50 71 //Reciprocal frequency measurement, measures the number of rising edges every time they occur
kwstasfane1 3:e3e73c36a565 72 squareIN.rise(&start_t1_isr);
kwstasfane1 3:e3e73c36a565 73 squareIN.fall(&start_t2_isr);
kwstasfane1 3:e3e73c36a565 74 ui_disp.attach(&user_interface_disp, 1); //update the screen every 1 second
kwstasfane1 3:e3e73c36a565 75 result_calc.attach_us(&result_calculator,100); //calculate a new measurement result every 100us
kwstasfane1 0:167e85b50250 76
kwstasfane1 0:167e85b50250 77 //interrupt routine for mode and range selection user input
kwstasfane1 0:167e85b50250 78 mode.rise(&mode_select);
kwstasfane1 0:167e85b50250 79 range.rise(&range_select);
kwstasfane1 0:167e85b50250 80 time_interval.rise(&time_interval_type_select);
kwstasfane1 0:167e85b50250 81
kwstasfane1 5:faf243e88b50 82 //start the timer t1,t2
kwstasfane1 3:e3e73c36a565 83 t1.start();
kwstasfane1 4:ce121f9e6db5 84 t2.start();
kwstasfane1 0:167e85b50250 85
kwstasfane1 0:167e85b50250 86 while(1)
kwstasfane1 0:167e85b50250 87 {
kwstasfane1 0:167e85b50250 88 }
kwstasfane1 0:167e85b50250 89 }
kwstasfane1 0:167e85b50250 90
kwstasfane1 3:e3e73c36a565 91 void start_t1_isr()
kwstasfane1 3:e3e73c36a565 92 {
kwstasfane1 3:e3e73c36a565 93 period = t1.read_us();
kwstasfane1 3:e3e73c36a565 94 t1.reset();
kwstasfane1 4:ce121f9e6db5 95 t2.reset();
kwstasfane1 3:e3e73c36a565 96 }
kwstasfane1 3:e3e73c36a565 97
kwstasfane1 3:e3e73c36a565 98 void start_t2_isr()
kwstasfane1 3:e3e73c36a565 99 {
kwstasfane1 3:e3e73c36a565 100 ton = t2.read_us();
kwstasfane1 3:e3e73c36a565 101 t2.reset();
kwstasfane1 3:e3e73c36a565 102 }
kwstasfane1 3:e3e73c36a565 103
kwstasfane1 0:167e85b50250 104 void user_interface_disp()
kwstasfane1 0:167e85b50250 105 {
kwstasfane1 0:167e85b50250 106 lcd.cls(); //clear screen
kwstasfane1 0:167e85b50250 107 lcd.locate(1,1);
kwstasfane1 0:167e85b50250 108 lcd.printf("Mode: %s", mode_msg[dsp_mode]);
kwstasfane1 0:167e85b50250 109
kwstasfane1 0:167e85b50250 110 //display the type of time interval measurement if the mode is selected
kwstasfane1 0:167e85b50250 111 if(dsp_mode ==2)
kwstasfane1 0:167e85b50250 112 {
kwstasfane1 0:167e85b50250 113 lcd.locate(90,1);
kwstasfane1 0:167e85b50250 114 if(dsp_time_interval == 0)
kwstasfane1 0:167e85b50250 115 {
kwstasfane1 0:167e85b50250 116 lcd.printf("(R->R)");
kwstasfane1 0:167e85b50250 117 }
kwstasfane1 0:167e85b50250 118 else if(dsp_time_interval == 1)
kwstasfane1 0:167e85b50250 119 {
kwstasfane1 0:167e85b50250 120 lcd.printf("(F->F)");
kwstasfane1 0:167e85b50250 121 }
kwstasfane1 0:167e85b50250 122 else if(dsp_time_interval == 2)
kwstasfane1 0:167e85b50250 123 {
kwstasfane1 0:167e85b50250 124 lcd.printf("(R->F)");
kwstasfane1 0:167e85b50250 125 }
kwstasfane1 0:167e85b50250 126 else if(dsp_time_interval == 3)
kwstasfane1 0:167e85b50250 127 {
kwstasfane1 0:167e85b50250 128 lcd.printf("(F->R)");
kwstasfane1 5:faf243e88b50 129 }
kwstasfane1 0:167e85b50250 130 }
kwstasfane1 0:167e85b50250 131 lcd.locate(1,10);
kwstasfane1 0:167e85b50250 132 lcd.printf("Range: %s", range_msg[dsp_range]);
kwstasfane1 0:167e85b50250 133 lcd.locate(1,20);
kwstasfane1 3:e3e73c36a565 134 //print the result
kwstasfane1 5:faf243e88b50 135 lcd.printf(*res,m_result,range_scale[dsp_mode][dsp_range]);
kwstasfane1 0:167e85b50250 136 }
kwstasfane1 0:167e85b50250 137
kwstasfane1 0:167e85b50250 138 void time_interval_type_select()
kwstasfane1 0:167e85b50250 139 {
kwstasfane1 0:167e85b50250 140 if (dsp_time_interval <3)
kwstasfane1 0:167e85b50250 141 {
kwstasfane1 0:167e85b50250 142 dsp_time_interval++;
kwstasfane1 0:167e85b50250 143 }
kwstasfane1 0:167e85b50250 144 else
kwstasfane1 0:167e85b50250 145 {
kwstasfane1 0:167e85b50250 146 dsp_time_interval = 0;
kwstasfane1 0:167e85b50250 147 }
kwstasfane1 0:167e85b50250 148 }
kwstasfane1 0:167e85b50250 149
kwstasfane1 0:167e85b50250 150 //Interrupt service routine to handle the measurement mode selection
kwstasfane1 0:167e85b50250 151 void mode_select()
kwstasfane1 0:167e85b50250 152 {
kwstasfane1 0:167e85b50250 153 if (dsp_mode < 2)
kwstasfane1 0:167e85b50250 154 {
kwstasfane1 0:167e85b50250 155 dsp_mode++;
kwstasfane1 0:167e85b50250 156 }
kwstasfane1 0:167e85b50250 157 else
kwstasfane1 0:167e85b50250 158 {
kwstasfane1 0:167e85b50250 159 dsp_mode = 0;
kwstasfane1 0:167e85b50250 160 }
kwstasfane1 0:167e85b50250 161 }
kwstasfane1 0:167e85b50250 162
kwstasfane1 0:167e85b50250 163 //Interrupt service routine to handle the measurement range selection
kwstasfane1 0:167e85b50250 164 void range_select()
kwstasfane1 0:167e85b50250 165 {
kwstasfane1 0:167e85b50250 166 if (dsp_range < 2)
kwstasfane1 0:167e85b50250 167 {
kwstasfane1 0:167e85b50250 168 dsp_range++;
kwstasfane1 0:167e85b50250 169 }
kwstasfane1 0:167e85b50250 170 else
kwstasfane1 0:167e85b50250 171 {
kwstasfane1 0:167e85b50250 172 dsp_range = 0;
kwstasfane1 0:167e85b50250 173 }
kwstasfane1 0:167e85b50250 174 }
kwstasfane1 0:167e85b50250 175
kwstasfane1 0:167e85b50250 176 void result_calculator()
kwstasfane1 0:167e85b50250 177 {
kwstasfane1 5:faf243e88b50 178 //calculate frequency in Hz and period in ms
kwstasfane1 5:faf243e88b50 179 float m_period_ms = period/1000; //period calculated in us, divide by 1000
kwstasfane1 3:e3e73c36a565 180 float m_freq_hz = 1/(m_period_ms/1000);
kwstasfane1 0:167e85b50250 181
kwstasfane1 0:167e85b50250 182 if(dsp_mode == 0) //frequency measurement
kwstasfane1 0:167e85b50250 183 {
kwstasfane1 0:167e85b50250 184 if(dsp_range == 0) //High resolution (MHz)
kwstasfane1 0:167e85b50250 185 {
kwstasfane1 0:167e85b50250 186 m_result = m_freq_hz/1000000;
kwstasfane1 0:167e85b50250 187 if(m_result <= 10.001)
kwstasfane1 0:167e85b50250 188 {
kwstasfane1 0:167e85b50250 189 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 190 *res="%3.3f %s";
kwstasfane1 0:167e85b50250 191 }
kwstasfane1 0:167e85b50250 192 else
kwstasfane1 0:167e85b50250 193 {
kwstasfane1 0:167e85b50250 194 *res="Out-of-range... '>10 MHz !'";
kwstasfane1 0:167e85b50250 195 }
kwstasfane1 0:167e85b50250 196
kwstasfane1 0:167e85b50250 197 }
kwstasfane1 0:167e85b50250 198 else if(dsp_range == 1) //medium resolution (KHz)
kwstasfane1 0:167e85b50250 199 {
kwstasfane1 0:167e85b50250 200 m_result = m_freq_hz/1000;
kwstasfane1 0:167e85b50250 201 if(m_result <= 100.001)
kwstasfane1 0:167e85b50250 202 {
kwstasfane1 0:167e85b50250 203 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 204 *res="%3.3f %s";
kwstasfane1 0:167e85b50250 205 }
kwstasfane1 0:167e85b50250 206 else
kwstasfane1 0:167e85b50250 207 {
kwstasfane1 0:167e85b50250 208 *res="Out-of-range... '>100 KHz !'";
kwstasfane1 0:167e85b50250 209 }
kwstasfane1 0:167e85b50250 210 }
kwstasfane1 0:167e85b50250 211 else //low resolution (Hz)
kwstasfane1 0:167e85b50250 212 {
kwstasfane1 0:167e85b50250 213 m_result = m_freq_hz;
kwstasfane1 0:167e85b50250 214 if(m_result <= 100.001)
kwstasfane1 0:167e85b50250 215 {
kwstasfane1 0:167e85b50250 216 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 217 *res="%3.3f %s";
kwstasfane1 0:167e85b50250 218 }
kwstasfane1 0:167e85b50250 219 else
kwstasfane1 0:167e85b50250 220 {
kwstasfane1 0:167e85b50250 221 *res="Out-of-range... '>100 Hz !'";
kwstasfane1 0:167e85b50250 222 }
kwstasfane1 0:167e85b50250 223
kwstasfane1 5:faf243e88b50 224 }
kwstasfane1 0:167e85b50250 225 }
kwstasfane1 0:167e85b50250 226 else if (dsp_mode == 1) //period measurement
kwstasfane1 0:167e85b50250 227 {
kwstasfane1 0:167e85b50250 228 if(dsp_range == 0) //High resolution (2.000 +- 0.0001 ms)
kwstasfane1 0:167e85b50250 229 {
kwstasfane1 3:e3e73c36a565 230 m_result = m_period_ms;
kwstasfane1 0:167e85b50250 231 if(m_result <= 2.0001)
kwstasfane1 0:167e85b50250 232 {
kwstasfane1 0:167e85b50250 233 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 234 *res="%1.4f %s";
kwstasfane1 0:167e85b50250 235 }
kwstasfane1 0:167e85b50250 236 else
kwstasfane1 0:167e85b50250 237 {
kwstasfane1 0:167e85b50250 238 *res="Out-of-range... '>2.000 ms !'";
kwstasfane1 0:167e85b50250 239 }
kwstasfane1 0:167e85b50250 240 }
kwstasfane1 0:167e85b50250 241 else if(dsp_range == 1) //medium resolution (20.00 +- 0.01 ms)
kwstasfane1 0:167e85b50250 242 {
kwstasfane1 3:e3e73c36a565 243 m_result = m_period_ms;
kwstasfane1 0:167e85b50250 244 if(m_result <= 20.01)
kwstasfane1 0:167e85b50250 245 {
kwstasfane1 0:167e85b50250 246 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 247 *res="%2.2f %s";
kwstasfane1 0:167e85b50250 248 }
kwstasfane1 0:167e85b50250 249 else
kwstasfane1 0:167e85b50250 250 {
kwstasfane1 0:167e85b50250 251 *res="Out-of-range... '>20.00 ms !'";
kwstasfane1 0:167e85b50250 252 }
kwstasfane1 0:167e85b50250 253 }
kwstasfane1 0:167e85b50250 254 else //low resolution (2.000 +- 0.001 s)
kwstasfane1 0:167e85b50250 255 {
kwstasfane1 3:e3e73c36a565 256 m_result = m_period_ms/1000;
kwstasfane1 0:167e85b50250 257 if(m_result <= 2.001)
kwstasfane1 0:167e85b50250 258 {
kwstasfane1 0:167e85b50250 259 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 260 *res="%1.3f %s";
kwstasfane1 0:167e85b50250 261 }
kwstasfane1 0:167e85b50250 262 else
kwstasfane1 0:167e85b50250 263 {
kwstasfane1 0:167e85b50250 264 *res="Out-of-range... '>2.000 sec'";
kwstasfane1 0:167e85b50250 265 }
kwstasfane1 0:167e85b50250 266 }
kwstasfane1 0:167e85b50250 267 }
kwstasfane1 0:167e85b50250 268 else // "(dsp_mode == 2)" time interval measurement
kwstasfane1 0:167e85b50250 269 {
kwstasfane1 4:ce121f9e6db5 270 if(dsp_time_interval == 0 || dsp_time_interval == 1) //rising->rising, falling -> falling
kwstasfane1 4:ce121f9e6db5 271 {
kwstasfane1 4:ce121f9e6db5 272 m_result = m_period_ms;
kwstasfane1 4:ce121f9e6db5 273 }
kwstasfane1 4:ce121f9e6db5 274 else if(dsp_time_interval == 2) //rising->falling
kwstasfane1 4:ce121f9e6db5 275 {
kwstasfane1 4:ce121f9e6db5 276 m_result = ton/1000;
kwstasfane1 4:ce121f9e6db5 277 }
kwstasfane1 4:ce121f9e6db5 278 else if(dsp_time_interval == 3) //falling->falling
kwstasfane1 4:ce121f9e6db5 279 {
kwstasfane1 4:ce121f9e6db5 280 m_result = m_period_ms - (ton/1000);
kwstasfane1 4:ce121f9e6db5 281 }
kwstasfane1 4:ce121f9e6db5 282
kwstasfane1 0:167e85b50250 283 if(dsp_range == 0) //High resolution (2.0000 +- 0.0001 ms)
kwstasfane1 0:167e85b50250 284 {
kwstasfane1 0:167e85b50250 285 if(m_result <= 2.0001)
kwstasfane1 0:167e85b50250 286 {
kwstasfane1 0:167e85b50250 287 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 288 *res="%1.4f %s";
kwstasfane1 0:167e85b50250 289 }
kwstasfane1 0:167e85b50250 290 else
kwstasfane1 0:167e85b50250 291 {
kwstasfane1 0:167e85b50250 292 *res="Out-of-range... '>2.000 ms !'";
kwstasfane1 0:167e85b50250 293 }
kwstasfane1 0:167e85b50250 294 }
kwstasfane1 0:167e85b50250 295 else if(dsp_range == 1) //medium resolution (20.00 +- 0.01 ms)
kwstasfane1 0:167e85b50250 296 {
kwstasfane1 0:167e85b50250 297 if(m_result <= 20.01)
kwstasfane1 0:167e85b50250 298 {
kwstasfane1 0:167e85b50250 299 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 300 *res="%2.2f %s";
kwstasfane1 0:167e85b50250 301 }
kwstasfane1 0:167e85b50250 302 else
kwstasfane1 0:167e85b50250 303 {
kwstasfane1 0:167e85b50250 304 *res="Out-of-range... '>20.00 ms !'";
kwstasfane1 0:167e85b50250 305 }
kwstasfane1 0:167e85b50250 306 }
kwstasfane1 0:167e85b50250 307 else //low resolution (2.000+-0.0001ms)
kwstasfane1 0:167e85b50250 308 {
kwstasfane1 4:ce121f9e6db5 309 m_result = m_result/1000;
kwstasfane1 0:167e85b50250 310 if(m_result <= 2.001)
kwstasfane1 0:167e85b50250 311 {
kwstasfane1 0:167e85b50250 312 //assigns the decimal point precision for each range
kwstasfane1 0:167e85b50250 313 *res="%1.3f %s";
kwstasfane1 0:167e85b50250 314 }
kwstasfane1 0:167e85b50250 315 else
kwstasfane1 0:167e85b50250 316 {
kwstasfane1 0:167e85b50250 317 *res="Out-of-range... '>2.000 sec'";
kwstasfane1 0:167e85b50250 318 }
kwstasfane1 0:167e85b50250 319 }
kwstasfane1 3:e3e73c36a565 320 }
kwstasfane1 0:167e85b50250 321 }