如题。我的代码如下
uint16 adc;
HalAdcSetReference( HAL_ADC_REF_125V );
adc = HalAdcRead( HAL_ADC_CHN_VDD3, HAL_ADC_RESOLUTION_10 );
float volt = (adc*1.25*3)/512;
请问老师上面的代码正确么?我用的usb供电,为何显示的电压为3.6v?
cedar_xuesong:
/********************************************************************** @fnbattMeasure** @briefMeasure the battery level with the ADC and return*it as a percentage 0-100%.** @returnBattery level.*/ static uint8 battMeasure( void ) {uint16 adc;uint8 percent;/*** Battery level conversion from ADC to a percentage:** The maximum ADC value for the battery voltage level is 511 for a* 10-bit conversion.The ADC value is references vs. 1.25v and* this maximum value corresponds to a voltage of 3.75v.** For a coin cell battery 3.0v = 100%.The minimum operating* voltage of the CC2540 is 2.0v so 2.0v = 0%.** To convert a voltage to an ADC value use:**(v/3)/1.25 * 511 = adc** 3.0v = 409 ADC* 2.0v = 273 ADC** We need to map ADC values from 409-273 to 100%-0%.** Normalize the ADC values to zero:** 409 - 273 = 136** And convert ADC range to percentage range:** percent/adc = 100/136 = 25/34** Resulting in the final equation, with round:** percent = ((adc - 273) * 25) + 33 / 34*/// Call measurement setup callbackif (battServiceSetupCB != NULL){battServiceSetupCB();}// Configure ADC and perform a readHalAdcSetReference( HAL_ADC_REF_125V );adc = HalAdcRead( battServiceAdcCh, HAL_ADC_RESOLUTION_10 );// Call measurement teardown callbackif (battServiceTeardownCB != NULL){battServiceTeardownCB();}if (adc >= battMaxLevel){percent = 100;}else if (adc <= battMinLevel){percent = 0;}else{if (battServiceCalcCB != NULL){percent = battServiceCalcCB(adc);}else{uint16 range =battMaxLevel - battMinLevel + 1;// optional if you want to keep it even, otherwise just take floor of divide// range += (range & 1);range >>= 2; // divide by 4percent = (uint8) ((((adc - battMinLevel) * 25) + (range - 1)) / range);}}return percent; }
请参考TI协议栈里面的Batt Profile