今天学习了一下
STEVAL-IDB007V1的ADC,在DMA demo基础上实现了电池电压检测。开发板设置如下:JP2需要跳线到BAT这一端
板卡背面需要电池供电:
BlueNRG-1的ADC分为以下种转换模式,选择电池电压转换模式:
代码设置就几句搞定,还是很好操作的:
- void ADC_Configuration(void)
- {
- SysCtrl_PeripheralClockCmd(CLOCK_PERIPH_ADC, ENABLE);
-
- /* Configure ADC */
- /* ADC_Input_AdcPin1 == ADC1 */
- /* ADC_Input_AdcPin2 == ADC2 */
- /* ADC_Input_AdcPin12 == ADC1 - ADC2 */
- xADC_InitType.ADC_OSR = ADC_OSR_200;
- //ADC_Input_BattSensor; //ADC_Input_TempSensor;// ADC_Input_AdcPin1 // ADC_Input_AdcPin12 // ADC_Input_AdcPin2
- xADC_InitType.ADC_Input = ADC_Input_BattSensor;//ADC_Input_AdcPin1; //ADC_Input_AdcPin12//ADC_Input_BattSensor
- xADC_InitType.ADC_ConversionMode = ADC_ConversionMode_Continuous;//ADC_ConversionMode_Continuous;//ADC_ConversionMode_Single
- xADC_InitType.ADC_ReferenceVoltage = ADC_ReferenceVoltage_0V6; //ADC_ReferenceVoltage_0V6;
- xADC_InitType.ADC_Attenuation = ADC_Attenuation_0dB;//ADC_Attenuation_0dB ADC_Attenuation_9dB54
-
- ADC_Init(&xADC_InitType);
-
- /* Enable auto offset correction */
- ADC_Calibration(ENABLE);
- ADC_AutoOffsetUpdate(ENABLE);
- }
获取转换结果的时候直接调用:
- printf("ADC value: %.0f mV\r\n", ADC_ConvertBatterySensor(buffer_adc[i],ADC_ReferenceVoltage_0V6)*1000.0);
即可通过串口打印出电池电压:
转换出来的电压和万用表测量结果一样,能满足需求。
需要注意的一点是,BlueNRG的ADC转换和其他MCU稍有区别,内部直接采用了过采样,这样可以在10bit ADC的基础上提高转换结果精度。OSR设置的是过采样的次数。