ADC test for DiscoTech PCB

Dependencies:   Terminal adc mbed

main.cpp

Committer:
flash_ahaa
Date:
2013-09-25
Revision:
0:5c21b4de143f

File content as of revision 0:5c21b4de143f:

/* ADC Test
 * 
 * Project:         DiscoTech
 * HDK/ SDK Eng:    Tobias Wulf
 * Date:            21.09.2013
 *
 */
 
#include "mbed.h"
#include "Terminal.h"

#include "adc.h"


#include "stdlib.h"

#define SAMPLE_RATE 48000 //Hz
#define ADC_BIAS 1.65 //Volts
#define ULSB 3.3 / 4095
#define RESOLUTION 256

#define MASK 0x07 // for shift register

#define NUMBER_OF_SAMPLES 1024

/* declair your functions
 * isr routine doesn't have to be declaired
 */
void mainInit();


ADC adc(SAMPLE_RATE, 1);

/* Serial communication via usb uplink to pc
 * to display what ever you want in the terminal
 * or to send what ever you want from the terminal
 */
Terminal usbPC(USBTX, USBRX);


/* global variables to work in the adc interrupt
 * service routine to get the data from interrupt
 */

double newSample;

bool save;

double adcMin;
double adcMax;
double adcAverage;
double adcSavings[NUMBER_OF_SAMPLES];

int main() {
        
    usbPC.printf("...start program\n");
    wait(0.2);

    mainInit();
    usbPC.printf("...init completed\n");
    wait(0.2);


    while(1) {
        
        if(save == false) {
        
           usbPC.locate(0,0);
           usbPC.cls();
           usbPC.printf("Max = %1.4f\tMin = %1.4f\nAverage = %1.4f\tact. Sample = %1.4f\n", adcMax, adcMin, adcAverage, newSample);
           
           for(int i=0; i<NUMBER_OF_SAMPLES; i++)
                usbPC.printf("%1.4f\n",adcSavings[i]);
        }
        
        if(save == false) break;
        
    }        
}/* end main */




/* interrupt service routine from adc object
 * here should be done the data processing
 * variable and output updates
 */
void getADC(int chan, uint32_t value) {
    //static double adcMax_temp;
    //static double adcMin_temp; //volts max value value
    static double adcTotal = 0.0;
    static double adcSample;
    static long cycleCounter = 0;

    adcSample = (double) adc.read(p15);
    adcSample = adcSample * ULSB; // - ADC_BIAS;
  
    adcTotal += adcSample;
    cycleCounter++;
    
    if (adcSample < adcMin)
                adcMin = adcSample;
                
    if (adcSample > adcMax)
                adcMax = adcSample;
                
    
    if(cycleCounter < NUMBER_OF_SAMPLES) {
       adcSavings[cycleCounter] = adcSample;
       if((cycleCounter == NUMBER_OF_SAMPLES-1) && save) {
            save = false;
            
            newSample = adcSample; 
            //adcMax = adcMax_temp;
            adcAverage = (double)(adcTotal / cycleCounter);
            //adcMin = adcMin_temp;
            adcMax = 0.0;
            adcMin = 3.3;
            adcTotal = 0.0;
            cycleCounter = 0;
       }
    }
}        

/* function to initialize the main program, objects and 
 * implement all variables
 */
void mainInit() {

    save = true;

    adcMin = 3.3;
    adcMax = 0.0;
    adcAverage = 0.0;
    
    for (int i = 0; i < NUMBER_OF_SAMPLES; i++)
        adcSavings[i] = 0.0f;      
    


    usbPC.printf("...variables implemented\n");
    wait(0.2);
    
    
    /* setup adc input
     */
    adc.append(&getADC);
    
    adc.startmode(0,0);
    adc.burst(1);
   
    adc.setup(p15,1);
    adc.setup(p16,0);
    adc.setup(p17,0);
    adc.setup(p18,0);
    adc.setup(p19,0);
    adc.setup(p20,0);
   
    adc.interrupt_state(p15,1);
    
    
    usbPC.printf("%u, %u, %u, %u\n", adc.setup(p15), 
                                     adc.burst(),
                                     adc.interrupt_state(p15), 
                                     adc.actual_sample_rate());   
    
    usbPC.printf("...ADC initialized\n");
    wait(0.2);
    

}