This app requires a Windows Form to send/receive commands. See GHI Electronics Codeshare.. https://www.ghielectronics.com/community

Dependencies:   USBDevice mbed

Committer:
willgeorge
Date:
Sat Mar 07 11:09:27 2015 +0000
Revision:
0:9122ef37df55
This app requires a Windows Form to send/receive commands.
; See GHI Electronics code share.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
willgeorge 0:9122ef37df55 1 //
willgeorge 0:9122ef37df55 2 //OutrageousPWM
willgeorge 0:9122ef37df55 3 //
willgeorge 0:9122ef37df55 4 // Control characters are used so there is no restriction on text characters that can be used for serial messages.
willgeorge 0:9122ef37df55 5 // Test for the control characters to reset the mBuino and for setting the PWM values
willgeorge 0:9122ef37df55 6
willgeorge 0:9122ef37df55 7 //Use USB Library Device stack
willgeorge 0:9122ef37df55 8
willgeorge 0:9122ef37df55 9 #include "mbed.h"
willgeorge 0:9122ef37df55 10 #include "USBSerial.h"
willgeorge 0:9122ef37df55 11 #include <string>
willgeorge 0:9122ef37df55 12
willgeorge 0:9122ef37df55 13
willgeorge 0:9122ef37df55 14 DigitalOut LED[] = {(LED1), (LED2), (LED3), (LED4), (LED5), (LED6), (LED7)};// declare 7 LEDs
willgeorge 0:9122ef37df55 15
willgeorge 0:9122ef37df55 16
willgeorge 0:9122ef37df55 17 //Virtual serial port over USB
willgeorge 0:9122ef37df55 18 USBSerial serial;
willgeorge 0:9122ef37df55 19
willgeorge 0:9122ef37df55 20 /*
willgeorge 0:9122ef37df55 21 Serial pc(USBTX, USBRX);
willgeorge 0:9122ef37df55 22 DigitalOut led1(LED1);
willgeorge 0:9122ef37df55 23 DigitalOut led2(LED2);
willgeorge 0:9122ef37df55 24 DigitalOut led3(LED3);
willgeorge 0:9122ef37df55 25 DigitalOut led4(LED4);
willgeorge 0:9122ef37df55 26 DigitalOut led5(LED5);
willgeorge 0:9122ef37df55 27 DigitalOut led6(LED6);
willgeorge 0:9122ef37df55 28 DigitalOut led7(LED7);
willgeorge 0:9122ef37df55 29 pwmEdge.rise(&showEdgeHigh);
willgeorge 0:9122ef37df55 30 pwmEdge.fall(&showEdgeLow);
willgeorge 0:9122ef37df55 31 */
willgeorge 0:9122ef37df55 32
willgeorge 0:9122ef37df55 33
willgeorge 0:9122ef37df55 34 //Create interrupt input
willgeorge 0:9122ef37df55 35 InterruptIn pwmEdge(P0_21);
willgeorge 0:9122ef37df55 36
willgeorge 0:9122ef37df55 37 //create PWM outputs
willgeorge 0:9122ef37df55 38 PwmOut PWM1(P0_18);
willgeorge 0:9122ef37df55 39 PwmOut PWM2(P0_19);
willgeorge 0:9122ef37df55 40 PwmOut PWM3(P1_15);
willgeorge 0:9122ef37df55 41
willgeorge 0:9122ef37df55 42 //create output pin to display interrupt state event
willgeorge 0:9122ef37df55 43 DigitalOut led7(LED7);
willgeorge 0:9122ef37df55 44
willgeorge 0:9122ef37df55 45 float Period1;
willgeorge 0:9122ef37df55 46 float DutyCycle1;
willgeorge 0:9122ef37df55 47 float Period2;
willgeorge 0:9122ef37df55 48 float DutyCycle2;
willgeorge 0:9122ef37df55 49 float Period3;
willgeorge 0:9122ef37df55 50 float DutyCycle3;
willgeorge 0:9122ef37df55 51
willgeorge 0:9122ef37df55 52 //Event
willgeorge 0:9122ef37df55 53 void onEdgeHigh() {
willgeorge 0:9122ef37df55 54 led7 = 1;
willgeorge 0:9122ef37df55 55 }
willgeorge 0:9122ef37df55 56 //
willgeorge 0:9122ef37df55 57
willgeorge 0:9122ef37df55 58 //Event
willgeorge 0:9122ef37df55 59 void onEdgeLow() {
willgeorge 0:9122ef37df55 60 led7 = 0;
willgeorge 0:9122ef37df55 61 }
willgeorge 0:9122ef37df55 62 //
willgeorge 0:9122ef37df55 63
willgeorge 0:9122ef37df55 64 int main() {
willgeorge 0:9122ef37df55 65
willgeorge 0:9122ef37df55 66 reset: //Here on Reset request..
willgeorge 0:9122ef37df55 67
willgeorge 0:9122ef37df55 68 for(int i = 0; i < 7; i++) // turn all led's off
willgeorge 0:9122ef37df55 69 {
willgeorge 0:9122ef37df55 70 LED[i].write(0);
willgeorge 0:9122ef37df55 71 }
willgeorge 0:9122ef37df55 72 //
willgeorge 0:9122ef37df55 73
willgeorge 0:9122ef37df55 74 //Display we have started...
willgeorge 0:9122ef37df55 75 for(int i = 0;i < 7;i++) {
willgeorge 0:9122ef37df55 76 LED[i].write(1);
willgeorge 0:9122ef37df55 77 wait(0.2);
willgeorge 0:9122ef37df55 78 LED[i].write(0);
willgeorge 0:9122ef37df55 79 }
willgeorge 0:9122ef37df55 80
willgeorge 0:9122ef37df55 81 for(int i = 6;i >= 0;i--) {
willgeorge 0:9122ef37df55 82 LED[i].write(1);
willgeorge 0:9122ef37df55 83 wait(0.2);
willgeorge 0:9122ef37df55 84 LED[i].write(0);
willgeorge 0:9122ef37df55 85 }
willgeorge 0:9122ef37df55 86
willgeorge 0:9122ef37df55 87
willgeorge 0:9122ef37df55 88 //Test 1kHz 70% (0.999 kHz)
willgeorge 0:9122ef37df55 89 Period1 = 0.01;
willgeorge 0:9122ef37df55 90 DutyCycle1 = 0.3;
willgeorge 0:9122ef37df55 91
willgeorge 0:9122ef37df55 92 //Test 1kHz 50% (0.999 kHz)
willgeorge 0:9122ef37df55 93 Period2 = 0.001;
willgeorge 0:9122ef37df55 94 DutyCycle2 = 0.5;
willgeorge 0:9122ef37df55 95
willgeorge 0:9122ef37df55 96 //Test 979.4 kHz
willgeorge 0:9122ef37df55 97 Period3 = 0.000001;
willgeorge 0:9122ef37df55 98 DutyCycle3 = 0.5; //51%
willgeorge 0:9122ef37df55 99
willgeorge 0:9122ef37df55 100 //Set some defaults
willgeorge 0:9122ef37df55 101 PWM1.period(Period1);
willgeorge 0:9122ef37df55 102 PWM1=DutyCycle1;
willgeorge 0:9122ef37df55 103
willgeorge 0:9122ef37df55 104 PWM2.period(Period2);
willgeorge 0:9122ef37df55 105 PWM2=DutyCycle2;
willgeorge 0:9122ef37df55 106
willgeorge 0:9122ef37df55 107 PWM3.period(Period3);
willgeorge 0:9122ef37df55 108 PWM3=DutyCycle3;
willgeorge 0:9122ef37df55 109
willgeorge 0:9122ef37df55 110 while(1)
willgeorge 0:9122ef37df55 111 {
willgeorge 0:9122ef37df55 112 if(serial.readable()) {
willgeorge 0:9122ef37df55 113
willgeorge 0:9122ef37df55 114 //Control Characters are received as Decimal ASCII
willgeorge 0:9122ef37df55 115
willgeorge 0:9122ef37df55 116 char str[60];
willgeorge 0:9122ef37df55 117 serial.gets(str, 60);
willgeorge 0:9122ef37df55 118 serial.puts(str);
willgeorge 0:9122ef37df55 119 //Indicate we have received/returned data
willgeorge 0:9122ef37df55 120 LED[3].write(1);
willgeorge 0:9122ef37df55 121 wait(0.2);
willgeorge 0:9122ef37df55 122 LED[3].write(0);
willgeorge 0:9122ef37df55 123
willgeorge 0:9122ef37df55 124 //Get PWM (or other) to use and the value from string
willgeorge 0:9122ef37df55 125 //The first three characters tell us what PwmOut to use
willgeorge 0:9122ef37df55 126 //The remaining characters are the value to use
willgeorge 0:9122ef37df55 127
willgeorge 0:9122ef37df55 128 int len = strlen(str);
willgeorge 0:9122ef37df55 129 string s2 = string(str).substr(3, len - 3);
willgeorge 0:9122ef37df55 130 //serial.printf("s: %s Len: %d \r\n", str, len);
willgeorge 0:9122ef37df55 131
willgeorge 0:9122ef37df55 132 //Warning: Non-POD class type passed through ellipsis in "main.cpp"
willgeorge 0:9122ef37df55 133 //serial.printf("part: %s \r\n", s2); //<< My original code causing error
willgeorge 0:9122ef37df55 134 //serial.printf("part: %s \r\n", s2.c_str()); //<< taylorza provided this and saved my day
willgeorge 0:9122ef37df55 135
willgeorge 0:9122ef37df55 136
willgeorge 0:9122ef37df55 137 //Control Character 10 = DLE (P0_21)
willgeorge 0:9122ef37df55 138 //Interrupt input pin
willgeorge 0:9122ef37df55 139 if(str[0] == '1' && str[1] == '0') {
willgeorge 0:9122ef37df55 140 if(str[2] == '1') {
willgeorge 0:9122ef37df55 141 pwmEdge.rise(&onEdgeHigh); //Event
willgeorge 0:9122ef37df55 142 }
willgeorge 0:9122ef37df55 143 else if(str[2] == '0') {
willgeorge 0:9122ef37df55 144 pwmEdge.fall(&onEdgeLow); //Event
willgeorge 0:9122ef37df55 145 }
willgeorge 0:9122ef37df55 146 //Disable events
willgeorge 0:9122ef37df55 147 else if(str[2] == '2') {
willgeorge 0:9122ef37df55 148 pwmEdge.rise(NULL);
willgeorge 0:9122ef37df55 149 pwmEdge.fall(NULL);
willgeorge 0:9122ef37df55 150 }
willgeorge 0:9122ef37df55 151 //
willgeorge 0:9122ef37df55 152 }
willgeorge 0:9122ef37df55 153 //
willgeorge 0:9122ef37df55 154
willgeorge 0:9122ef37df55 155 //Control Character 18 = DC2 (PwmOut PWM1(P0_18))
willgeorge 0:9122ef37df55 156 else if(str[0] == '1' && str[1] == '8') {
willgeorge 0:9122ef37df55 157 if(str[2] == 'd') {
willgeorge 0:9122ef37df55 158 DutyCycle1 = atof(s2.c_str());
willgeorge 0:9122ef37df55 159 PWM1=DutyCycle1;
willgeorge 0:9122ef37df55 160 }
willgeorge 0:9122ef37df55 161 else if(str[2] == 'p') {
willgeorge 0:9122ef37df55 162 Period1 = atof(s2.c_str());
willgeorge 0:9122ef37df55 163 PWM1.period(Period1);
willgeorge 0:9122ef37df55 164 }
willgeorge 0:9122ef37df55 165 //
willgeorge 0:9122ef37df55 166 }
willgeorge 0:9122ef37df55 167 //
willgeorge 0:9122ef37df55 168
willgeorge 0:9122ef37df55 169 //Control Character 19 = DC3 (PwmOut PWM2(P0_19))
willgeorge 0:9122ef37df55 170 else if(str[0] == '1' && str[1] == '9') {
willgeorge 0:9122ef37df55 171 if(str[2] == 'd') {
willgeorge 0:9122ef37df55 172 DutyCycle2 = atof(s2.c_str());
willgeorge 0:9122ef37df55 173 PWM2=DutyCycle2;
willgeorge 0:9122ef37df55 174 }
willgeorge 0:9122ef37df55 175 else if(str[2] == 'p') {
willgeorge 0:9122ef37df55 176 Period2 = atof(s2.c_str());
willgeorge 0:9122ef37df55 177 PWM2.period(Period2);
willgeorge 0:9122ef37df55 178 }
willgeorge 0:9122ef37df55 179 //
willgeorge 0:9122ef37df55 180 }
willgeorge 0:9122ef37df55 181 //
willgeorge 0:9122ef37df55 182
willgeorge 0:9122ef37df55 183 //Control Character 20 = DC4 (PwmOut PWM3(P1_15))
willgeorge 0:9122ef37df55 184 else if(str[0] == '2' && str[1] == '0') {
willgeorge 0:9122ef37df55 185 if(str[2] == 'd') {
willgeorge 0:9122ef37df55 186 DutyCycle3 = atof(s2.c_str());
willgeorge 0:9122ef37df55 187 PWM3=DutyCycle3;
willgeorge 0:9122ef37df55 188 }
willgeorge 0:9122ef37df55 189 else if(str[2] == 'p') {
willgeorge 0:9122ef37df55 190 Period3 = atof(s2.c_str());
willgeorge 0:9122ef37df55 191 PWM3.period(Period3);
willgeorge 0:9122ef37df55 192 }
willgeorge 0:9122ef37df55 193 //
willgeorge 0:9122ef37df55 194 }
willgeorge 0:9122ef37df55 195 //
willgeorge 0:9122ef37df55 196
willgeorge 0:9122ef37df55 197 //Control Character 17 = DC1
willgeorge 0:9122ef37df55 198 //Reset the mBuino - (Assuming serial can read)
willgeorge 0:9122ef37df55 199 else if(str[0] == '1' && str[1] == '7') {
willgeorge 0:9122ef37df55 200 goto reset;
willgeorge 0:9122ef37df55 201 } //if
willgeorge 0:9122ef37df55 202
willgeorge 0:9122ef37df55 203 } //if serial.readable()
willgeorge 0:9122ef37df55 204 } //while
willgeorge 0:9122ef37df55 205 } //main
willgeorge 0:9122ef37df55 206 //