19
19
#define BATT_MIN_VOLTAGE 1500
20
20
21
21
void pwr_mon_bandgap_init (void );
22
- uint32_t pwr_mon_read_vbg (uint32_t channelGroup );
23
- uint32_t pwr_mon_adc_to_mv (uint32_t raw_adc );
22
+ static uint32_t pwr_mon_read_vbg (uint32_t channelGroup );
23
+ static uint32_t pwr_mon_adc_to_mv (uint32_t raw_adc );
24
24
25
25
void pwr_mon_init (void )
26
26
{
@@ -40,21 +40,14 @@ void pwr_mon_init(void)
40
40
power_source_t pwr_mon_get_power_source (void ) {
41
41
power_source_t power_source = PWR_SOURCE_NONE ;
42
42
uint32_t bat_voltage_mv = 0 ;
43
- // Detect if device is battery powered
44
- GPIO_PinWrite (PIN_RUN_VBAT_SENSE_GPIO , PIN_RUN_VBAT_SENSE_BIT , 1 );
45
- // Add a ~3ms delay to allow the 100nF capacitors to charge to about 3*RC.
46
- // 3 clock cycles per loop at -O2 ARMCC optimization
47
- for (uint32_t count = 48000 ; count > 0UL ; count -- );
48
- uint32_t bat_adc = adc_read_channel (0 , PIN_VMON_BAT_ADC_CH , PIN_VMON_BAT_ADC_MUX );
49
- GPIO_PinWrite (PIN_RUN_VBAT_SENSE_GPIO , PIN_RUN_VBAT_SENSE_BIT , 0 );
50
-
43
+
44
+ // Read WAKE_ON_EDGE pin for detecting if board is USB powered
51
45
bool usb_on = (((PIN_WAKE_ON_EDGE_GPIO -> PDIR ) >> PIN_WAKE_ON_EDGE_BIT ) & 0x01U ) ? false : true;
52
46
53
- // Compensate for voltage divider with ratio of 11
54
- bat_adc = bat_adc * 11 ;
55
-
56
- bat_voltage_mv = pwr_mon_adc_to_mv (bat_adc );
47
+ // Read battery voltage
48
+ bat_voltage_mv = pwr_mon_get_vbat_mv ();
57
49
50
+ // Get power source based on battery and USB
58
51
if (usb_on == true && bat_voltage_mv < (BATT_MIN_VOLTAGE )) {
59
52
power_source = PWR_USB_ONLY ;
60
53
} else if (usb_on == true && bat_voltage_mv >= (BATT_MIN_VOLTAGE )) {
@@ -68,23 +61,39 @@ power_source_t pwr_mon_get_power_source(void) {
68
61
return power_source ;
69
62
}
70
63
71
- uint32_t pwr_mon_vcc_mv (void ) {
72
- // ADC read the Vref (same as Vcc) and the Vbg 1V internal reference
64
+ uint32_t pwr_mon_get_vbat_mv (void ) {
65
+ // Enable voltage divider to take measurement
66
+ GPIO_PinWrite (PIN_RUN_VBAT_SENSE_GPIO , PIN_RUN_VBAT_SENSE_BIT , 1 );
67
+ // Add a ~3ms delay to allow the 100nF capacitors to charge to about 3*RC.
68
+ // 3 clock cycles per loop at -O2 ARMCC optimization
69
+ for (uint32_t count = 48000 ; count > 0UL ; count -- );
70
+ uint32_t bat_adc = adc_read_channel (0 , PIN_VMON_BAT_ADC_CH , PIN_VMON_BAT_ADC_MUX );
71
+ // Disable voltage divider
72
+ GPIO_PinWrite (PIN_RUN_VBAT_SENSE_GPIO , PIN_RUN_VBAT_SENSE_BIT , 0 );
73
+
74
+ // Compensate for voltage divider with ratio of 11
75
+ bat_adc = bat_adc * 11 ;
76
+
77
+ return pwr_mon_adc_to_mv (bat_adc );
78
+ }
79
+
80
+ uint32_t pwr_mon_get_vin_mv (void ) {
81
+ // ADC read the Vref (same as Vdda) and the Vbg 1V internal reference
73
82
uint32_t vref_high = adc_read_channel (0 , ADC_VREFH_CHANNEL , ADC_VREFH_MUX );
74
83
uint32_t ref_volt = pwr_mon_read_vbg (0 );
75
84
76
85
// Reference voltage is 1V, scale to millivolts
77
86
return vref_high * 1000 / ref_volt ;
78
87
}
79
88
80
- void pwr_mon_bandgap_init (void ) {
89
+ static void pwr_mon_bandgap_init (void ) {
81
90
pmc_bandgap_buffer_config_t pmcBandgapConfig ;
82
91
pmcBandgapConfig .enable = true;
83
92
pmcBandgapConfig .enableInLowPowerMode = false;
84
93
PMC_ConfigureBandgapBuffer (PMC , & pmcBandgapConfig );
85
94
}
86
95
87
- uint32_t pwr_mon_read_vbg (uint32_t channelGroup ) {
96
+ static uint32_t pwr_mon_read_vbg (uint32_t channelGroup ) {
88
97
// Ensure the Vbg is enabled from first use only
89
98
static bool bandgap_enabled = false;
90
99
if (!bandgap_enabled ) {
@@ -94,7 +103,7 @@ uint32_t pwr_mon_read_vbg(uint32_t channelGroup) {
94
103
return adc_read_channel (channelGroup , ADC_VBG_CHANNEL , ADC_VBG_MUX );
95
104
}
96
105
97
- uint32_t pwr_mon_adc_to_mv (uint32_t raw_adc )
106
+ static uint32_t pwr_mon_adc_to_mv (uint32_t raw_adc )
98
107
{
99
108
// ADC read Vbg, a 1V internal reference
100
109
uint32_t ref_volt_read = pwr_mon_read_vbg (0 );
0 commit comments