run this here

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351

Committer:
trhackett
Date:
Fri Apr 27 06:16:33 2018 +0000
Revision:
2:75253a344332
Parent:
1:b965810f9bb3
Child:
3:f34bbdea0786
delete old stuff, truly turnin-able now

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 1:b965810f9bb3 142
trhackett 0:2b94f7017e4e 143 // set to low
trhackett 0:2b94f7017e4e 144 pulse.write(0);
trhackett 1:b965810f9bb3 145
trhackett 0:2b94f7017e4e 146 // reset the low to high ticker
trhackett 0:2b94f7017e4e 147 lowToHigh.detach();
trhackett 0:2b94f7017e4e 148 lowToHigh.attach(&tickerHandle, currentPeriod);
trhackett 1:b965810f9bb3 149
trhackett 0:2b94f7017e4e 150 highToLow.detach();
trhackett 1:b965810f9bb3 151
trhackett 0:2b94f7017e4e 152 // wait period * duty cycle
trhackett 0:2b94f7017e4e 153 wait(currentPeriod * currentDutyCycle);
trhackett 0:2b94f7017e4e 154 // reset the high to low ticker
trhackett 0:2b94f7017e4e 155 highToLow.attach(&tickerHandle, currentPeriod);
trhackett 0:2b94f7017e4e 156 }
trhackett 0:2b94f7017e4e 157
trhackett 0:2b94f7017e4e 158 // print an error, non-blocking, if they input bad values
trhackett 0:2b94f7017e4e 159 else {
trhackett 0:2b94f7017e4e 160 q1.call(printf,"mbed> ERROR\r\n");
trhackett 0:2b94f7017e4e 161 }
trhackett 0:2b94f7017e4e 162 }
trhackett 0:2b94f7017e4e 163
trhackett 0:2b94f7017e4e 164 // main() runs in its own thread in the OS
trhackett 0:2b94f7017e4e 165 int main() {
trhackett 0:2b94f7017e4e 166
trhackett 0:2b94f7017e4e 167 // each time you see a rising edge, recompute the period
trhackett 0:2b94f7017e4e 168 // and stop timing the low signal
trhackett 0:2b94f7017e4e 169 catchChange.rise(&riseHandle);
trhackett 0:2b94f7017e4e 170 catchChange.fall(&fallHandle);
trhackett 0:2b94f7017e4e 171
trhackett 0:2b94f7017e4e 172 // when the user inputs something
trhackett 0:2b94f7017e4e 173 pc.attach(&inputHandle);
trhackett 0:2b94f7017e4e 174
trhackett 0:2b94f7017e4e 175 // start low
trhackett 0:2b94f7017e4e 176 pulse.write(0);
trhackett 0:2b94f7017e4e 177
trhackett 1:b965810f9bb3 178 // 1) ticker that goes from low to high every period seconds
trhackett 0:2b94f7017e4e 179 lowToHigh.attach(&tickerHandle, currentPeriod);
trhackett 1:b965810f9bb3 180 // 2) wait period * duty cycle
trhackett 0:2b94f7017e4e 181 wait(currentPeriod * currentDutyCycle);
trhackett 1:b965810f9bb3 182 // 3) ticker that goes from high to low every period seconds
trhackett 0:2b94f7017e4e 183 highToLow.attach(&tickerHandle, currentPeriod);
trhackett 0:2b94f7017e4e 184
trhackett 0:2b94f7017e4e 185 t1.start(callback(&q1, &EventQueue::dispatch_forever));
trhackett 0:2b94f7017e4e 186
trhackett 0:2b94f7017e4e 187 wait(osWaitForever);
trhackett 2:75253a344332 188 }