X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=adc%2Fadc.c;h=b34dcf121c5f247989b71444b1c2786eda7ce72a;hb=HEAD;hp=358a18d9dc33346357d3a84a39271af2678c67e1;hpb=d2311161540192cbc06d5bb19f3767bfc80274c2;p=fw%2Fopenalt diff --git a/adc/adc.c b/adc/adc.c index 358a18d..b34dcf1 100644 --- a/adc/adc.c +++ b/adc/adc.c @@ -3,26 +3,81 @@ #include "adc.h" // +// Assumes PCLK == 48Mhz // -// -int adcRead0_3 (void) +void adcInit (void) { - AD0_CR |= AD_CR_START_NOW; + unsigned portLONG ulCompareMatch; + + SCB_PCONP |= SCB_PCONP_PCAD0; + SCB_PCONP |= SCB_PCONP_PCAD1; + + PCB_PINSEL0 |= PCB_PINSEL0_P06_AD10; + PCB_PINSEL0 |= PCB_PINSEL0_P010_AD12; + PCB_PINSEL0 |= PCB_PINSEL0_P012_AD13; + PCB_PINSEL0 |= PCB_PINSEL0_P013_AD14; + PCB_PINSEL0 |= PCB_PINSEL0_P015_AD15; + + // configure MAT0.1 ... assumes TIMER0 already initialized and running - while (!(AD0_DR3 & AD_DR_DONE)) - ; + // Calculate the match value required for 1khz ADC trigger rate + ulCompareMatch = configCPU_CLOCK_HZ / 1000; - return ((AD0_DR3 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT); + // Account for prescaler, protecting against divide by zero. + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + T0_MR1 = ulCompareMatch; + + // burst sample desired inputs triggering on MAT0.1 + AD1_CR = AD_CR_CLKS10 | AD_CR_PDN | ((11 - 1) << AD_CR_CLKDIVSHIFT); + AD1_CR |= AD_CR_SEL0 | AD_CR_SEL2 | AD_CR_SEL3 | AD_CR_SEL4 | AD_CR_SEL5 | AD_CR_BURST; + AD1_CR |= AD_CR_START_MAT01; } // -// Assumes PCLK == 48Mhz +// Read and return X accelerometer value // -void adcInit (void) +int adcReadX (void) { - SCB_PCONP |= SCB_PCONP_PCAD0; + while (!(AD1_DR3 & AD_DR_DONE)) ; + return ((AD1_DR3 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT); +} + +// +// Read and return Y accelerometer value +// +int adcReadY (void) +{ + while (!(AD1_DR4 & AD_DR_DONE)) ; + return ((AD1_DR4 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT); +} + +// +// Read and return Z accelerometer value +// +int adcReadZ (void) +{ + while (!(AD1_DR5 & AD_DR_DONE)) ; + return ((AD1_DR5 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT); +} - PCB_PINSEL1 |= PCB_PINSEL1_P030_AD03; +// +// Read and return battery voltage +// +int adcReadVbat (void) +{ + while (!(AD1_DR0 & AD_DR_DONE)) ; + return ((AD1_DR0 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT); +} - AD0_CR = AD_CR_CLKS10 | AD_CR_PDN | ((11 - 1) << AD_CR_CLKDIVSHIFT) | AD_CR_SEL3; +// +// Read and return barometric pressure +// +int adcReadPres (void) +{ + while (!(AD1_DR2 & AD_DR_DONE)) ; + return ((AD1_DR2 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT); }