打印

GD ADC采样值不变

[复制链接]
1627|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flyzhaoju|  楼主 | 2022-1-18 08:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      最近做个项目,原始开发用STM32F103C8T6芯片,所有功能调试、验证完成后移植到GD32F103C8T6,发现AD采样有问题。
      按照GD和STM的区别修改了系统启动延时时间,ADC_Cmd(ADC1, ENABLE);后加延时;手动清楚ADC_FLAG_EOC标志位后,能正常采样,但是采样值保持不变。
      开发用的标准库,只有一个通道没有采用DMA。
void  Adc_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_FLOATING  GPIO_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结果。否则超载了

使用特权

评论回复
5
coshi| | 2022-2-6 18:21 | 只看该作者
直接接地 看看是多少

使用特权

评论回复
6
qcliu| | 2022-2-6 18:31 | 只看该作者
这个使用的是什么采集模式啊

使用特权

评论回复
7
drer| | 2022-2-6 18:44 | 只看该作者
采样信号是什么样的信号呢

使用特权

评论回复
8
wiba| | 2022-2-6 18:57 | 只看该作者
如何判定转换就结束了呢

使用特权

评论回复
9
kxsi| | 2022-2-6 19:12 | 只看该作者
连转换模式都没有搞清楚啊

使用特权

评论回复
10
flyzhaoju|  楼主 | 2022-2-24 10:31 | 只看该作者
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //模数转换工作在单次转换模式
模式修改后注解没及时更新
模数转换方式采用单次和连续都测试过了,结果一样。

使用特权

评论回复
11
flyzhaoju|  楼主 | 2022-2-24 10:50 | 只看该作者
drer 发表于 2022-2-6 18:44
采样信号是什么样的信号呢

电压信号,采用射随后入ADC

使用特权

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

本版积分规则

2

主题

10

帖子

0

粉丝