Dependencies:   mbed

main.cpp

Committer:
leejarcher
Date:
2011-01-29
Revision:
0:ee3bdb31da2f

File content as of revision 0:ee3bdb31da2f:

#include "mbed.h"

LocalFileSystem local("local");
Serial pc(USBTX, USBRX);
Ticker timer; //interrupt to generate sine wave
DigitalOut low(LED1);
DigitalOut oc(LED2);
DigitalOut high(LED3);
AnalogIn level(p20);
AnalogOut sine_wave(p18);
PwmOut wave(p26);

float pulse_freq;
float pulse_period;
float pulse_width;
float sine_freq;
float sine_period;
float sine_amp;
float sine_vals[19], *sp, *last; //setup array for sine values, a pointer to access the array and one for the end of the array
void setup();
void sine();
void sine_table();

int main() {
    float a;
        
    FILE *fp=fopen("/local/setup.ini", "r");
    if(!fp) { 
        pulse_period=1; //default values if no .ini file
        pulse_width=0.5;
        sine_freq=1000;
        sine_amp=3.3; // peak to peak sine amplitude in V
        }
    else {
        fscanf(fp,"%f %f %f %f",&pulse_period, &pulse_width, &sine_freq, &sine_amp); //read values from .ini file
        fclose(fp);
        }
    wave.period(pulse_period);
    wave=pulse_width;
    sine_table(); //load sine values into table and start interrupt
    
    while(1) { //main loop
    a=level;
    low=(a<0.24); // light low led if voltage less then 0.8V
    high=(a>0.61); // light high led if voltage greater than 2V
    oc=(a>=0.24 && a<=0.61); //light oc LED if open circuit or indeterminate level
    if (pc.readable()) setup(); //if PC keyboard pressed setup waveforms via pc 
    }
 }

void setup() { //function to get waveform values from pc
    printf("\f\n Pulse Frequency (0.1-1000000Hz):- \n");
    scanf("%f",&pulse_freq);
    if (pulse_freq>1000000) pulse_freq=1000000;
    if (pulse_freq<0.1) pulse_freq=0.1;
    pulse_period=1/pulse_freq;
    printf("\n Pulse Width (0.1-0.9):- \n");
    scanf("%f",&pulse_width);
    if (pulse_width>0.9) pulse_width=0.9;
    if (pulse_width<0.1) pulse_width=0.1;
    printf("\n Sine Frequency (0.1-1000Hz):- \n");
    scanf("%f",&sine_freq);
    if (sine_freq>1000) sine_freq=1000;
    if (sine_freq<0.1) sine_freq=0.1;
    printf("\n Sine Amplitude (0-3.3V p/p):- \n");
    scanf("%f",&sine_amp);
    if (sine_amp>3.3) sine_amp=3.3;
    if (sine_amp<0) sine_amp=0;
    printf("\n\n Pulse Frequency %f Hz \n Pulse Width %f \n",pulse_freq, pulse_width);
    printf("\n Sine Frequency %f Hz \n Sine Amplitude %f V \n",sine_freq, sine_amp); 
    FILE *fp=fopen("/local/setup.ini","w"); // save values on flash drive
    fprintf(fp,"%f %f %f %f",pulse_period,pulse_width,sine_freq,sine_amp);
    fclose(fp);
    wave.period(pulse_period); //start PWM output
    wave=pulse_width;
    sine_table(); // load new values into sine table and start interrupt
}

void sine_table() { // function to load sine values into array and start interrupt
    float *p, i;
    
    sine_amp=sine_amp/3.3; //convert from p/p voltage to percentage
    p=sine_vals; //set p to point to beginning of array
    sp=p; //set sp also
    for (i=0;i<3;i+=0.15707965) {
        *p=sine_amp*sin(i);
        p++;
        }
    last=p-1; //last element in array

    sine_period=(1000000/sine_freq)/19; // period between calling sine routine
    timer.attach_us(&sine,sine_period); // start the interrupt
}
    
void sine() { // function to output sine wave to analogue output

    if (sp>last) sp=sine_vals; //if at end of array reset sp back to beginning
    sine_wave.write(*sp);
    sp++;
}