本帖最后由 asd046012 于 2014-6-24 11:53 编辑
电压采样原理图
STM8L的ADC转换一直读不出正确的值。就是读出的值和预期的值相差很大。采用的是连续转换模式,电池是3V,由于分压,采集的电压最大值为1.5V,当低于1.05V时,我们认为电池没电,LED亮,采集的值都是66。程序如下:
void ADC_BaseInit(void)
{
uint8_t i;
uint16_t adc_number[3];
GPIO_Init(GPIOD,GPIO_Pin_0,GPIO_Mode_Out_PP_High_Slow); //PD0 输出高电平
GPIO_Init(GPIOB,GPIO_Pin_0,GPIO_Mode_In_FL_No_IT); //PB0 设置浮空输入
GPIO_Init(GPIOB,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow); //PB1 输出低电平
GPIO_SetBits(GPIOD,GPIO_Pin_0);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);
ADC_DeInit(ADC1);
ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit,ADC_Prescaler_2);
ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);
ADC_VrefintCmd(ENABLE);
ADC_DMACmd(ADC1,DISABLE);
ADC_Cmd(ADC1,ENABLE);
ADC_ChannelCmd(ADC1,ADC_Channel_18,ENABLE);
for(i=0;i<3;i++)
{
ADC_SoftwareStartConv(ADC1);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);
adc_number=ADC_GetConversionValue(ADC1);
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
}
adc_number[0] = (adc_number[1] + adc_number[2])/2;
if(adc_number[0] < 2866)
{
GPIO_ResetBits(GPIOD, GPIO_Pin_0);
Delay_ms(40);
}
ADC_Cmd(ADC1,DISABLE);
}
|