代码之家  ›  专栏  ›  技术社区  ›  Guillaume Petitjean

试着理解STM32L4的ADC

  •  3
  • Guillaume Petitjean  · 技术社区  · 7 年前

    我很难理解STM32 ADC的工作原理。 我想做一些简单的事情,比如在2 GPIO上定期采样和转换(@250Hz)。 目前,我是以“虚拟”的方式完成的:在基本单模式下设置ADC,然后在250Hz下启动一个计时器,在每个计时器中断时启动ADC,以便在每个通道上仅转换一个采样。但我认为这不是正确的方法,我担心样本之间的时间安排缺乏准确性。 您能否解释一下,我应该如何配置ADC,以便在给定的采样数期间以给定的频率连续采样/转换?我在网上没有找到太多有用的资源,参考手册也很复杂。 非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   followed Monica to Codidact    7 年前

    常规或注入转换序列

    每个ADC可以处理两个要转换的通道列表,一个具有16个通道的常规序列( SQR1 - SQR4 ),以及一个具有4个通道的注入序列( JSQR )。

    主要区别之一是,常规转换将所有结果存储在一个共享数据寄存器中( DR ),必须在下一个转换步骤完成之前读取并存储。当规则序列中有多个通道时,最好使用DMA存储转换结果。因为你想要一些简单的东西,我现在不想进入DMA。

    注入的转换序列将每个结果存储在自己的寄存器中( JDR1 - JDR4 JDR[4] ),然后软件可以在序列完成后读取结果,可以通过轮询 JEOS 中的位 ISR 寄存器,或通过使用 JEOSIE 钻头插入 IER

    常规序列完成后,可以自动启动注入序列( JAUTO 钻头插入 CFGR ),这样就可以在每个ADC单元上一行启动5次转换,并在最后将结果放入不同的寄存器中。

    定期开始转换

    您可以设置计时器直接启动ADC转换序列,而不是每次通过软件启动转换。

    首先,请参阅标题为 外部触发器和触发器极性转换(EXTSEL、EXTEN、JEXTSEL、JEXTEN) 在参考手册中。有常规序列和注入序列的可能触发事件列表。从表中选择TRGO事件,设置 EXTSEL EXTEN JEXTSEL JEXTEN 照着

    您可能希望启用序列结束中断( EOSIE 杰西 在里面 IER公司 )现在,在序列完成时通知软件。

    通过设置配置ADC ADEN ADSTART JADSTART 在里面 CR1 ,转换将在计时器的触发器到达后开始。

    将从上表中选择的计时器编程为所需频率,并设置 MMS 位输入 CR2 010 (更新)。计时器的每次溢出(更新)将生成一个触发事件,启动下一个ADC转换序列。无需启用计时器中断。

    使用更多ADC单元

    如果控制器中有多个ADC单元,可以使用每个单元上的相同触发器同时启动它们。通过这种方式,您可以同时进行2到3次转换,或者启动多达15次转换并立即获得结果,而无需使用DMA。

    推荐文章