run this here

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351

Committer:
trhackett
Date:
Fri Apr 27 05:53:47 2018 +0000
Revision:
0:2b94f7017e4e
Child:
1:b965810f9bb3
works completely

Who changed what in which revision?

UserRevisionLine numberNew contents of line
trhackett 0:2b94f7017e4e 1 #include "mbed.h"
trhackett 0:2b94f7017e4e 2 #include "Ticker.h"
trhackett 0:2b94f7017e4e 3 #include <stdlib.h>
trhackett 0:2b94f7017e4e 4
trhackett 0:2b94f7017e4e 5 InterruptIn catchChange(PTD2);
trhackett 0:2b94f7017e4e 6 Serial pc(USBTX, USBRX);
trhackett 0:2b94f7017e4e 7
trhackett 0:2b94f7017e4e 8 // software PWM using DigitalOut
trhackett 0:2b94f7017e4e 9 DigitalOut pulse(PTA10);
trhackett 0:2b94f7017e4e 10
trhackett 0:2b94f7017e4e 11 float PERIOD = 0.06f;
trhackett 0:2b94f7017e4e 12 float DUTYCYCLE = 0.50f;
trhackett 0:2b94f7017e4e 13
trhackett 0:2b94f7017e4e 14 // period and duty cycle that we'll be changing
trhackett 0:2b94f7017e4e 15 float currentPeriod = PERIOD;
trhackett 0:2b94f7017e4e 16 float currentDutyCycle = DUTYCYCLE;
trhackett 0:2b94f7017e4e 17
trhackett 0:2b94f7017e4e 18 // period is the time between the previous rising edge
trhackett 0:2b94f7017e4e 19 // and the current one, so recompute each time you
trhackett 0:2b94f7017e4e 20 // encounter a rising edge
trhackett 0:2b94f7017e4e 21 float period;
trhackett 0:2b94f7017e4e 22 Timer t;
trhackett 0:2b94f7017e4e 23
trhackett 0:2b94f7017e4e 24 // D is fraction of time that was high during the preceding interval
trhackett 0:2b94f7017e4e 25 float D;
trhackett 0:2b94f7017e4e 26 Timer highTime;
trhackett 0:2b94f7017e4e 27 Timer lowTime;
trhackett 0:2b94f7017e4e 28
trhackett 0:2b94f7017e4e 29 // every 10 rising edges, print T and D
trhackett 0:2b94f7017e4e 30 int risingEdges = 0;
trhackett 0:2b94f7017e4e 31
trhackett 0:2b94f7017e4e 32 // add in a thread that will do printing so it
trhackett 0:2b94f7017e4e 33 // doesn't interfere with my measurements
trhackett 0:2b94f7017e4e 34 EventQueue q1;
trhackett 0:2b94f7017e4e 35 Thread t1;
trhackett 0:2b94f7017e4e 36
trhackett 0:2b94f7017e4e 37 // ticker to change from low to high and one to change from high to low
trhackett 0:2b94f7017e4e 38 Ticker lowToHigh; // low to high every period seconds
trhackett 0:2b94f7017e4e 39 Ticker highToLow; // high to low every period + period * duty_cycle seconds
trhackett 0:2b94f7017e4e 40
trhackett 0:2b94f7017e4e 41 // switch the digital signal whenever the ticker goes off
trhackett 0:2b94f7017e4e 42 void tickerHandle() {
trhackett 0:2b94f7017e4e 43 if (pulse.read() == 1) {
trhackett 0:2b94f7017e4e 44 pulse.write(0);
trhackett 0:2b94f7017e4e 45 } else {
trhackett 0:2b94f7017e4e 46 pulse.write(1);
trhackett 0:2b94f7017e4e 47 }
trhackett 0:2b94f7017e4e 48 }
trhackett 0:2b94f7017e4e 49
trhackett 0:2b94f7017e4e 50 void printData() {
trhackett 0:2b94f7017e4e 51 // this does not run in the ISR
trhackett 0:2b94f7017e4e 52 pc.printf("mbed> %i, %.3f\n\r",(int)(period*1000000.0f),D);
trhackett 0:2b94f7017e4e 53 }
trhackett 0:2b94f7017e4e 54
trhackett 0:2b94f7017e4e 55 void riseHandle() {
trhackett 0:2b94f7017e4e 56 // recompute the period
trhackett 0:2b94f7017e4e 57 period = t.read();
trhackett 0:2b94f7017e4e 58 t.reset();
trhackett 0:2b94f7017e4e 59 t.start();
trhackett 0:2b94f7017e4e 60
trhackett 0:2b94f7017e4e 61 // if it's the first rising edge of a 10 edge interval,
trhackett 0:2b94f7017e4e 62 // then reset both timers
trhackett 0:2b94f7017e4e 63 if (risingEdges == 0) {
trhackett 0:2b94f7017e4e 64 lowTime.reset();
trhackett 0:2b94f7017e4e 65 highTime.reset();
trhackett 0:2b94f7017e4e 66 lowTime.stop();
trhackett 0:2b94f7017e4e 67 highTime.start();
trhackett 0:2b94f7017e4e 68
trhackett 0:2b94f7017e4e 69 // and you're in high time on the first rising edge
trhackett 0:2b94f7017e4e 70 risingEdges++;
trhackett 0:2b94f7017e4e 71 }
trhackett 0:2b94f7017e4e 72
trhackett 0:2b94f7017e4e 73 // if it's the tenth, then store D so that someone else can
trhackett 0:2b94f7017e4e 74 // print it out. reset the timers and rising edge count
trhackett 0:2b94f7017e4e 75 else if (risingEdges >= 9) {
trhackett 0:2b94f7017e4e 76 float h = highTime.read();
trhackett 0:2b94f7017e4e 77 float l = lowTime.read();
trhackett 0:2b94f7017e4e 78 D = h / (h + l);
trhackett 0:2b94f7017e4e 79
trhackett 0:2b94f7017e4e 80 lowTime.reset();
trhackett 0:2b94f7017e4e 81 highTime.reset();
trhackett 0:2b94f7017e4e 82 lowTime.stop();
trhackett 0:2b94f7017e4e 83 highTime.start();
trhackett 0:2b94f7017e4e 84
trhackett 0:2b94f7017e4e 85 risingEdges++;
trhackett 0:2b94f7017e4e 86 }
trhackett 0:2b94f7017e4e 87
trhackett 0:2b94f7017e4e 88 // if it's rising edge 2 ... 9, then just increment and start
trhackett 0:2b94f7017e4e 89 // the high timer and stop the low timer
trhackett 0:2b94f7017e4e 90 else {
trhackett 0:2b94f7017e4e 91 risingEdges++;
trhackett 0:2b94f7017e4e 92 lowTime.stop();
trhackett 0:2b94f7017e4e 93 highTime.start();
trhackett 0:2b94f7017e4e 94 }
trhackett 0:2b94f7017e4e 95
trhackett 0:2b94f7017e4e 96 // then defer the possible printf call to the other thread
trhackett 0:2b94f7017e4e 97 if (risingEdges == 10) {
trhackett 0:2b94f7017e4e 98 q1.call(&printData);
trhackett 0:2b94f7017e4e 99 risingEdges = 0;
trhackett 0:2b94f7017e4e 100 }
trhackett 0:2b94f7017e4e 101 }
trhackett 0:2b94f7017e4e 102
trhackett 0:2b94f7017e4e 103 // when you come to a falling edge, you should stop the high timer and
trhackett 0:2b94f7017e4e 104 // start the low timer
trhackett 0:2b94f7017e4e 105 void fallHandle() {
trhackett 0:2b94f7017e4e 106 lowTime.start();
trhackett 0:2b94f7017e4e 107 highTime.stop();
trhackett 0:2b94f7017e4e 108 }
trhackett 0:2b94f7017e4e 109
trhackett 0:2b94f7017e4e 110 void inputHandle() {
trhackett 0:2b94f7017e4e 111 char buff[256];
trhackett 0:2b94f7017e4e 112 gets(buff);
trhackett 0:2b94f7017e4e 113
trhackett 0:2b94f7017e4e 114 // extract out the values from the character array
trhackett 0:2b94f7017e4e 115 int i = 0;
trhackett 0:2b94f7017e4e 116 char p[20];
trhackett 0:2b94f7017e4e 117 while (buff[i] != ',') {
trhackett 0:2b94f7017e4e 118 p[i] = buff[i];
trhackett 0:2b94f7017e4e 119 ++i;
trhackett 0:2b94f7017e4e 120 }
trhackett 0:2b94f7017e4e 121 p[i] = '\0';
trhackett 0:2b94f7017e4e 122
trhackett 0:2b94f7017e4e 123 i += 2;
trhackett 0:2b94f7017e4e 124 int j = 0;
trhackett 0:2b94f7017e4e 125 char dc[20];
trhackett 0:2b94f7017e4e 126 while (buff[i] != '\0') {
trhackett 0:2b94f7017e4e 127 dc[j] = buff[i];
trhackett 0:2b94f7017e4e 128 ++i;
trhackett 0:2b94f7017e4e 129 ++j;
trhackett 0:2b94f7017e4e 130 }
trhackett 0:2b94f7017e4e 131
trhackett 0:2b94f7017e4e 132 int T_temp = atoi(p);
trhackett 0:2b94f7017e4e 133 float D_temp = atof(dc);
trhackett 0:2b94f7017e4e 134
trhackett 0:2b94f7017e4e 135 // make the changes to the period and duty cycle as long
trhackett 0:2b94f7017e4e 136 // as they are within range
trhackett 0:2b94f7017e4e 137 if ((T_temp >= 1000.0f && T_temp <= 60000.0f) &&
trhackett 0:2b94f7017e4e 138 (D_temp >= 0.0f && D_temp <= 1.0f))
trhackett 0:2b94f7017e4e 139 {
trhackett 0:2b94f7017e4e 140 currentPeriod = ((float)T_temp) / 1000000.0f;
trhackett 0:2b94f7017e4e 141 currentDutyCycle = D_temp;
trhackett 0:2b94f7017e4e 142 // set to low
trhackett 0:2b94f7017e4e 143 pulse.write(0);
trhackett 0:2b94f7017e4e 144 // reset the low to high ticker
trhackett 0:2b94f7017e4e 145 lowToHigh.detach();
trhackett 0:2b94f7017e4e 146 lowToHigh.attach(&tickerHandle, currentPeriod);
trhackett 0:2b94f7017e4e 147 highToLow.detach();
trhackett 0:2b94f7017e4e 148 // wait period * duty cycle
trhackett 0:2b94f7017e4e 149 wait(currentPeriod * currentDutyCycle);
trhackett 0:2b94f7017e4e 150 // reset the high to low ticker
trhackett 0:2b94f7017e4e 151 highToLow.attach(&tickerHandle, currentPeriod);
trhackett 0:2b94f7017e4e 152 }
trhackett 0:2b94f7017e4e 153
trhackett 0:2b94f7017e4e 154 // print an error, non-blocking, if they input bad values
trhackett 0:2b94f7017e4e 155 else {
trhackett 0:2b94f7017e4e 156 q1.call(printf,"mbed> ERROR\r\n");
trhackett 0:2b94f7017e4e 157 }
trhackett 0:2b94f7017e4e 158 }
trhackett 0:2b94f7017e4e 159
trhackett 0:2b94f7017e4e 160 // main() runs in its own thread in the OS
trhackett 0:2b94f7017e4e 161 int main() {
trhackett 0:2b94f7017e4e 162
trhackett 0:2b94f7017e4e 163 // each time you see a rising edge, recompute the period
trhackett 0:2b94f7017e4e 164 // and stop timing the low signal
trhackett 0:2b94f7017e4e 165 catchChange.rise(&riseHandle);
trhackett 0:2b94f7017e4e 166 catchChange.fall(&fallHandle);
trhackett 0:2b94f7017e4e 167
trhackett 0:2b94f7017e4e 168 // when the user inputs something
trhackett 0:2b94f7017e4e 169 pc.attach(&inputHandle);
trhackett 0:2b94f7017e4e 170
trhackett 0:2b94f7017e4e 171 // start low
trhackett 0:2b94f7017e4e 172 pulse.write(0);
trhackett 0:2b94f7017e4e 173
trhackett 0:2b94f7017e4e 174 // ticker that goes from low to high every period seconds
trhackett 0:2b94f7017e4e 175 lowToHigh.attach(&tickerHandle, currentPeriod);
trhackett 0:2b94f7017e4e 176 // wait period * duty cycle
trhackett 0:2b94f7017e4e 177 wait(currentPeriod * currentDutyCycle);
trhackett 0:2b94f7017e4e 178 // ticker that goes from high to low every period seconds
trhackett 0:2b94f7017e4e 179 highToLow.attach(&tickerHandle, currentPeriod);
trhackett 0:2b94f7017e4e 180
trhackett 0:2b94f7017e4e 181 t1.start(callback(&q1, &EventQueue::dispatch_forever));
trhackett 0:2b94f7017e4e 182
trhackett 0:2b94f7017e4e 183 wait(osWaitForever);
trhackett 0:2b94f7017e4e 184 }
trhackett 0:2b94f7017e4e 185
trhackett 0:2b94f7017e4e 186
trhackett 0:2b94f7017e4e 187
trhackett 0:2b94f7017e4e 188
trhackett 0:2b94f7017e4e 189
trhackett 0:2b94f7017e4e 190
trhackett 0:2b94f7017e4e 191
trhackett 0:2b94f7017e4e 192
trhackett 0:2b94f7017e4e 193
trhackett 0:2b94f7017e4e 194 //#include "mbed.h"
trhackett 0:2b94f7017e4e 195 //#include <string>
trhackett 0:2b94f7017e4e 196 //#include <sstream>
trhackett 0:2b94f7017e4e 197 //#include "Ticker.h"
trhackett 0:2b94f7017e4e 198 //
trhackett 0:2b94f7017e4e 199 //
trhackett 0:2b94f7017e4e 200 //InterruptIn catchChange(PTD2);
trhackett 0:2b94f7017e4e 201 //// printing from the device
trhackett 0:2b94f7017e4e 202 //Serial pc(USBTX, USBRX);
trhackett 0:2b94f7017e4e 203 //
trhackett 0:2b94f7017e4e 204 //// software PWM using DigitalOut
trhackett 0:2b94f7017e4e 205 //DigitalOut pulse(PTA10);
trhackett 0:2b94f7017e4e 206 //
trhackett 0:2b94f7017e4e 207 //// some defaults
trhackett 0:2b94f7017e4e 208 //float DEFAULT_PERIOD = 0.1f;
trhackett 0:2b94f7017e4e 209 //float DEFAULT_DUTYCYCLE = 0.5f;
trhackett 0:2b94f7017e4e 210 //float currentPeriod;
trhackett 0:2b94f7017e4e 211 //float currentDutyCycle;
trhackett 0:2b94f7017e4e 212 //
trhackett 0:2b94f7017e4e 213 //// ticker to change from low to high and one to change from high to low
trhackett 0:2b94f7017e4e 214 //Ticker lowToHigh;
trhackett 0:2b94f7017e4e 215 //Ticker highToLow;
trhackett 0:2b94f7017e4e 216 //
trhackett 0:2b94f7017e4e 217 //// every 10 rising edges, print T and D
trhackett 0:2b94f7017e4e 218 //int risingEdges = 0;
trhackett 0:2b94f7017e4e 219 //
trhackett 0:2b94f7017e4e 220 //// T is time between current edge and the previous one
trhackett 0:2b94f7017e4e 221 //int T_prev = -1;
trhackett 0:2b94f7017e4e 222 //int T_curr = -1;
trhackett 0:2b94f7017e4e 223 //int T;
trhackett 0:2b94f7017e4e 224 //
trhackett 0:2b94f7017e4e 225 //// D is fraction of time that was high during the preceding interval
trhackett 0:2b94f7017e4e 226 //float D;
trhackett 0:2b94f7017e4e 227 //Timer highTime;
trhackett 0:2b94f7017e4e 228 //Timer lowTime;
trhackett 0:2b94f7017e4e 229 //
trhackett 0:2b94f7017e4e 230 //
trhackett 0:2b94f7017e4e 231 //// when you come on a rising edge, you should increment the rising edges
trhackett 0:2b94f7017e4e 232 //// and count the time as high, meaning stop the low timer and start the
trhackett 0:2b94f7017e4e 233 //// high timer
trhackett 0:2b94f7017e4e 234 //void riseHandle() {
trhackett 0:2b94f7017e4e 235 // // every time, manage the time difference between the previous rising
trhackett 0:2b94f7017e4e 236 // // edge and the one that came after it
trhackett 0:2b94f7017e4e 237 // T_prev = T_curr;
trhackett 0:2b94f7017e4e 238 // T_curr = (int)(highTime.read() * 1000000.0f);
trhackett 0:2b94f7017e4e 239 //
trhackett 0:2b94f7017e4e 240 // // if it's the first rising edge of a 10 edge interval,
trhackett 0:2b94f7017e4e 241 // // then reset both timers
trhackett 0:2b94f7017e4e 242 // if (risingEdges == 0) {
trhackett 0:2b94f7017e4e 243 // lowTime.stop();
trhackett 0:2b94f7017e4e 244 // highTime.start();
trhackett 0:2b94f7017e4e 245 // lowTime.reset();
trhackett 0:2b94f7017e4e 246 // highTime.reset();
trhackett 0:2b94f7017e4e 247 //
trhackett 0:2b94f7017e4e 248 // // and you're in high time on the first rising edge
trhackett 0:2b94f7017e4e 249 // risingEdges++;
trhackett 0:2b94f7017e4e 250 // }
trhackett 0:2b94f7017e4e 251 //
trhackett 0:2b94f7017e4e 252 // // if it's the tenth, then store D so that someone else can
trhackett 0:2b94f7017e4e 253 // // print it out. reset the timers and rising edge count
trhackett 0:2b94f7017e4e 254 // else if (risingEdges == 9) {
trhackett 0:2b94f7017e4e 255 // float h = highTime.read();
trhackett 0:2b94f7017e4e 256 // float l = lowTime.read();
trhackett 0:2b94f7017e4e 257 // D = h / (h + l);
trhackett 0:2b94f7017e4e 258 //
trhackett 0:2b94f7017e4e 259 // T = T_curr - T_prev;
trhackett 0:2b94f7017e4e 260 //
trhackett 0:2b94f7017e4e 261 //// pc.printf("previous rising edge: %i, this rising edge: %i\n\r",T_prev,T_curr);
trhackett 0:2b94f7017e4e 262 //
trhackett 0:2b94f7017e4e 263 // lowTime.stop();
trhackett 0:2b94f7017e4e 264 // highTime.start();
trhackett 0:2b94f7017e4e 265 // lowTime.reset();
trhackett 0:2b94f7017e4e 266 // highTime.reset();
trhackett 0:2b94f7017e4e 267 //
trhackett 0:2b94f7017e4e 268 // risingEdges++;
trhackett 0:2b94f7017e4e 269 // }
trhackett 0:2b94f7017e4e 270 //
trhackett 0:2b94f7017e4e 271 // // if it's rising edge 2 ... 9, then just increment and start
trhackett 0:2b94f7017e4e 272 // // the high timer and stop the low timer
trhackett 0:2b94f7017e4e 273 // else {
trhackett 0:2b94f7017e4e 274 // risingEdges++;
trhackett 0:2b94f7017e4e 275 // lowTime.stop();
trhackett 0:2b94f7017e4e 276 // highTime.start();
trhackett 0:2b94f7017e4e 277 // }
trhackett 0:2b94f7017e4e 278 //}
trhackett 0:2b94f7017e4e 279 //
trhackett 0:2b94f7017e4e 280 //// when you come to a falling edge, you should stop the high timer and
trhackett 0:2b94f7017e4e 281 //// start the low timer
trhackett 0:2b94f7017e4e 282 //void fallHandle() {
trhackett 0:2b94f7017e4e 283 // lowTime.start();
trhackett 0:2b94f7017e4e 284 // highTime.stop();
trhackett 0:2b94f7017e4e 285 //}
trhackett 0:2b94f7017e4e 286 //
trhackett 0:2b94f7017e4e 287 //void inputHandle() {
trhackett 0:2b94f7017e4e 288 // int T_temp;
trhackett 0:2b94f7017e4e 289 // float D_temp;
trhackett 0:2b94f7017e4e 290 // pc.scanf("%i, %f",&T_temp,&D_temp);
trhackett 0:2b94f7017e4e 291 // pc.printf("read in T as %i, D as %f\r\n",T_temp,D_temp);
trhackett 0:2b94f7017e4e 292 //
trhackett 0:2b94f7017e4e 293 // // make the changes to the period and duty cycle as long
trhackett 0:2b94f7017e4e 294 // // as they are within range
trhackett 0:2b94f7017e4e 295 // if ((T_temp >= 1000 && T_temp <= 60000) &&
trhackett 0:2b94f7017e4e 296 // (D_temp >= 0.0f && D_temp <= 1.0f))
trhackett 0:2b94f7017e4e 297 // {
trhackett 0:2b94f7017e4e 298 // currentPeriod = (float)T_temp / 1000000.0f;
trhackett 0:2b94f7017e4e 299 // currentDutyCycle = D_temp;
trhackett 0:2b94f7017e4e 300 //
trhackett 0:2b94f7017e4e 301 // pc.printf("period is now %f, duty cycle is now %f\n\r",(float)T_temp/1000000.0f,D_temp);
trhackett 0:2b94f7017e4e 302 // }
trhackett 0:2b94f7017e4e 303 //
trhackett 0:2b94f7017e4e 304 // else {
trhackett 0:2b94f7017e4e 305 // pc.printf("mbed> ERROR\n\r");
trhackett 0:2b94f7017e4e 306 // }
trhackett 0:2b94f7017e4e 307 //}
trhackett 0:2b94f7017e4e 308 //
trhackett 0:2b94f7017e4e 309 //void tickerHandle() {
trhackett 0:2b94f7017e4e 310 // if (pulse.read() == 1) {
trhackett 0:2b94f7017e4e 311 // pulse.write(0);
trhackett 0:2b94f7017e4e 312 // } else {
trhackett 0:2b94f7017e4e 313 // pulse.write(1);
trhackett 0:2b94f7017e4e 314 // }
trhackett 0:2b94f7017e4e 315 //}
trhackett 0:2b94f7017e4e 316 //
trhackett 0:2b94f7017e4e 317 //int main() {
trhackett 0:2b94f7017e4e 318 // catchChange.rise(&riseHandle);
trhackett 0:2b94f7017e4e 319 // catchChange.fall(&fallHandle);
trhackett 0:2b94f7017e4e 320 // pc.attach(&inputHandle);
trhackett 0:2b94f7017e4e 321 //
trhackett 0:2b94f7017e4e 322 // currentPeriod = DEFAULT_PERIOD;
trhackett 0:2b94f7017e4e 323 // currentDutyCycle = DEFAULT_DUTYCYCLE;
trhackett 0:2b94f7017e4e 324 //
trhackett 0:2b94f7017e4e 325 // // start at a low signal
trhackett 0:2b94f7017e4e 326 // pulse.write(0);
trhackett 0:2b94f7017e4e 327 //
trhackett 0:2b94f7017e4e 328 // // go from low to high every period seconds
trhackett 0:2b94f7017e4e 329 // float riseInterval = currentPeriod;
trhackett 0:2b94f7017e4e 330 // // go from high to low every period + period*dutyCycle seconds
trhackett 0:2b94f7017e4e 331 // float fallInterval = riseInterval + currentPeriod * currentDutyCycle;
trhackett 0:2b94f7017e4e 332 //
trhackett 0:2b94f7017e4e 333 // // set ticker to change signal given intervals above
trhackett 0:2b94f7017e4e 334 // lowToHigh.attach(&tickerHandle, riseInterval);
trhackett 0:2b94f7017e4e 335 // highToLow.attach(&tickerHandle, fallInterval);
trhackett 0:2b94f7017e4e 336 //
trhackett 0:2b94f7017e4e 337 // pc.printf("Starting main function!!!\n\r");
trhackett 0:2b94f7017e4e 338 //
trhackett 0:2b94f7017e4e 339 // pc.printf("rise interval: %f, fall interval: %f\n\r",riseInterval,fallInterval);
trhackett 0:2b94f7017e4e 340 //
trhackett 0:2b94f7017e4e 341 // while (1) {
trhackett 0:2b94f7017e4e 342 // if (risingEdges >= 10) {
trhackett 0:2b94f7017e4e 343 // risingEdges = 0;
trhackett 0:2b94f7017e4e 344 // pc.printf("mbed> %u, %.3f\n\r", T, D);
trhackett 0:2b94f7017e4e 345 // }
trhackett 0:2b94f7017e4e 346 //
trhackett 0:2b94f7017e4e 347 // }
trhackett 0:2b94f7017e4e 348 //}