flyzhaoju 发表于 2022-1-18 08:07

GD ADC采样值不变

      最近做个项目,原始开发用STM32F103C8T6芯片,所有功能调试、验证完成后移植到GD32F103C8T6,发现AD采样有问题。
      按照GD和STM的区别修改了系统启动延时时间,ADC_Cmd(ADC1, ENABLE);后加延时;手动清楚ADC_FLAG_EOC标志位后,能正常采样,但是采样值保持不变。
      开发用的标准库,只有一个通道没有采用DMA。
voidAdc_Init(void)
{        
//        u8 i;
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟

//        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);   //匹配GD
        //PA1 作为模拟通道输入引脚                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚GPIO_Mode_IN_FLOATINGGPIO_Mode_AIN
GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);//复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模数转换工作在单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //模数转换工作在单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;          //顺序进行规则转换的ADC通道的数目
        ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
        ADC_Init(ADC1, &ADC_InitStructure);             //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );
ADC_TempSensorVrefintCmd(ENABLE);
       
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
//for(i=0;i<100;i++);   //匹配GD
        delay_ms(10);          //匹配GD               
        ADC_ResetCalibration(ADC1);        //使能复位校准
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
        ADC_StartCalibration(ADC1);       //开启AD校准
        while(ADC_GetCalibrationStatus(ADC1));       //等待校准结束
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
}       

u16 Get_Adc(u8 ch)   
{
        u16 ADC_date=0;
        u8 i;

        //设置指定ADC的规则组通道,一个序列,采样时间ADC_SampleTime_239Cycles5
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期                                    
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
       
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )){}; //等待转换结束
ADC_date=ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
                ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
        return(ADC_date);
               
}       

flyzhaoju 发表于 2022-1-18 08:09

以上为原始代码,望各位指点下。

andygirl 发表于 2022-1-19 17:03

不会是照着原子的例程改的吧

xch 发表于 2022-1-25 11:21

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;      //模数转换工作在单次转换模式

//这个不是连续转换模式吗? 怎么说是单次模式?
连续转换得用DMA 获取ADC结果。否则超载了

coshi 发表于 2022-2-6 18:21

直接接地 看看是多少

qcliu 发表于 2022-2-6 18:31

这个使用的是什么采集模式啊

drer 发表于 2022-2-6 18:44

采样信号是什么样的信号呢

wiba 发表于 2022-2-6 18:57

如何判定转换就结束了呢

kxsi 发表于 2022-2-6 19:12

连转换模式都没有搞清楚啊

flyzhaoju 发表于 2022-2-24 10:31

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;      //模数转换工作在单次转换模式
模式修改后注解没及时更新{:cry:}
模数转换方式采用单次和连续都测试过了,结果一样。

flyzhaoju 发表于 2022-2-24 10:50

drer 发表于 2022-2-6 18:44
采样信号是什么样的信号呢

电压信号,采用射随后入ADC
页: [1]
查看完整版本: GD ADC采样值不变