欢迎光临散文网 会员登陆 & 注册

GD32/STM32 ADC模块(一)使用心得

2022-11-11 22:57 作者:云汉含星  | 我要投稿

芯片GD32F407VET(GD32的人说完全兼容STM32)

注意事项:

1. 采样值不能为负电压多个ADC同时采样时。会因为这一个负电压,导致和他同时采集的其他数据也全部异常。
    例如:ADC0和ADC1同步采样,都采样3个数据。若规则ADC1规则通道2的实际电压为负电压。则由于ADC0和ADC1同时采样,ADC0和ADC1的规则通道2数据都是错误的,但是通道1,3都是正确的数据。因为我采了一个负1.5V电压。具体多少V会出错我也不知道。如果多通道采样时,发现只要和某一个信号一起采集,结果就异常,那么就可以查看一下信号源是否是个负电压。

2.ADC的DMA配置问题

    配置同步模式后,配置了同步的ADC的数据会存储在ADC的公用寄存器0x308中。独立工作的ADC采集的数据放在自己的数据寄存器0x4C中。(ADC的基址为0x40012000。ADC0的Offset为0x000,ADC1的Offset为0x100,ADC2的Offset为0x200)

      还需要注意DMA的模式配置,如果配置的模式不对,也不会按照预期的进行采样。

        这里面最常用的时DMA模式1。也就是一次性传输32bit数据。常规的是ADC0和ADC1双通道采样,ADC2独立工作。在网上也能找到很多相关的资料。

3. ADC采样总时间估算

    比如说ADC工作在21M,采样时间选择3个周期。那么总的转换时间就是15个周期。
    采样总时间 = (3+12) /21 =  0.7142us

4.为什么需要配置DMA来获取ADC值?

        原因我认为有两个。

        一是因为采样数量:ADC采集数据走注入通道的话。每个ADC只有四个注入通道,可以扫描采集四个数据,理想情况下3个ADC可以采集12个数据。但是规则通道可以配置八个ADC通道,配上DMA总共可以采集24个数据。而且注入通道可以和规则通道同时配置。我之前就尝试过走注入通道对三相电压采样,同时可以采集三路数据。而规则通道则是双ADC同步模式并且配置了DMA。

    二是效率:规则模式的ADC只有一个数据寄存器。没有配置同步采样数据就在0x4C,配置了同步采样数据就在0x308。不配置DMA我们就必要一个一个的采集转换。而配置了DMA就可以开启ADC的扫描模式。一次触发,就依次采样转换所有配置的ADC通道,并且由DMA搬运到内存中。

开发中的总结

    配置越简单越好。原因有两个:一是因为复杂了之后可能没有办法保证ADC能够稳定的工作,这个我深有体会,双通道规则同步+三通道注入的模式,稳定运行了两周后,忽然发现ADC有可能采集不到数据。二是如果后期为了降低成本,选择了低一档的芯片替代,可能不支持一些高级的特性。

遗留的一些问题:

三重规则并行模式下,每一次转换时序都不一致。虽然总是保证了ADC0->ADC1->ADC2->ADC0->ADC1->ADC2的采样顺序。但是触发的首个采样点顺序也是ADC0->ADC1->ADC2。但是现在因为首次采样点也在变化,导致取出的数据位置也一致在变化。如下例子所示:
第一次采样:ADC0CH1 ->ADC1CH1->ADC2CH1->ADC0CH2->ADC1CH2->ADC2CH2。
第二次采样:ADC1CH1 ->ADC2CH1->ADC0CH1->ADC1CH2->ADC2CH2->ADC0CH2。
第三次采样:ADC2CH1 ->ADC0CH1->ADC1CH1->ADC2CH2->ADC0CH2->ADC1CH2。

    按照找理解文档的预期效果来说,应该每轮采集的DMA取出的数据应该保持一致才对。这一点到底正确与否,需要和GD的人沟通之后才能知道结果。

目前状态

        现在配置的模式是ADC0和ADC1工作再规则同步模式下,配置DMA通道从0x308取值,ADC2独立工作,配置DMA从ADC3的数据寄存器0x4C取值(ADC2的基址为0x200)。到写文为为止,已经连续工作三天没有出现任何采样问题(硬件给了两路参考电压,所以可以用这个来纠偏,同时可以判定是否采样出错)。

下一期将会附上ADC的配置方法。

最后附两张图STM32F4xx的寄存器映射图,理解这个基址。



GD32/STM32 ADC模块(一)使用心得的评论 (共 条)

分享到微博请遵守国家法律