2 #include <msp430xgeneric.h>
7 #define HARDWARE_CFG_INPUT_CHANNEL ( ADC12INCH_13 )
8 #define BATTERY_SENSE_INPUT_CHANNEL ( ADC12INCH_15 )
9 #define LIGHT_SENSE_INPUT_CHANNEL ( ADC12INCH_1 )
11 #define ENABLE_ADC() { ADC12CTL0 |= ADC12ON; ADC12CTL0 |= ADC12ENC + ADC12SC; }
12 #define DISABLE_ADC() { ADC12CTL0 &= ~ADC12ENC; ADC12CTL0 &= ~ADC12ON; }
13 #define CLEAR_START_ADDR() { ADC12CTL1 &= 0x0FFF; }
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)
20 /*! conversion factor */
21 const double CONVERSION_FACTOR = 2.5*10000.0/4096.0;
24 void mw_init_adc(void)
26 REFCTL0 = REFMSTR | REFTCOFF;
30 HARDWARE_CFG_SENSE_INIT();
32 /* allow conditional request for modosc */
33 UCSCTL8 |= MODOSCREQEN;
35 /* select ADC12SC bit as sample and hold source (00)
37 * use modosc / 8 because frequency must be 0.45 MHz to 2.7 MHz (0.625 MHz)
39 ADC12CTL1 = ADC12CSTARTADD_0 + ADC12SHP + ADC12SSEL_0 + ADC12DIV_7;
41 /* 12 bit resolution, only use reference when doing a conversion */
42 ADC12CTL2 = ADC12TCOFF + ADC12RES_2 + ADC12REFBURST;
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;
50 unsigned int mw_get_battery_adc_val(void)
52 BATTERY_SENSE_ENABLE();
54 /* low_bat_en assertion to bat_sense valid is ~100 ns */
55 /* Start battery sense conversion */
57 ADC12CTL1 |= ADC12CSTARTADD_1;
60 /* WaitForAdcBusy(); */
61 while (ADC12CTL1 & ADC12BUSY)
64 /* Convert the ADC count for the battery input into a voltage
65 * ADC12MEM1: Counts Battery Voltage in ADC counts
66 * Result: Battery voltage in millivolts */
67 BATTERY_SENSE_DISABLE();
69 return (unsigned int)(CONVERSION_FACTOR_BATTERY * (double)ADC12MEM1);
72 uint8_t mw_get_battery_percentage_from_val(unsigned int BattVal)
74 if (BattVal > BATTERY_FULL_LEVEL)
75 BattVal = BATTERY_FULL_LEVEL;
76 if (BattVal < BATTERY_CRITICAL_LEVEL)
79 BattVal -= BATTERY_CRITICAL_LEVEL;
80 BattVal = (BattVal > 0) ? (BattVal * 10 / (BATTERY_LEVEL_RANGE / 10)) : 0;
82 return (unsigned char)BattVal;
85 uint16_t mw_get_amblight_adc_val(void)
90 ADC12CTL1 |= ADC12CSTARTADD_2;
93 /* WaitForAdcBusy(); */
94 while (ADC12CTL1 & ADC12BUSY)
97 LIGHT_SENSE_DISABLE();