![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
run this here
Dependencies: Hexi_KW40Z Hexi_OLED_SSD1351
main.cpp@2:75253a344332, 2018-04-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |