OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3809|回复: 0

ADC采集多个通道时发生错误

[复制链接]

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2019-10-22
在线时间
46 小时
发表于 2020-11-7 19:43:26 | 显示全部楼层 |阅读模式
2金钱
用的是蓝桥杯嵌入式开发板,主控STM32F103RBT6,板子上有一个滑动变阻器连接到ADC1通道8-PB0,同时扩展板上利用通道5-PA5做了ADC按键,使用过程中发现这两个引脚单独采AD都是没有问题的,但是一起使用的时候就会出现这两个通道给出的值是反的。
就是说代码采集通道5的时候返回的是通道8的值,采集通道8时返回的是通道5的值
初始化和调用代码如下

void adc_init(void)
{
    ADC_InitTypeDef  ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
   
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 2;
    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5);
   

    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);

    /* Enable ADC1 reset calibration register */   
    ADC_ResetCalibration(ADC1);
    /* Check the end of ADC1 reset calibration register */
    while(ADC_GetResetCalibrationStatus(ADC1));

    /* Start ADC1 calibration */
    ADC_StartCalibration(ADC1);
    /* Check the end of ADC1 calibration */
    while(ADC_GetCalibrationStatus(ADC1));

    /* Start ADC1 Software Conversion */
    ADC_SoftwareStartConvCmd(ADC1, ENABLE)
}

u16 Get_adc(u8 ch)
{
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_55Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);
   
    return ADC_GetConversionValue(ADC1);
}
主函数里相关的的代码如下


        sprintf(LCD_BUF, "ADC_IN8:%4d", Get_adc(ADC_Channel_8));
        LCD_DisplayStringLine(Line2,(u8*)LCD_BUF);
        memset(LCD_BUF, 21, 0);
        

        sprintf(LCD_BUF, "ADC_IN5:%4d", Get_adc(ADC_Channel_5));
        LCD_DisplayStringLine(Line3,(u8*)LCD_BUF);
        memset(LCD_BUF, 21, 0);
下载到板子上后发现ADC_IN8显示的是通道5的值而ADC_IN5显示的是通道8的值。
试了一下其他的通道输出也全都是反过来的,你输出我的我输出你的值,非常离谱。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 15:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表