]> git.karo-electronics.de Git - oswald.git/blob - metawatch/mw_adc.c
48501268cde35db8812f3621102dabb36a04bfc2
[oswald.git] / metawatch / mw_adc.c
1 #include <msp430.h>
2 #include <msp430xgeneric.h>
3 #include <stdint.h>
4
5 #include "mw_main.h"
6
7 #define HARDWARE_CFG_INPUT_CHANNEL  ( ADC12INCH_13 )
8 #define BATTERY_SENSE_INPUT_CHANNEL ( ADC12INCH_15 )
9 #define LIGHT_SENSE_INPUT_CHANNEL   ( ADC12INCH_1 )
10
11 #define ENABLE_ADC()            { ADC12CTL0 |= ADC12ON; ADC12CTL0 |= ADC12ENC + ADC12SC; }
12 #define DISABLE_ADC()           { ADC12CTL0 &= ~ADC12ENC; ADC12CTL0 &= ~ADC12ON; }
13 #define CLEAR_START_ADDR()      { ADC12CTL1 &= 0x0FFF; }
14
15 const double CONVERSION_FACTOR_BATTERY = ((24300.0+38300.0)*2.5*1000.0)/(4095.0*24300.0);
16 #define BATTERY_FULL_LEVEL              (4140)
17 #define BATTERY_CRITICAL_LEVEL          (3300)
18 #define BATTERY_LEVEL_RANGE             (BATTERY_FULL_LEVEL - BATTERY_CRITICAL_LEVEL)
19
20 /*! conversion factor */
21 const double CONVERSION_FACTOR =  2.5*10000.0/4096.0;
22
23
24 void mw_init_adc(void)
25 {
26         REFCTL0 = REFMSTR | REFTCOFF; 
27
28         LIGHT_SENSE_INIT();
29         BATTERY_SENSE_INIT();
30         HARDWARE_CFG_SENSE_INIT();
31  
32         /* allow conditional request for modosc */
33         UCSCTL8 |= MODOSCREQEN;
34
35         /* select ADC12SC bit as sample and hold source (00) 
36          * and use pulse mode
37          * use modosc / 8 because frequency must be 0.45 MHz to 2.7 MHz (0.625 MHz)
38          */
39         ADC12CTL1 = ADC12CSTARTADD_0 + ADC12SHP + ADC12SSEL_0 + ADC12DIV_7; 
40
41         /* 12 bit resolution, only use reference when doing a conversion */
42         ADC12CTL2 = ADC12TCOFF + ADC12RES_2 + ADC12REFBURST;
43
44         /* setup input channels */
45         ADC12MCTL0 = HARDWARE_CFG_INPUT_CHANNEL + ADC12EOS;
46         ADC12MCTL1 = BATTERY_SENSE_INPUT_CHANNEL + ADC12EOS;
47         ADC12MCTL2 = LIGHT_SENSE_INPUT_CHANNEL + ADC12EOS;
48 }
49
50 unsigned int mw_get_battery_adc_val(void)
51
52         BATTERY_SENSE_ENABLE();
53
54         /* low_bat_en assertion to bat_sense valid is ~100 ns */
55         /* Start battery sense conversion */
56         CLEAR_START_ADDR();
57         ADC12CTL1 |= ADC12CSTARTADD_1;
58         ENABLE_ADC();
59
60         /* WaitForAdcBusy(); */
61         while (ADC12CTL1 & ADC12BUSY);
62
63         /* Convert the ADC count for the battery input into a voltage 
64          * ADC12MEM1: Counts Battery Voltage in ADC counts
65          * Result: Battery voltage in millivolts */
66         BATTERY_SENSE_DISABLE();
67
68         return (unsigned int)(CONVERSION_FACTOR_BATTERY * (double)ADC12MEM1);  
69 }
70
71 unsigned char mw_get_battery_percentage_from_val(unsigned int BattVal)
72 {
73         if (BattVal > BATTERY_FULL_LEVEL)
74                 BattVal = BATTERY_FULL_LEVEL;
75         if (BattVal < BATTERY_CRITICAL_LEVEL)
76                 BattVal = 0;
77         else
78                 BattVal -= BATTERY_CRITICAL_LEVEL;
79         BattVal = (BattVal > 0) ? (BattVal * 10 / (BATTERY_LEVEL_RANGE / 10)) : 0;
80
81         return (unsigned char)BattVal;
82 }
83