使用adc1规则组:ch1,ch2,ch3。三路待测电压,如果不接到引脚上,均是在1.5-2.5V变化
待测电压接到IO口上之后,发现AD测的不准。最后发现,不是程序问题,而是:待测电压接到IO口上之后,再次测量待测电压的电平,接到ch3上的是正常的,ch1待测电压变化范围变成0.1-0.5,ch2待测电压范围变成2.8-3.1。。。。。怎么引脚还能影响电压不成?
把待测电压与IO口分离之后,电压就又正常了。。。。
这是什么情况!!!求解答,谢谢大神。
初始化:
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA , ENABLE); //时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //ACD1_CH0  A0 CH1:PA1 CH2:PA2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟分频
ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描模式使能
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式使能
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //无外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐 右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3; //3通道
ADC_Init(ADC1, &ADC_InitStructure); //initialization
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器状态,等待
ADC_StartCalibration(ADC1); //开始ADC1的校准
while(ADC_GetCalibrationStatus(ADC1)); //获取ADC1的校准状态,等待
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道0,规则采样顺序值为1,采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道1,规则采样顺序值为1,采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道2,规则采样顺序值为1,采样时间为239.5周期
主函数中:
Adc_Init();
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(1)
{
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_STRT)); //stat = 0 时等待 1则转换完成
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //EOC = 0 时等待 1则转换完成
temp1 =ADC_GetConversionValue(ADC1);
LCD_ShowNum(100, 110,temp1,5,12);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待第二次转换完成
temp1 = ADC_GetConversionValue(ADC1);
LCD_ShowNum(100, 120,temp1,5,12);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待第三次转换完成
temp1 = ADC_GetConversionValue(ADC1);
LCD_ShowNum(100, 130,temp1,5,12);
ADC_ClearFlag(ADC1, ADC_FLAG_STRT);
}
|