CH32V208W4路模拟量采集得到不正确的数据

使用ADC/Auto_Injection Demo,做了些修改, 发现无法让4 ADC都正确工作,只有前面第一个是正确的,后面的都不正确,可以帮忙看看是哪里配置错了吗?


只修改了main.c  修改后的代码如下:

/********************************** (C) COPYRIGHT *******************************

 * File Name          : main.c

 * Author             : WCH

 * Version            : V1.0.0

 * Date               : 2021/06/06

 * Description        : Main program body.

 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.

 * SPDX-License-Identifier: Apache-2.0

 *******************************************************************************/


/*

 *@Note

 自动注入模式例程:

 ADC通道1(PA1)-规则组通道,通道3(PA3)-注入组通道


*/


#include "debug.h"


s16 Calibrattion_Val = 0;


/*********************************************************************

 * @fn      ADC_Function_Init

 *

 * @brief   Initializes ADC collection.

 *

 * @return  none

 */

#define GPIOGROUP GPIOC

#define EXTRA2 1

void ADC_Function_Init(void)

{

    ADC_InitTypeDef  ADC_InitStructure = {0};

    GPIO_InitTypeDef GPIO_InitStructure = {0};


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    RCC_ADCCLKConfig(RCC_PCLK2_Div8);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOGROUP, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOGROUP, &GPIO_InitStructure);

#ifdef EXTRA2

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOGROUP, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOGROUP, &GPIO_InitStructure);

#endif

    ADC_DeInit(ADC1);

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

    ADC_InitStructure.ADC_ScanConvMode = DISABLE;

    //ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    ADC_InitStructure.ADC_NbrOfChannel = 1;

#ifdef EXTRA2

    ADC_InitStructure.ADC_NbrOfChannel = 1;

#endif

    ADC_Init(ADC1, &ADC_InitStructure);


    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5);

    ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_28Cycles5);

    //ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);

    //ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5);

#ifdef EXTRA2

    ADC_InjectedChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_239Cycles5);

    ADC_InjectedChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_239Cycles5);

#endif

    ADC_AutoInjectedConvCmd(ADC1, ENABLE);

    ADC_Cmd(ADC1, ENABLE);


    ADC_BufferCmd(ADC1, DISABLE); //disable buffer

    ADC_ResetCalibration(ADC1);

    while(ADC_GetResetCalibrationStatus(ADC1));

    ADC_StartCalibration(ADC1);

    while(ADC_GetCalibrationStatus(ADC1));

    Calibrattion_Val = Get_CalibrationValue(ADC1);


    ADC_BufferCmd(ADC1, ENABLE); //enable buffer

}


/*********************************************************************

 * @fn      Get_ADC_Val

 *

 * @brief   Returns ADCx conversion result data.

 *

 * @param   ch - ADC channel.

 *            ADC_Channel_0 - ADC Channel0 selected.

 *            ADC_Channel_1 - ADC Channel1 selected.

 *            ADC_Channel_2 - ADC Channel2 selected.

 *            ADC_Channel_3 - ADC Channel3 selected.

 *            ADC_Channel_4 - ADC Channel4 selected.

 *            ADC_Channel_5 - ADC Channel5 selected.

 *            ADC_Channel_6 - ADC Channel6 selected.

 *            ADC_Channel_7 - ADC Channel7 selected.

 *            ADC_Channel_8 - ADC Channel8 selected.

 *            ADC_Channel_9 - ADC Channel9 selected.

 *            ADC_Channel_10 - ADC Channel10 selected.

 *            ADC_Channel_11 - ADC Channel11 selected.

 *            ADC_Channel_12 - ADC Channel12 selected.

 *            ADC_Channel_13 - ADC Channel13 selected.

 *            ADC_Channel_14 - ADC Channel14 selected.

 *            ADC_Channel_15 - ADC Channel15 selected.

 *            ADC_Channel_16 - ADC Channel16 selected.

 *            ADC_Channel_17 - ADC Channel17 selected.

 *

 * @return  none

 */

u16 Get_ADC_Val(u8 ch)

{

    u16 val;


    ADC_SoftwareStartConvCmd(ADC1, ENABLE);


    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));


    val = ADC_GetConversionValue(ADC1);


    return val;

}


/*********************************************************************

 * @fn      Get_ConversionVal

 *

 * @brief   Get Conversion Value.

 *

 * @param   val - Sampling value

 *

 * @return  val+Calibrattion_Val - Conversion Value.

 */

u16 Get_ConversionVal(s16 val)

{

    if((val + Calibrattion_Val) < 0)

        return 0;

    if((Calibrattion_Val + val) > 4095||val==4095)

        return 4095;

    return (val + Calibrattion_Val);

}


/*********************************************************************

 * @fn      main

 *

 * @brief   Main program.

 *

 * @return  none

 */

int main(void)

{

    u16 adc_val;

    u16 adc_jval;

    u16 adc_val_pc2;

    u16 adc_val_pc3;


    Delay_Init();

    USART_Printf_Init(115200);

    printf("SystemClk:%d\r\n", SystemCoreClock);


    ADC_Function_Init();

    printf("CalibrattionValue:%d\n", Calibrattion_Val);

    u16 t = 0;

    while(1)

    {

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);

        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

        adc_val = ADC_GetConversionValue(ADC1);

        adc_jval = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);

#ifdef EXTRA2

        adc_val_pc2 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2);

        adc_val_pc3 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_3);

#endif

        Delay_Ms(500);

        t = Get_ConversionVal(adc_val);

        printf("PC0:%04d\r\n", t);

        printf("PC1:%04d\r\n", Get_ConversionVal(adc_jval));

#ifdef EXTRA2

        printf("PC2:%04d\r\n", Get_ConversionVal(adc_val_pc2));

        printf("PC3:%04d\r\n", Get_ConversionVal(adc_val_pc3));

#endif

        Delay_Ms(2);

    }

}


你好,定时器触发注入组转化例程可参考

icon_rar.gifadc,auto.rar



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