CH32V003J4M6的关于注入通道的疑惑

为了适配和优化打印输出, 稍稍修改了一下EVT的例程 "Auto_Injection" , 具体程序如下: 

根据个人理解, 规格通道和注入通道应该顺序对通道 A0(PA_2)和A2(PC_4)分别采样, 但是奇怪的是对通道 A2 输入信号时会对通道 A0 造成同步的信号, 而通道 A0 却接收不到信号. 具体如下图:


如果是配置错误请指出, 非常感谢!


#include "debug.h"


void ADC_Function_Init(void)

{

    ADC_InitTypeDef  ADC_InitStructure = {0};

    GPIO_InitTypeDef GPIO_InitStructure = {0};


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    RCC_ADCCLKConfig(RCC_PCLK2_Div8);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOC, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    ADC_DeInit(ADC1);

    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 = 1;

    ADC_Init(ADC1, &ADC_InitStructure);


    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_241Cycles);

    ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_241Cycles);

    ADC_Calibration_Vol(ADC1, ADC_CALVOL_50PERCENT);

    ADC_AutoInjectedConvCmd(ADC1, ENABLE);

    ADC_Cmd(ADC1, ENABLE);


    ADC_ResetCalibration(ADC1);

    while(ADC_GetResetCalibrationStatus(ADC1));

    ADC_StartCalibration(ADC1);

    while(ADC_GetCalibrationStatus(ADC1));

}


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;

}

int main(void)

{

    u16 adc_val;

    u16 adc_jval;


    SystemCoreClockUpdate();

    Delay_Init();

    USART_Printf_Init(115200);

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

    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );


    ADC_Function_Init();


    while(1)

    {

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);

        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

        while( !ADC_GetFlagStatus( ADC1, ADC_FLAG_JEOC ) );

        adc_val = ADC_GetConversionValue(ADC1);

        adc_jval = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);

        Delay_Ms(50);

        printf("%04d, %04d\r\n", adc_val, adc_jval);

        Delay_Ms(2);

    }

}


image.png

你好,检查一下代码中是不是使用的外部晶振的宏,system_ch32v00x.c 中,如果是,请改为内部晶振的宏。PA2是外部晶振输入引脚,使用外部晶振的宏会自动使能IO的功能。后续具体请与我邮箱联系zdg@wch.cnimage.png


额, 之前确实没改过来. 刚才试了一下, 修改后对A0通道输入的信号确实有反应了!

但是对A2的信号输入还是会对A0造成干扰, 具体如下图:

image.png 


此时A0通道的引脚未接任何信号 (为悬空状态) 所以,?其他的任何引脚变化都会干扰该引脚??


引脚不可以悬空的,因为采样的时候有采样电容,不接固定电平,电容不能充放电。另外,采样电压要低于VDD。


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