ch32v307 ADC 实在找不到问题了,技术帮忙看看

时钟96MHZ, 通道3进行AD转换,做测试.最简单处理方法,全部在一个函数中了

VOID  ADC_Function_test(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);  //ADC分频 最大14M   96/8=12M
    
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3;//通道3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
   // ADC_StructInit(&ADC_InitStructure);
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //ADC1工作在独立模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;         //单通道模式
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   //单次转换模式
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigInjecConv_None;  //转换启动由软件而不是外部启动
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //ADC 数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;              //顺序进行规则的通道数
    ADC_Init(ADC1, &ADC_InitStructure);
    
     ADC_Cmd(ADC1, ENABLE); //使能ADC1
     
    // ADC_BufferCmd(ADC1, DISABLE);   //disable buffer
     ADC_ResetCalibration(ADC1);
     while(ADC_GetResetCalibrationStatus(ADC1));
     ADC_StartCalibration(ADC1);
     while(ADC_GetCalibrationStatus(ADC1));
   //  ADC_BufferCmd(ADC1, ENABLE);   //enable buffer
   
     ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1,ADC_SampleTime_239Cycles5); //采样时间为239.5个周期
     ADC_SoftwareStartConvCmd(ADC1, ENABLE); //启动转换
     while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束??????????死等待了
     ADC_GetConversionValue(ADC1);//读取数据
    return ;
}


在while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //死等


有大老帮帮忙!

ADC_SoftwareStartConvCmd(ADC1, ENABLE); 启动转换,好像没有启动转换,是不是还需要别的位写入才能启动,单次ADC转换?


您好,我这边按照你的配置新建工程配置了一下,并没有遇到卡死现象,下图为测试结果,附件为我的测试例程,你可以对比看一下,或者看看其他地方是否有什么不同,若有需要,可以将你的工程发我邮箱:lzs@wch.cn

icon_rar.gifCH32V307 ADC test.zip

Snipaste_2021-11-29_10-53-25.jpg


谢谢TECH62  , 测试了你的代码工作正常,仔细比较了你的代码。

我的代码错了,出错在ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigInjecConv_None; 

应该是:ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;




再次非常的感谢,问题已解决。


还有地方要注意,ADC使能后,开始读取前务必清除完成标志,否则读取的值是上次的转换值

 ADC_ClearFlag( ADC1, ADC_FLAG_EOC);


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