Function Generator and Oscilloscope
Dependencies: C12832_lcd DebounceIn mbed
main.cpp
- Committer:
- trichards1138
- Date:
- 2014-05-22
- Revision:
- 0:dfc39b05ea05
- Child:
- 1:e31325194990
File content as of revision 0:dfc39b05ea05:
#include "mbed.h" #include "C12832_lcd.h" #include "DebounceIn.h" #include "rtos.h" Serial pc(USBTX, USBRX); C12832_LCD LCD; AnalogIn Ain(p17); AnalogOut Aout(p18); AnalogIn pot1(p19); AnalogIn pot2(p20); DigitalIn up(p15); DigitalIn down(p12); DigitalIn left(p13); DigitalIn right(p16); BusIn joy(p15,p12,p13,p16); DigitalIn OnOff(p14); PwmOut testout(p21); PwmOut tled(LED1); /* DebounceIn OnOff(p14); DebounceIn up(p15); DebounceIn down(p12); DebounceIn left(p13); DebounceIn right(p16); */ bool en_saw=false, en_dc=false, en_square=false, en_sine=false, en_display=false; // SineWave thread - is initiated when the user selects sinewave output // print a sin function in a small window // the value of pot 1 changes the period of the sine wave // The value of pot 2 changes the height of the sine wave void sineWave(const void *arg) { double i, vert, horiz, outval; while(true) { // thread loop while( en_sine ) { horiz = pot1.read(); // get value of pot 1 vert = pot2.read(); // scale the height of wave // pc.printf("horiz=%f, vert=%f\r\n", horiz, vert); for (i=0; i<2; i=i+0.05) { outval = 0.5 + 0.5*vert*sin(i*3.14159); Aout.write(outval); // Compute the sine value, + half the range //pc.printf("Output is: %f\r\n", outval); Thread::wait(0.00005); // Controls the sine wave period } } Thread::wait(200); } } // Thread squareWave - called if user selects squarewave // pot1 controls the width of pulse // pot2 controls the height of pulse void squareWave(const void *arg) { unsigned int i; float width, height, w; while(true) { // thread loop while( en_square ) { width = pot1.read_u16(); // get value of w = width*2; height = pot2.read(); // scale the height of wave for (i=0; i<w; i++) { if( i >= width ) Aout.write(0); else Aout.write(height); } Thread::wait(5); } Thread::wait(200); } } // Thread flatdc - called if user selects dc sig // pot2 controls the height of dc signal void flatdc(const void *arg) { while(true) { // thread loop while( en_dc ) { Aout.write(pot2.read()); // scale the height of wave Thread::wait(10); } Thread::wait(200); } } void displayWave(const void *arg) { unsigned int i; unsigned int h = LCD.height(), w = LCD.width(), hhh; unsigned int time_base = 0.5; float trigger, curstate; while(true) { // thread loop while( en_display ) { for (i=0; i<w; i++) { hhh = (int)((h-(h*Ain.read()))+4); LCD.pixel(i, hhh ,1); // print pixel Thread::wait(time_base); } LCD.copy_to_lcd(); // LCD.pixel does not update the lcd Thread::wait(20); LCD.cls(); LCD.rect(0,0,w,h,1); trigger = pot1.read(); while( Ain.read() < trigger ) Thread::wait(0.5); if( false ) { //en_square ) { while( Ain.read() > 0.2 ) Thread::wait(0.5); while( Ain.read() < trigger ) Thread::wait(0.5); } } LCD.cls(); } } int main() { bool do_sinewave, do_squarewave, do_sawtooth, do_dc; pc.baud(19200); //testout.period_ms(6); //testout.write(0.5); testout.period_ms(127); testout.pulsewidth_ms(127*pot2.read()); en_display = true; Thread display(displayWave); // Thread square(squareWave); //Thread saw(sawtooth); // Thread dc(flatdc); // Thread sine(sineWave); while(1) { //tled = testout; testout.pulsewidth_ms(127*pot2.read()); Thread::wait(500); } while(1) { while( !OnOff ) { //pc.printf("havent selected yet\r\n"); if( up ) { do_sinewave = false; do_squarewave = false; do_sawtooth = true; do_dc = false; } if( down ) { do_sinewave = false; do_squarewave = false; do_sawtooth = false; do_dc = true; } if( left ) { do_sinewave = true; do_squarewave = false; do_sawtooth = false; do_dc = false; } if( right ) { do_sinewave = false; do_squarewave = true; do_sawtooth = false; do_dc = false; } Thread::wait(20); } if( do_squarewave ) { pc.printf("I selected square\r\n"); en_square = true; } else if( do_sawtooth ) { pc.printf("I selected saw\r\n"); en_saw = true; } else if( do_dc ) { pc.printf("I selected DC\r\n"); en_dc = true; } else { pc.printf("I selected sine\r\n"); en_sine = true; } en_display = true; while( OnOff ) { // pc.printf("In first\r\n"); Thread::wait(200); } while( !OnOff ) { // pc.printf("In Second\r\n"); Thread::wait(200); } while( OnOff ) { // pc.printf("In Third\r\n"); Thread::wait(100); } if( do_squarewave ) { pc.printf("I terminated square\r\n"); en_square = false; } else if( do_sawtooth ) { pc.printf("I terminated saw\r\n"); en_saw = false; } else if( do_dc ) { pc.printf("I terminated DC\r\n"); en_dc = false; } else { pc.printf("I terminated sine\r\n"); en_sine = false; } en_display=false; LCD.cls(); } }