打印

GD32F130R8T6的ADC问题

[复制链接]
3036|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvben5d|  楼主 | 2018-4-25 15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC初始化函数void ADC_Configuration(void)
{
        /* ADC channel length config */
    adc_channel_length_config(ADC_REGULAR_CHANNEL, 2);
        /* ADC regular channel config */
    adc_regular_channel_config(1, ADC_CHANNEL_10, ADC_SAMPLETIME_239POINT5); //USB 5V
    adc_regular_channel_config(2, ADC_CHANNEL_4,  ADC_SAMPLETIME_239POINT5); //BAT 12V
       
        /* ADC external trigger enable */
    adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
        /* ADC external trigger source config */
    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_SWRCST);
        /* ADC data alignment config */
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
        /* ADC discontinuous mode */
    //adc_discontinuous_mode_config(ADC_REGULAR_CHANNEL,1);
        /* enable ADC interface */
    adc_enable();
    /* ADC calibration and reset calibration */
    adc_calibration_enable();
        /* ADC software trigger enable */
    //adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
       
}

//使用ADC通道4和10,应用函数如下:
.....          fun()
          {
                Sysinfo.vbat_detect_ctr = 0;
                adc_software_trigger_enable(ADC_REGULAR_CHANNEL); //第1次测量USB 5V
                while(adc_flag_get(ADC_FLAG_EOC)==RESET) ;
                tmp = adc_regular_data_read();       
                Sysinfo.vusb_value = 6.6;
                Sysinfo.vusb_value *= tmp;
                Sysinfo.vusb_value /= 4096;
                adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
                while(adc_flag_get(ADC_FLAG_EOC)==RESET) ;
                adc_flag_clear(ADC_FLAG_STRC);
                tmp = adc_regular_data_read();
                Sysinfo.vbat_value  = 17.886;
                Sysinfo.vbat_value *= tmp;
                Sysinfo.vbat_value /= 4096;
       }
规则通道 第1个通道CH_10的数据可以正确采集到,但是第2个通道CH4的数据无法采集正确。官网的例子找不到相关信息,难道一定要弄DMA输出? 各位帅哥多多指教啊。
来自 2楼
lvben5d|  楼主 | 2018-5-3 17:55 | 只看该作者
本帖最后由 lvben5d 于 2018-5-3 22:27 编辑
CharryW 发表于 2018-5-2 11:24
规则组扫描转换模式的软件流程(禁用连续转换):
1. 设置ADC_CTL0 寄存器的SM 位和ADC_CTL1 寄存器的DMA  ...

非常感谢CharryW提点,我使用插入组,非DMA,在扫描模式下,进行2个通道的数据采集,可以分别从IDATA0 IDATA1获得要的数据。我是被这个说明 误导了! https://blog.csdn.net/wuhenyouyuyouyu/article/details/70940384     悲剧,以为单次转换模式,在设定规则组后,MCU会根据用户触发  依次采样规则组里数据,实际不会! 大家看这个网页 有关单次转换模式的描述! 描述单次模式的时候,说会依次走组里面的下一个,实际不行。必须设置扫描模式,才会依次走下去!!

使用特权

评论回复
板凳
123ycli| | 2018-4-26 18:53 | 只看该作者
奇怪,不应该呀?仔细检查配置,对比寄存器说明看看

使用特权

评论回复
地板
lvben5d|  楼主 | 2018-4-28 07:07 | 只看该作者
123ycli 发表于 2018-4-26 18:53
奇怪,不应该呀?仔细检查配置,对比寄存器说明看看

硬件仿真的时候,寄存器每个位都看了(现在搞的都了解详细位了 呵呵),后面按照FAE说明,使用了 连续模式, 规则组一共2个通道,第2个通道采样的数值就是跟随第1个通道数值。 连续模式使用了,发现第1个通道的数值也不对了! 天。  PC0 AIN10     PA4 AIN4

使用特权

评论回复
5
vivilzb1985| | 2018-4-28 22:54 | 只看该作者
这是什么问题的?我再好好看下的

使用特权

评论回复
6
lvben5d|  楼主 | 2018-4-30 21:43 | 只看该作者
vivilzb1985 发表于 2018-4-28 22:54
这是什么问题的?我再好好看下的

GD32F130R8T6  ADC使用了2个通道 AIN4和AIN10  通道10采样的电压(电阻分压过) ,是对的。 AIN4 PA4引脚(电阻分压),测量不出数值。 目前看,还是对官网的ADC不熟悉,仔细看了几天,配置了规则组单次模式 和 连续模式, 都不行。 已经按照GD32F1X0.V3.1手册里去配置了!

使用特权

评论回复
7
CharryW| | 2018-5-2 11:20 | 只看该作者
因为规则通道转换的值储存在一个仅有的数据寄存器中,所以当转换多个规则通道时需要使用
DMA。
只有一个规则组数据寄存器,非DMA方式读取多通道的话读取出来的值不是固定顺序通道的,注入组的话数据寄存器是分开的。
并且楼主你的代码没有配置为扫描模式(adc_special_function_config)。
当然你也可以通过其他办法来读取,每次转换前重新配置通道。

使用特权

评论回复
8
CharryW| | 2018-5-2 11:24 | 只看该作者
规则组扫描转换模式的软件流程(禁用连续转换):
1. 设置ADC_CTL0 寄存器的SM 位和ADC_CTL1 寄存器的DMA 位为1
2. 配置ADC_RSQx 和ADC_SAMPTx 寄存器
3. 如果有需要,配置ADC_CTL1 寄存器中的ETERC 和ETSRC 位
4. 准备DMA 模块,用于传输ADC_RDATA 寄存器的数据
5. 设置SWRCST 位,或者给规则组产生一个外部触发
6. 等待EOC 标志位置1
7. 写0 清除EOC 标志位

用户手册里都有相应说明的

使用特权

评论回复
9
123ycli| | 2018-5-19 09:50 | 只看该作者
CharryW 发表于 2018-5-2 11:24
规则组扫描转换模式的软件流程(禁用连续转换):
1. 设置ADC_CTL0 寄存器的SM 位和ADC_CTL1 寄存器的DMA  ...

赞一个,讲解的很详细。

使用特权

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

本版积分规则

95

主题

746

帖子

12

粉丝