Waveform generator

Dependencies:   4DGL-uLCD-SE AFG_project PinDetect RPG mbed

Committer:
carsonbrown27
Date:
Thu Dec 08 05:06:29 2022 +0000
Revision:
0:7e122b3c7928
Final Version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
carsonbrown27 0:7e122b3c7928 1 #include "mbed.h"
carsonbrown27 0:7e122b3c7928 2 #include "PinDetect.h"
carsonbrown27 0:7e122b3c7928 3 #include "uLCD_4DGL.h"
carsonbrown27 0:7e122b3c7928 4 #include "SongPlayer.h"
carsonbrown27 0:7e122b3c7928 5 #include "RPG.h"
carsonbrown27 0:7e122b3c7928 6 #include "MODDMA.h"
carsonbrown27 0:7e122b3c7928 7 #include "SignalGenDAC.h"
carsonbrown27 0:7e122b3c7928 8 #include "SignalGenDefs.h"
carsonbrown27 0:7e122b3c7928 9 #include <cstdlib>
carsonbrown27 0:7e122b3c7928 10 #include <string.h>
carsonbrown27 0:7e122b3c7928 11
carsonbrown27 0:7e122b3c7928 12 //TO DO:
carsonbrown27 0:7e122b3c7928 13 //Serial Code (Generate Waveform from GUI)
carsonbrown27 0:7e122b3c7928 14
carsonbrown27 0:7e122b3c7928 15 PinDetect pb_w(p5);
carsonbrown27 0:7e122b3c7928 16 PinDetect pb_v(p6);
carsonbrown27 0:7e122b3c7928 17 PinDetect pb_k(p7);
carsonbrown27 0:7e122b3c7928 18 InterruptIn rpg_a(p14,PullUp);
carsonbrown27 0:7e122b3c7928 19 InterruptIn rpg_b(p15,PullUp);
carsonbrown27 0:7e122b3c7928 20 PinDetect pb_rpg(p16);
carsonbrown27 0:7e122b3c7928 21 PwmOut red(p21); // R
carsonbrown27 0:7e122b3c7928 22 PwmOut blue(p22); // G
carsonbrown27 0:7e122b3c7928 23 PwmOut green(p23); // B
carsonbrown27 0:7e122b3c7928 24 uLCD_4DGL uLCD(p28,p27,p30);
carsonbrown27 0:7e122b3c7928 25 SongPlayer mySpeaker(p26);
carsonbrown27 0:7e122b3c7928 26 RPG rpg(p14, p15, p16);
carsonbrown27 0:7e122b3c7928 27 SignalGenDAC signal;
carsonbrown27 0:7e122b3c7928 28 Serial pc(USBTX, USBRX);
carsonbrown27 0:7e122b3c7928 29
carsonbrown27 0:7e122b3c7928 30 float note[18]= {1568.0,1396.9,1244.5, 0.0};
carsonbrown27 0:7e122b3c7928 31 float duration[18]= {0.48,0.24,0.72, 0.0};
carsonbrown27 0:7e122b3c7928 32 volatile int waveform = 0;
carsonbrown27 0:7e122b3c7928 33 volatile int values = 1;
carsonbrown27 0:7e122b3c7928 34 volatile bool khz = true;
carsonbrown27 0:7e122b3c7928 35 volatile bool generated = false;
carsonbrown27 0:7e122b3c7928 36 volatile bool prepared = false;
carsonbrown27 0:7e122b3c7928 37 volatile int places = 1;
carsonbrown27 0:7e122b3c7928 38 float scaling[6] = {0.001, 0.01, 0.1, 1, 10, 100};
carsonbrown27 0:7e122b3c7928 39 volatile float amplitude = 5;
carsonbrown27 0:7e122b3c7928 40 volatile float offset = 0;
carsonbrown27 0:7e122b3c7928 41 volatile float frequency = 10;
carsonbrown27 0:7e122b3c7928 42 volatile int duty_cycle = 50;
carsonbrown27 0:7e122b3c7928 43 volatile int direction = 0;
carsonbrown27 0:7e122b3c7928 44 volatile int value_count = 0;
carsonbrown27 0:7e122b3c7928 45
carsonbrown27 0:7e122b3c7928 46 /*
carsonbrown27 0:7e122b3c7928 47 *** WAVEFORMS ***
carsonbrown27 0:7e122b3c7928 48 0: dc_offset (offset)
carsonbrown27 0:7e122b3c7928 49 1: sine (amplitude, offset, frequency)
carsonbrown27 0:7e122b3c7928 50 2: square (amplitude, offset, frequency)
carsonbrown27 0:7e122b3c7928 51 3: triangle (amplitude, offset, frequency)
carsonbrown27 0:7e122b3c7928 52 4: ramp (amplitude, offset, frequency)
carsonbrown27 0:7e122b3c7928 53 5: pulse (amplitude, offset, frequency, duty_cycle)
carsonbrown27 0:7e122b3c7928 54
carsonbrown27 0:7e122b3c7928 55 *** VALUES ***
carsonbrown27 0:7e122b3c7928 56 0: amplitude (Default: 5, Resolution: 0.01, Range: -5 to 5)
carsonbrown27 0:7e122b3c7928 57 1: offset (Default: 0, Resolution: 0.01, Range: -5 to 5)
carsonbrown27 0:7e122b3c7928 58 2: frequency (Default: 10KHz, Resolution: 1, Range(Hz): 10 to 999, Range(KHz: 1 to 20)
carsonbrown27 0:7e122b3c7928 59 3: duty_cycle (Default: 50, Resolution: 1, Range: 0 to 100)
carsonbrown27 0:7e122b3c7928 60
carsonbrown27 0:7e122b3c7928 61 *** UNITS ***
carsonbrown27 0:7e122b3c7928 62 false: Hz
carsonbrown27 0:7e122b3c7928 63 true: KHz
carsonbrown27 0:7e122b3c7928 64
carsonbrown27 0:7e122b3c7928 65 *** PLACES ***
carsonbrown27 0:7e122b3c7928 66 0: Thousandths (frequency(KHz))
carsonbrown27 0:7e122b3c7928 67 1: Hundredths (amplitude, offset, frequency(KHz))
carsonbrown27 0:7e122b3c7928 68 2: Tenths (amplitude, offset, frequency(KHz))
carsonbrown27 0:7e122b3c7928 69 3: Ones (amplitude, offset, frequency(KHz), frequency(Hz), duty cycle)
carsonbrown27 0:7e122b3c7928 70 4: Tens (frequency(KHz), frequency(Hz), duty cycle)
carsonbrown27 0:7e122b3c7928 71 5: Hundreds (frequency(Hz))
carsonbrown27 0:7e122b3c7928 72 */
carsonbrown27 0:7e122b3c7928 73
carsonbrown27 0:7e122b3c7928 74 float map(float x, float in_min, float in_max, float out_min, float out_max) {
carsonbrown27 0:7e122b3c7928 75 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
carsonbrown27 0:7e122b3c7928 76 }
carsonbrown27 0:7e122b3c7928 77
carsonbrown27 0:7e122b3c7928 78 void updateLCD(void) {
carsonbrown27 0:7e122b3c7928 79 value_count = 0;
carsonbrown27 0:7e122b3c7928 80 uLCD.cls();
carsonbrown27 0:7e122b3c7928 81 // Printing Offset
carsonbrown27 0:7e122b3c7928 82 uLCD.locate(1,1);
carsonbrown27 0:7e122b3c7928 83 if (values == 1) {
carsonbrown27 0:7e122b3c7928 84 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 85 } else {
carsonbrown27 0:7e122b3c7928 86 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 87 }
carsonbrown27 0:7e122b3c7928 88 uLCD.printf("Offset: %3.2f", offset);
carsonbrown27 0:7e122b3c7928 89 if (waveform != 0) {
carsonbrown27 0:7e122b3c7928 90 // Printing Amplitude
carsonbrown27 0:7e122b3c7928 91 uLCD.locate(1,0);
carsonbrown27 0:7e122b3c7928 92 if (values == 0) {
carsonbrown27 0:7e122b3c7928 93 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 94 } else {
carsonbrown27 0:7e122b3c7928 95 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 96 }
carsonbrown27 0:7e122b3c7928 97 uLCD.printf("Amplitude: %3.2f", amplitude);
carsonbrown27 0:7e122b3c7928 98 // Printing Frequency
carsonbrown27 0:7e122b3c7928 99 uLCD.locate(1,2);
carsonbrown27 0:7e122b3c7928 100 if (values == 2) {
carsonbrown27 0:7e122b3c7928 101 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 102 } else {
carsonbrown27 0:7e122b3c7928 103 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 104 }
carsonbrown27 0:7e122b3c7928 105 if (khz) {
carsonbrown27 0:7e122b3c7928 106 uLCD.printf("Freq(KHz): %3.3f", frequency);
carsonbrown27 0:7e122b3c7928 107 } else {
carsonbrown27 0:7e122b3c7928 108 uLCD.printf("Freq(Hz): %3.3f", frequency);
carsonbrown27 0:7e122b3c7928 109 }
carsonbrown27 0:7e122b3c7928 110 }
carsonbrown27 0:7e122b3c7928 111 if (waveform == 5) {
carsonbrown27 0:7e122b3c7928 112 // Printing Duty Cycle
carsonbrown27 0:7e122b3c7928 113 uLCD.locate(1,3);
carsonbrown27 0:7e122b3c7928 114 if (values == 3) {
carsonbrown27 0:7e122b3c7928 115 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 116 } else {
carsonbrown27 0:7e122b3c7928 117 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 118 }
carsonbrown27 0:7e122b3c7928 119 uLCD.printf("Duty Cycle: %3.0d", duty_cycle);
carsonbrown27 0:7e122b3c7928 120 }
carsonbrown27 0:7e122b3c7928 121 //Printing Places
carsonbrown27 0:7e122b3c7928 122 uLCD.locate(1,5);
carsonbrown27 0:7e122b3c7928 123 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 124 uLCD.printf("Place: %3.3f", scaling[places]);
carsonbrown27 0:7e122b3c7928 125 //Printing Waveform
carsonbrown27 0:7e122b3c7928 126 uLCD.locate(1,6);
carsonbrown27 0:7e122b3c7928 127 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 128 uLCD.printf("Waveform:");
carsonbrown27 0:7e122b3c7928 129 uLCD.locate(1,7);
carsonbrown27 0:7e122b3c7928 130 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 131 switch (waveform) {
carsonbrown27 0:7e122b3c7928 132 case 0:
carsonbrown27 0:7e122b3c7928 133 uLCD.printf("DC Offset\n");
carsonbrown27 0:7e122b3c7928 134 break;
carsonbrown27 0:7e122b3c7928 135 case 1:
carsonbrown27 0:7e122b3c7928 136 uLCD.printf("Sine\n");
carsonbrown27 0:7e122b3c7928 137 break;
carsonbrown27 0:7e122b3c7928 138 case 2:
carsonbrown27 0:7e122b3c7928 139 uLCD.printf("Square\n");
carsonbrown27 0:7e122b3c7928 140 break;
carsonbrown27 0:7e122b3c7928 141 case 3:
carsonbrown27 0:7e122b3c7928 142 uLCD.printf("Triangle\n");
carsonbrown27 0:7e122b3c7928 143 break;
carsonbrown27 0:7e122b3c7928 144 case 4:
carsonbrown27 0:7e122b3c7928 145 uLCD.printf("Ramp\n");
carsonbrown27 0:7e122b3c7928 146 break;
carsonbrown27 0:7e122b3c7928 147 case 5:
carsonbrown27 0:7e122b3c7928 148 uLCD.printf("Pulse\n");
carsonbrown27 0:7e122b3c7928 149 break;
carsonbrown27 0:7e122b3c7928 150 default:
carsonbrown27 0:7e122b3c7928 151 break;
carsonbrown27 0:7e122b3c7928 152 }
carsonbrown27 0:7e122b3c7928 153 }
carsonbrown27 0:7e122b3c7928 154
carsonbrown27 0:7e122b3c7928 155 void updateValue(void) {
carsonbrown27 0:7e122b3c7928 156 float scale = scaling[places];
carsonbrown27 0:7e122b3c7928 157 switch (values) {
carsonbrown27 0:7e122b3c7928 158 case 0: // amplitude
carsonbrown27 0:7e122b3c7928 159 amplitude += value_count * scale;
carsonbrown27 0:7e122b3c7928 160 if (amplitude > 5.0) {
carsonbrown27 0:7e122b3c7928 161 amplitude = 5.0;
carsonbrown27 0:7e122b3c7928 162 } else if (amplitude < -5.0) {
carsonbrown27 0:7e122b3c7928 163 amplitude = -5.0;
carsonbrown27 0:7e122b3c7928 164 }
carsonbrown27 0:7e122b3c7928 165 uLCD.locate(1,0);
carsonbrown27 0:7e122b3c7928 166 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 167 uLCD.printf("Amplitude: %3.2f", amplitude);
carsonbrown27 0:7e122b3c7928 168 break;
carsonbrown27 0:7e122b3c7928 169 case 1: // offset
carsonbrown27 0:7e122b3c7928 170 offset += value_count * scale;
carsonbrown27 0:7e122b3c7928 171 if (offset > 5.0) {
carsonbrown27 0:7e122b3c7928 172 offset = 5.0;
carsonbrown27 0:7e122b3c7928 173 } else if (offset < -5.0) {
carsonbrown27 0:7e122b3c7928 174 offset = -5.0;
carsonbrown27 0:7e122b3c7928 175 }
carsonbrown27 0:7e122b3c7928 176 uLCD.locate(1,1);
carsonbrown27 0:7e122b3c7928 177 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 178 uLCD.printf("Offset: %3.2f", offset);
carsonbrown27 0:7e122b3c7928 179 break;
carsonbrown27 0:7e122b3c7928 180 case 2: // frequency
carsonbrown27 0:7e122b3c7928 181 frequency += value_count * scale;
carsonbrown27 0:7e122b3c7928 182 if (frequency > 999 && !khz) {
carsonbrown27 0:7e122b3c7928 183 frequency = 999;
carsonbrown27 0:7e122b3c7928 184 } else if (frequency < 10 && !khz) {
carsonbrown27 0:7e122b3c7928 185 frequency = 10;
carsonbrown27 0:7e122b3c7928 186 } else if (frequency > 20 && khz) {
carsonbrown27 0:7e122b3c7928 187 frequency = 20;
carsonbrown27 0:7e122b3c7928 188 } else if (frequency < 0 && khz) {
carsonbrown27 0:7e122b3c7928 189 frequency = 0;
carsonbrown27 0:7e122b3c7928 190 }
carsonbrown27 0:7e122b3c7928 191 uLCD.locate(1,2);
carsonbrown27 0:7e122b3c7928 192 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 193 if (khz) {
carsonbrown27 0:7e122b3c7928 194 uLCD.printf("Freq(KHz): %3.3f", frequency);
carsonbrown27 0:7e122b3c7928 195 } else {
carsonbrown27 0:7e122b3c7928 196 uLCD.printf("Freq(Hz): %3.3f", frequency);
carsonbrown27 0:7e122b3c7928 197 }
carsonbrown27 0:7e122b3c7928 198 break;
carsonbrown27 0:7e122b3c7928 199 case 3: // duty cycle
carsonbrown27 0:7e122b3c7928 200 duty_cycle += value_count * scale;
carsonbrown27 0:7e122b3c7928 201 if (duty_cycle > 100) {
carsonbrown27 0:7e122b3c7928 202 duty_cycle = 100;
carsonbrown27 0:7e122b3c7928 203 } else if (duty_cycle < 0) {
carsonbrown27 0:7e122b3c7928 204 duty_cycle = 0;
carsonbrown27 0:7e122b3c7928 205 }
carsonbrown27 0:7e122b3c7928 206 uLCD.locate(1,3);
carsonbrown27 0:7e122b3c7928 207 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 208 uLCD.printf("Duty Cycle: %3.0d", duty_cycle);
carsonbrown27 0:7e122b3c7928 209 break;
carsonbrown27 0:7e122b3c7928 210 default:
carsonbrown27 0:7e122b3c7928 211 break;
carsonbrown27 0:7e122b3c7928 212 }
carsonbrown27 0:7e122b3c7928 213 value_count = 0;
carsonbrown27 0:7e122b3c7928 214 }
carsonbrown27 0:7e122b3c7928 215
carsonbrown27 0:7e122b3c7928 216 void changeWaveform(void) {
carsonbrown27 0:7e122b3c7928 217 if (waveform < 5) {
carsonbrown27 0:7e122b3c7928 218 waveform++;
carsonbrown27 0:7e122b3c7928 219 } else {
carsonbrown27 0:7e122b3c7928 220 waveform = 0;
carsonbrown27 0:7e122b3c7928 221 }
carsonbrown27 0:7e122b3c7928 222 if (waveform == 0) {
carsonbrown27 0:7e122b3c7928 223 values = 1;
carsonbrown27 0:7e122b3c7928 224 places = 1;
carsonbrown27 0:7e122b3c7928 225 }
carsonbrown27 0:7e122b3c7928 226 updateLCD();
carsonbrown27 0:7e122b3c7928 227 }
carsonbrown27 0:7e122b3c7928 228
carsonbrown27 0:7e122b3c7928 229 void changeValues(void) {
carsonbrown27 0:7e122b3c7928 230 switch (waveform) {
carsonbrown27 0:7e122b3c7928 231 case 0: // dc_offset
carsonbrown27 0:7e122b3c7928 232 break;
carsonbrown27 0:7e122b3c7928 233 case 5: // pulse
carsonbrown27 0:7e122b3c7928 234 if (values < 3) {
carsonbrown27 0:7e122b3c7928 235 values++;
carsonbrown27 0:7e122b3c7928 236 } else {
carsonbrown27 0:7e122b3c7928 237 values = 0;
carsonbrown27 0:7e122b3c7928 238 }
carsonbrown27 0:7e122b3c7928 239 break;
carsonbrown27 0:7e122b3c7928 240 default:
carsonbrown27 0:7e122b3c7928 241 if (values < 2) {
carsonbrown27 0:7e122b3c7928 242 values++;
carsonbrown27 0:7e122b3c7928 243 } else {
carsonbrown27 0:7e122b3c7928 244 values = 0;
carsonbrown27 0:7e122b3c7928 245 }
carsonbrown27 0:7e122b3c7928 246 break;
carsonbrown27 0:7e122b3c7928 247 }
carsonbrown27 0:7e122b3c7928 248 switch (values) {
carsonbrown27 0:7e122b3c7928 249 case 0: // amplitude
carsonbrown27 0:7e122b3c7928 250 places = 1;
carsonbrown27 0:7e122b3c7928 251 break;
carsonbrown27 0:7e122b3c7928 252 case 1: // offset
carsonbrown27 0:7e122b3c7928 253 places = 1;
carsonbrown27 0:7e122b3c7928 254 break;
carsonbrown27 0:7e122b3c7928 255 case 2: // frequency
carsonbrown27 0:7e122b3c7928 256 if (!khz) {
carsonbrown27 0:7e122b3c7928 257 places = 3;
carsonbrown27 0:7e122b3c7928 258 } else {
carsonbrown27 0:7e122b3c7928 259 places = 0;
carsonbrown27 0:7e122b3c7928 260 }
carsonbrown27 0:7e122b3c7928 261 break;
carsonbrown27 0:7e122b3c7928 262 case 3: // duty cycle
carsonbrown27 0:7e122b3c7928 263 places = 3;
carsonbrown27 0:7e122b3c7928 264 break;
carsonbrown27 0:7e122b3c7928 265 default:
carsonbrown27 0:7e122b3c7928 266 break;
carsonbrown27 0:7e122b3c7928 267 }
carsonbrown27 0:7e122b3c7928 268 updateLCD();
carsonbrown27 0:7e122b3c7928 269 }
carsonbrown27 0:7e122b3c7928 270
carsonbrown27 0:7e122b3c7928 271 void changePlaces(void) {
carsonbrown27 0:7e122b3c7928 272 switch (values) {
carsonbrown27 0:7e122b3c7928 273 case 0: // amplitude
carsonbrown27 0:7e122b3c7928 274 if (places < 3) {
carsonbrown27 0:7e122b3c7928 275 places++;
carsonbrown27 0:7e122b3c7928 276 } else {
carsonbrown27 0:7e122b3c7928 277 places = 1;
carsonbrown27 0:7e122b3c7928 278 }
carsonbrown27 0:7e122b3c7928 279 break;
carsonbrown27 0:7e122b3c7928 280 case 1: // offset
carsonbrown27 0:7e122b3c7928 281 if (places < 3) {
carsonbrown27 0:7e122b3c7928 282 places++;
carsonbrown27 0:7e122b3c7928 283 } else {
carsonbrown27 0:7e122b3c7928 284 places = 1;
carsonbrown27 0:7e122b3c7928 285 }
carsonbrown27 0:7e122b3c7928 286 break;
carsonbrown27 0:7e122b3c7928 287 case 2: // frequency
carsonbrown27 0:7e122b3c7928 288 if (!khz && places < 5) {
carsonbrown27 0:7e122b3c7928 289 places++;
carsonbrown27 0:7e122b3c7928 290 } else if (!khz) {
carsonbrown27 0:7e122b3c7928 291 khz = true;
carsonbrown27 0:7e122b3c7928 292 places = 0;
carsonbrown27 0:7e122b3c7928 293 frequency = 0;
carsonbrown27 0:7e122b3c7928 294 } else if (khz && places < 4) {
carsonbrown27 0:7e122b3c7928 295 places++;
carsonbrown27 0:7e122b3c7928 296 } else if (khz) {
carsonbrown27 0:7e122b3c7928 297 khz = false;
carsonbrown27 0:7e122b3c7928 298 places = 3;
carsonbrown27 0:7e122b3c7928 299 frequency = 0;
carsonbrown27 0:7e122b3c7928 300 }
carsonbrown27 0:7e122b3c7928 301 break;
carsonbrown27 0:7e122b3c7928 302 case 3: // duty cycle
carsonbrown27 0:7e122b3c7928 303 if (places < 4) {
carsonbrown27 0:7e122b3c7928 304 places++;
carsonbrown27 0:7e122b3c7928 305 } else {
carsonbrown27 0:7e122b3c7928 306 places = 3;
carsonbrown27 0:7e122b3c7928 307 }
carsonbrown27 0:7e122b3c7928 308 break;
carsonbrown27 0:7e122b3c7928 309 default:
carsonbrown27 0:7e122b3c7928 310 break;
carsonbrown27 0:7e122b3c7928 311 }
carsonbrown27 0:7e122b3c7928 312 updateLCD();
carsonbrown27 0:7e122b3c7928 313 }
carsonbrown27 0:7e122b3c7928 314
carsonbrown27 0:7e122b3c7928 315 void adjustValues(void) {
carsonbrown27 0:7e122b3c7928 316 value_count += rpg.dir();
carsonbrown27 0:7e122b3c7928 317 }
carsonbrown27 0:7e122b3c7928 318
carsonbrown27 0:7e122b3c7928 319 void generate(void)
carsonbrown27 0:7e122b3c7928 320 {
carsonbrown27 0:7e122b3c7928 321 if (!generated && !prepared) {
carsonbrown27 0:7e122b3c7928 322 uLCD.cls();
carsonbrown27 0:7e122b3c7928 323 uLCD.locate(1,0);
carsonbrown27 0:7e122b3c7928 324 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 325 uLCD.printf("Waveform is being prepared");
carsonbrown27 0:7e122b3c7928 326 float adjusted_frequency = frequency;
carsonbrown27 0:7e122b3c7928 327 if (khz) {
carsonbrown27 0:7e122b3c7928 328 adjusted_frequency *= 1000.0;
carsonbrown27 0:7e122b3c7928 329 }
carsonbrown27 0:7e122b3c7928 330 switch (waveform) {
carsonbrown27 0:7e122b3c7928 331 case 0: // dc_offset
carsonbrown27 0:7e122b3c7928 332 signal.PrepareWaveform(SG_SQUARE, 10000, 100, map(offset, -5, 5, 0, 3.3), 0);
carsonbrown27 0:7e122b3c7928 333 break;
carsonbrown27 0:7e122b3c7928 334 case 1: // sine
carsonbrown27 0:7e122b3c7928 335 signal.PrepareWaveform(SG_SINE, adjusted_frequency, 50, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3));
carsonbrown27 0:7e122b3c7928 336 break;
carsonbrown27 0:7e122b3c7928 337 case 2: // square
carsonbrown27 0:7e122b3c7928 338 signal.PrepareWaveform(SG_SQUARE, adjusted_frequency, 50, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3));
carsonbrown27 0:7e122b3c7928 339 break;
carsonbrown27 0:7e122b3c7928 340 case 3: // triangle
carsonbrown27 0:7e122b3c7928 341 signal.PrepareWaveform(SG_TRIANGLE, adjusted_frequency, 50, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3));
carsonbrown27 0:7e122b3c7928 342 break;
carsonbrown27 0:7e122b3c7928 343 case 4: // ramp
carsonbrown27 0:7e122b3c7928 344 signal.PrepareWaveform(SG_SAWTOOTH, adjusted_frequency, 50, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3));
carsonbrown27 0:7e122b3c7928 345 break;
carsonbrown27 0:7e122b3c7928 346 case 5: // pulse
carsonbrown27 0:7e122b3c7928 347 signal.PrepareWaveform(SG_SQUARE, adjusted_frequency, duty_cycle, map(amplitude, -5, 5, 0, 3.3), map(offset, -5, 5, 0, 3.3));
carsonbrown27 0:7e122b3c7928 348 break;
carsonbrown27 0:7e122b3c7928 349 default:
carsonbrown27 0:7e122b3c7928 350 break;
carsonbrown27 0:7e122b3c7928 351 }
carsonbrown27 0:7e122b3c7928 352 wait(1.0);
carsonbrown27 0:7e122b3c7928 353 mySpeaker.PlaySong(note,duration);
carsonbrown27 0:7e122b3c7928 354 red = 1.0;
carsonbrown27 0:7e122b3c7928 355 green = 0.0;
carsonbrown27 0:7e122b3c7928 356 blue = 1.0;
carsonbrown27 0:7e122b3c7928 357 prepared = true;
carsonbrown27 0:7e122b3c7928 358 } else if (!generated) {
carsonbrown27 0:7e122b3c7928 359 uLCD.cls();
carsonbrown27 0:7e122b3c7928 360 uLCD.locate(1,0);
carsonbrown27 0:7e122b3c7928 361 uLCD.color(BLUE);
carsonbrown27 0:7e122b3c7928 362 uLCD.printf("Waveform is being generated");
carsonbrown27 0:7e122b3c7928 363 signal.Start();
carsonbrown27 0:7e122b3c7928 364 red = 1.0;
carsonbrown27 0:7e122b3c7928 365 green = 1.0;
carsonbrown27 0:7e122b3c7928 366 blue = 0.0;
carsonbrown27 0:7e122b3c7928 367 generated = true;
carsonbrown27 0:7e122b3c7928 368 } else {
carsonbrown27 0:7e122b3c7928 369 signal.Stop();
carsonbrown27 0:7e122b3c7928 370 red = 0.0;
carsonbrown27 0:7e122b3c7928 371 green = 1.0;
carsonbrown27 0:7e122b3c7928 372 blue = 1.0;
carsonbrown27 0:7e122b3c7928 373 updateLCD();
carsonbrown27 0:7e122b3c7928 374 prepared = false;
carsonbrown27 0:7e122b3c7928 375 generated = false;
carsonbrown27 0:7e122b3c7928 376 }
carsonbrown27 0:7e122b3c7928 377 }
carsonbrown27 0:7e122b3c7928 378
carsonbrown27 0:7e122b3c7928 379 int main() {
carsonbrown27 0:7e122b3c7928 380 pb_w.mode(PullUp);
carsonbrown27 0:7e122b3c7928 381 pb_v.mode(PullUp);
carsonbrown27 0:7e122b3c7928 382 pb_k.mode(PullUp);
carsonbrown27 0:7e122b3c7928 383 pb_rpg.mode(PullDown);
carsonbrown27 0:7e122b3c7928 384 wait(.001);
carsonbrown27 0:7e122b3c7928 385 pb_w.attach_deasserted(&changeWaveform);
carsonbrown27 0:7e122b3c7928 386 pb_v.attach_deasserted(&changeValues);
carsonbrown27 0:7e122b3c7928 387 pb_k.attach_deasserted(&changePlaces);
carsonbrown27 0:7e122b3c7928 388 pb_rpg.attach_deasserted(&generate);
carsonbrown27 0:7e122b3c7928 389 pb_w.setSampleFrequency();
carsonbrown27 0:7e122b3c7928 390 pb_v.setSampleFrequency();
carsonbrown27 0:7e122b3c7928 391 pb_k.setSampleFrequency();
carsonbrown27 0:7e122b3c7928 392 pb_rpg.setSampleFrequency();
carsonbrown27 0:7e122b3c7928 393 red = 0.0; // 1.0 is off, 0.0 on
carsonbrown27 0:7e122b3c7928 394 green = 1.0;
carsonbrown27 0:7e122b3c7928 395 blue = 1.0;
carsonbrown27 0:7e122b3c7928 396 rpg_a.rise(&adjustValues);
carsonbrown27 0:7e122b3c7928 397 rpg_a.fall(&adjustValues);
carsonbrown27 0:7e122b3c7928 398 rpg_b.rise(&adjustValues);
carsonbrown27 0:7e122b3c7928 399 rpg_b.fall(&adjustValues);
carsonbrown27 0:7e122b3c7928 400 updateLCD();
carsonbrown27 0:7e122b3c7928 401 while(1) {
carsonbrown27 0:7e122b3c7928 402 if (!generated && !prepared && value_count != 0) {
carsonbrown27 0:7e122b3c7928 403 updateValue();
carsonbrown27 0:7e122b3c7928 404 }
carsonbrown27 0:7e122b3c7928 405 if (pc.readable()) {
carsonbrown27 0:7e122b3c7928 406 char str[100];
carsonbrown27 0:7e122b3c7928 407 char* message = pc.gets(str, 100);
carsonbrown27 0:7e122b3c7928 408 pc.printf(message);
carsonbrown27 0:7e122b3c7928 409 if (prepared && !generated) {
carsonbrown27 0:7e122b3c7928 410 pc.printf("generating");
carsonbrown27 0:7e122b3c7928 411 generate();
carsonbrown27 0:7e122b3c7928 412 } else if (prepared && generated) {
carsonbrown27 0:7e122b3c7928 413 pc.printf("stopping");
carsonbrown27 0:7e122b3c7928 414 generate();
carsonbrown27 0:7e122b3c7928 415 } else {
carsonbrown27 0:7e122b3c7928 416 uLCD.locate(1,8);
carsonbrown27 0:7e122b3c7928 417 uLCD.color(GREEN);
carsonbrown27 0:7e122b3c7928 418 uLCD.printf("%s", message);
carsonbrown27 0:7e122b3c7928 419 char* token = strtok(message, ",");
carsonbrown27 0:7e122b3c7928 420 char* waveformStr = token;
carsonbrown27 0:7e122b3c7928 421 token = strtok(NULL, ",");
carsonbrown27 0:7e122b3c7928 422 char* amplitudeStr = token;
carsonbrown27 0:7e122b3c7928 423 token = strtok(NULL, ",");
carsonbrown27 0:7e122b3c7928 424 char* offsetStr = token;
carsonbrown27 0:7e122b3c7928 425 token = strtok(NULL, ",");
carsonbrown27 0:7e122b3c7928 426 char* frequencyStr = token;
carsonbrown27 0:7e122b3c7928 427 token = strtok(NULL, ",");
carsonbrown27 0:7e122b3c7928 428 char* duty_cycleStr = token;
carsonbrown27 0:7e122b3c7928 429 waveform = atoi(waveformStr);
carsonbrown27 0:7e122b3c7928 430 amplitude = atof(amplitudeStr);
carsonbrown27 0:7e122b3c7928 431 offset = atof(offsetStr);
carsonbrown27 0:7e122b3c7928 432 frequency = atof(frequencyStr);
carsonbrown27 0:7e122b3c7928 433 if (frequency >= 1000.0) {
carsonbrown27 0:7e122b3c7928 434 khz = true;
carsonbrown27 0:7e122b3c7928 435 frequency /= 1000.0;
carsonbrown27 0:7e122b3c7928 436 } else {
carsonbrown27 0:7e122b3c7928 437 khz = false;
carsonbrown27 0:7e122b3c7928 438 }
carsonbrown27 0:7e122b3c7928 439 duty_cycle = atoi(duty_cycleStr);
carsonbrown27 0:7e122b3c7928 440 updateLCD();
carsonbrown27 0:7e122b3c7928 441 prepared = false;
carsonbrown27 0:7e122b3c7928 442 generated = false;
carsonbrown27 0:7e122b3c7928 443 generate();
carsonbrown27 0:7e122b3c7928 444 }
carsonbrown27 0:7e122b3c7928 445 }
carsonbrown27 0:7e122b3c7928 446 }
carsonbrown27 0:7e122b3c7928 447 }