v0.1 board believed to be reading Vbat, Pressure, and X/Y/Z correctly now,
[fw/openalt] / adc / adc.c
1 #include "FreeRTOS.h"
2
3 #include "adc.h"
4
5 //
6 //  Assumes PCLK == 48Mhz
7 //
8 void adcInit (void)
9 {
10   unsigned portLONG ulCompareMatch;
11
12   SCB_PCONP |= SCB_PCONP_PCAD0;
13   SCB_PCONP |= SCB_PCONP_PCAD1;
14
15   PCB_PINSEL0 |= PCB_PINSEL0_P06_AD10;
16   PCB_PINSEL0 |= PCB_PINSEL0_P010_AD12;
17   PCB_PINSEL0 |= PCB_PINSEL0_P012_AD13;
18   PCB_PINSEL0 |= PCB_PINSEL0_P013_AD14;
19   PCB_PINSEL0 |= PCB_PINSEL0_P015_AD15;
20
21   // configure MAT0.1 ... assumes TIMER0 already initialized and running
22
23   // Calculate the match value required for 1khz ADC trigger rate
24   ulCompareMatch = configCPU_CLOCK_HZ / 1000;
25
26   // Account for prescaler, protecting against divide by zero.
27   #if portPRESCALE_VALUE != 0
28   {
29         ulCompareMatch /= ( portPRESCALE_VALUE + 1 );
30   }
31   #endif
32   T0_MR1 = ulCompareMatch;
33   
34   // burst sample desired inputs triggering on MAT0.1
35   AD1_CR  = AD_CR_CLKS10 | AD_CR_PDN | ((11 - 1) << AD_CR_CLKDIVSHIFT);
36   AD1_CR |= AD_CR_SEL0 | AD_CR_SEL2 | AD_CR_SEL3 | AD_CR_SEL4 | AD_CR_SEL5 | AD_CR_BURST;
37   AD1_CR |= AD_CR_START_MAT01;
38 }
39
40 //
41 //  Read and return X accelerometer value
42 //
43 int adcReadX (void)
44 {
45   while (!(AD1_DR3 & AD_DR_DONE)) ;
46   return ((AD1_DR3 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
47 }
48
49 //
50 //  Read and return Y accelerometer value
51 //
52 int adcReadY (void)
53 {
54   while (!(AD1_DR4 & AD_DR_DONE)) ;
55   return ((AD1_DR4 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
56 }
57
58 //
59 //  Read and return Z accelerometer value
60 //
61 int adcReadZ (void)
62 {
63   while (!(AD1_DR5 & AD_DR_DONE)) ;
64   return ((AD1_DR5 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
65 }
66
67 //
68 //  Read and return battery voltage
69 //
70 int adcReadVbat (void)
71 {
72   while (!(AD1_DR0 & AD_DR_DONE)) ;
73   return ((AD1_DR0 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
74 }
75
76 //
77 //  Read and return barometric pressure
78 //
79 int adcReadPres (void)
80 {
81   while (!(AD1_DR2 & AD_DR_DONE)) ;
82   return ((AD1_DR2 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
83 }