打印
[APM32F0]

APM32F003F6P6芯片,想要ADC采集5个引脚的电压,实际只能读取3个.

[复制链接]
231|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yuanliangbeyond 于 2025-6-27 16:29 编辑

APM32F003F6P6芯片,ADC采集五个引脚的电压,实际只能读取到3个,原因不明.


void ADC_Calibration(void){
    uint8_t i;
    int8_t offset = 0;
    uint16_t adcData = 0;

    ADC_SetOffset(0);
    ADC_EnableCompensation();
    ADC_ClearStatusFlag(ADC_FLAG_CC);
    ADC_Enable();
    ADC_StartConversion();

    for(i = 0; i < 10; i++) {
        while(ADC_ReadStatusFlag(ADC_FLAG_CC) == RESET);
        ADC_ClearStatusFlag(ADC_FLAG_CC);
    }
    ADC_Disable();

    adcData = ADC_ReadData();
    offset = (int8_t)(0x800 - adcData);
    ADC_SetOffset(offset);

    ADC_DisableCompensation();
    ADC_ClearStatusFlag(ADC_FLAG_CC);
}


void ADC_ContinuousScanInit(void){
    ADC_Config_T adcConfig;
    GPIO_Config_T gpioConfig;

    gpioConfig.intEn = GPIO_EINT_DISABLE;
    gpioConfig.mode = GPIO_MODE_IN_FLOATING;
    gpioConfig.pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_4| GPIO_PIN_3;    //AIN0:PC5, AIN1:PC6,AIN2:PC4, AIN3:PD2--烧录口,AIN4:PD3,AIN5:PD5,AIN6:PD6,AIN7:PC3
    GPIO_Config(GPIOC, &gpioConfig);

    gpioConfig.pin = GPIO_PIN_3;
    GPIO_Config(GPIOD, &gpioConfig);

    ADC_SetMode(ADC_MODE_SINGLE_END);

    ADC_ConfigStructInit(&adcConfig);
    adcConfig.div = ADC_DIV_4;
    adcConfig.convMode = ADC_CONV_MODE_CONTINUOUS;
    adcConfig.scanMode = ADC_SCAN_MODE_ENABLE;
    adcConfig.interrupt = ADC_INT_CC;
    adcConfig.channel = ADC_CHANNEL_2; //ADC_CHANNEL_0  ADC_CHANNEL_1 ADC_CHANNEL_2
    ADC_Config(&adcConfig);

    ADC_Calibration();

    ADC_Enable();
    ADC_StartConversion();
}


void ADC_PollForConversion(void){
    uint16_t voltage = 0;
    uint16_t adcArray[10] = {0};
    uint8_t bufferIndex;

    SEGGER_RTT_printf(0, "===========ADC_PollForConversion===2222=======\r\n");

    if(ADC_ReadStatusFlag(ADC_FLAG_CC) == SET){
        // SEGGER_RTT_printf(0, "===========ADC_PollForConversion===55555=======\r\n");
        ADC_ClearStatusFlag(ADC_FLAG_CC);
        for(bufferIndex = 0; bufferIndex < 8; bufferIndex++){
            adcArray[bufferIndex] = ADC_ReadBufferData((ADC_BUFFER_IDX_T)(bufferIndex));
        }

        for(bufferIndex = 0; bufferIndex < 8; bufferIndex++){
        
            voltage = (adcArray[bufferIndex] * 3300) / 4095;
            // printf("ADC Channel %d Value:%d\r\n", bufferIndex, voltage);
            SEGGER_RTT_printf(0, "===========ADC_PollForConversion=1111==========ADC,  Channel:%d,  vol:%d \r\n",bufferIndex, voltage);
        }
    }
}










  

使用特权

评论回复
沙发
Alden| | 2025-6-27 09:59 | 只看该作者
003的ADC连续扫描模式是只能固定从0通道开始扫到n通道,如果用4个ADC通道最好用0,1,2,3的顺序通道,PC3是通道7,用的话之间几个引脚会受影响。把adcConfig.channel = ADC_CHANNEL_2;改成ADC_CHANNEL_3,bufferIndex 的数组加大就可以了

使用特权

评论回复
评论
Gfan 2025-6-27 10:56 回复TA
@yuanliangbeyond :数据手册里面有的噢 
yuanliangbeyond 2025-6-27 10:27 回复TA
我需要采集ADC的总共有5个引脚,分别是"PC3,PC4,PC5,PC6,PD3", 请问, 我应该如何写程序呢? 
yuanliangbeyond 2025-6-27 10:20 回复TA
你上面说"PC3是通道7", 请问, 这个从哪里查到的呢,告诉我吧, 我也去查一下手册. 
yuanliangbeyond 2025-6-27 10:18 回复TA
好像不行, 改成ADC_CHANNEL_3以后, 单片机能正常运行程序, 但是烧录口好像被占用了一样, 无法再次烧录程序. 只能复位恢复出厂设置. 
板凳
yuanliangbeyond|  楼主 | 2025-6-27 10:26 | 只看该作者
我需要采集ADC的总共有5个引脚,分别是"PC3,PC4,PC5,PC6,PD3", 请问, 我应该如何写程序呢?

使用特权

评论回复
地板
真的问题不大| | 2025-6-27 10:59 | 只看该作者
翻了下他们的手册,大概数据手册的第8、9页的位置,PC3引脚可以被配置用作通道7

77361685e08a594847.png (62.3 KB )

77361685e08a594847.png

使用特权

评论回复
5
SirenSong| | 2025-6-27 15:18 | 只看该作者
你看下是adc的第几个通道,然后照着其他几个通道的样子去搞不就好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

14

帖子

0

粉丝