求助,adc转换a0引脚范围0-4095,换成a1,a3等范围变成20多到3900多了是什么情况,代码里面把对应引脚和通道已经修改

代码如下

#include "debug.h"                // Device header


/**

  * 函    数:AD初始化

  * 参    数:无

  * 返 回 值:无

  */

void AD_Init(void)

{

    /*开启时钟*/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);    //开启ADC1的时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //开启GPIOA的时钟


    /*设置ADC时钟*/

    RCC_ADCCLKConfig(RCC_PCLK2_Div6);                       //选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz


    /*GPIO初始化*/

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);                  //将PA0、PA1、PA2和PA3引脚初始化为模拟输入


    /*不在此处配置规则组序列,而是在每次AD转换前配置,这样可以灵活更改AD转换的通道*/


    /*ADC初始化*/

    ADC_InitTypeDef ADC_InitStructure;                      //定义结构体变量

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;      //模式,选择独立模式,即单独使用ADC1

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //数据对齐,选择右对齐

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发,使用软件触发,不需要外部触发

    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;     //连续转换,失能,每转换一次规则组序列后停止

    ADC_InitStructure.ADC_ScanConvMode = DISABLE;           //扫描模式,失能,只转换规则组的序列1这一个位置

    ADC_InitStructure.ADC_NbrOfChannel = 1;                 //通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1

    ADC_Init(ADC1, &ADC_InitStructure);                     //将结构体变量交给ADC_Init,配置ADC1


    /*ADC使能*/

    ADC_Cmd(ADC1, ENABLE);                                  //使能ADC1,ADC开始运行


    /*ADC校准*/

    ADC_ResetCalibration(ADC1);                             //固定流程,内部有电路会自动执行校准

    while (ADC_GetResetCalibrationStatus(ADC1) == SET);

    ADC_StartCalibration(ADC1);

    while (ADC_GetCalibrationStatus(ADC1) == SET);

}


/**

  * 函    数:获取AD转换的值

  * 参    数:ADC_Channel 指定AD转换的通道,范围:ADC_Channel_x,其中x可以是0/1/2/3

  * 返 回 值:AD转换的值,范围:0~4095

  */

uint16_t AD_GetValue(uint8_t ADC_Channel)

{

    ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);   //在每次转换前,根据函数形参灵活更改规则组的通道1

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);                 //软件触发AD转换一次

    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待EOC标志位,即等待AD转换结束

    return ADC_GetConversionValue(ADC1);                    //读数据寄存器,得到AD转换的结果

}


您好,可以具体说一下所用MCU型号,这边测试一下,注意ADC初始化时需要根据校准值进行一下校准。若使用多通道,注意ADC初始化时通道数要修改,要改成扫描模式,多通道建议使用DMA。后续若有问题,可邮箱(lzs@wch.cn)沟通。


你好,使用的是ch32v307,您所建议的还没有进行尝试


只有登录才能回复,可以选择微信账号登录