本帖最后由 vvhhbc1 于 2015-11-28 12:59 编辑 我用的是stm32F0 芯片通过ad采样压值, 电池电压经分压电阻分压后输入PA0 -WKUP1管脚, 经检测,当输入PA0的压值为0.6v时,AD转换值全部都在750左右,经计算,该ad值属于正常。 但是问题来了:当电池电压经分压后,输入PA0的压值为1.05v时,AD转换值如下: 读取的12位ad值,几乎全是4095,中间偶有1294,1293等值, 经计算,这个1294,1293等值应该是对应1.05v的AD转换值 为什么采样值中有这么多的4095呢? 我的代码如下: void BATT_Initial(void) { HAL_ADCEx_Calibration_Start(&hadc); //adc较准 } u32 GetBattValue(void) { static u32 bat; if(HAL_ADC_Start(&hadc) != HAL_OK) ; if (HAL_ADC_PollForConversion(&hadc, 10) != HAL_OK) ; if(HAL_ADC_GetState(&hadc) & HAL_ADC_STATE_REG_EOC) { bat = HAL_ADC_GetValue(&hadc); printf("bat=%ld\r\n",(unsigned long)bat); } return (bat); } AD设置如下: 请问问题出在哪里呢?盼能得到帮助,谢谢! |
你先用3.3v的测试下你的,ad数据吧。。 正常3.3v的时候才是你的ad满量程。。。 难道使用的是外部基准?
这个是我测试的F030R8的,没有问题。。。。用的是HAL 1.40的库
if(HAL_ADC_Start(&hadc) != HAL_OK)
{
/* Start Conversation Error */
//HAL_GPIO_WritePin (GPIOC ,GPIO_PIN_13,GPIO_PIN_SET );
}
if (HAL_ADC_PollForConversion(&hadc, 10) != HAL_OK)
{
/* End Of Conversion flag not set on time */
HAL_GPIO_WritePin (GPIOA ,GPIO_PIN_5,GPIO_PIN_SET );
}
else
{
/* ADC conversion completed */
/*##-5- Get the converted value of regular channel ########################*/
uhADCxConvertedValue = HAL_ADC_GetValue(&hadc);
}
float value=0;
value = uhADCxConvertedValue*3300/4095;
printf ("PA0 ADC=%.2fV\r",value/1000 );
static u32 bat?
u16 GetBattValue(void)
{
u16 bat;
if(HAL_ADC_Start(&hadc) != HAL_OK)
;
if (HAL_ADC_PollForConversion(&hadc, 10) != HAL_OK)
;
if(HAL_ADC_GetState(&hadc) & HAL_ADC_STATE_REG_EOC)
{
bat = HAL_ADC_GetValue(&hadc);
printf("bat=%d\r\n",bat);
}
return (bat);
}
这不是问题的根源阿,谢谢!