我很难理解STM32 ADC的工作原理。 我想做一些简单的事情,即。在2个GPIO上定期(@ 250Hz)进行采样和转换。 现在我在一个"虚拟"方式:在基本单模式下设置ADC,然后启动定时器@ 250Hz并在每个定时器中断启动ADC,以便在每个通道上仅转换一个样本。但我不认为这是正确的做法,我担心样本之间的时间安排缺乏精确性。 您能否解释一下如何配置ADC在给定数量的样本期间以给定频率连续采样/转换?我在网上找不到很多有用的资源,参考手册非常复杂。 谢谢
答案 0 :(得分:1)
常规或注入转化序列
每个ADC可以处理两个要转换的通道列表,一个包含16个通道的常规序列(RNGgen
- SQR1
),以及一个包含4个通道(SQR4
)的注入序列。 / p>
主要区别之一是常规转换将所有结果存储在单个共享数据寄存器(JSQR
)中,必须在下一个转换步骤完成之前读取并存储。当常规序列中有多个通道时,最好使用DMA来存储转换结果。因为你想要一些简单的东西,我现在不会进入DMA。
注入的转换序列将每个结果存储在自己的寄存器(DR
- JDR1
或JDR4
)中,然后软件可以在序列完成后读取结果,可以检测到通过轮询JDR[4]
寄存器中的JEOS
位,或通过ISR
中的JEOSIE
位启用中断。
当常规序列结束时(IER
中JAUTO
位),可以自动启动注入序列,这样就可以在每个ADC单元上连续启动5次转换,并且最后将结果放在不同的寄存器中。
定期开始转换
您可以设置定时器直接启动ADC转换序列,而不是每次都通过软件启动转换。
首先,请参阅参考手册中标题为外部触发转换和触发极性(EXTSEL,EXTEN,JEXTSEL,JEXTEN)的章节。有常规和注入序列的可能触发事件列表。从表中选择一个TRGO事件,相应地设置CFGR
和EXTSEL
,或EXTEN
和JEXTSEL
。
您可能希望立即在JEXTEN
中启用序列结束中断(EOSIE
或JEOSIE
),以便在序列完成时通知软件。
通过在IER
中设置ADEN
和ADSTART
或JADSTART
来设置ADC,一旦定时器的触发器到达,转换就会开始。
将您从上表中选择的计时器编程为所需频率,并将CR1
中的MMS
位设置为CR2
(更新)。定时器的每次溢出(更新)都将产生一个触发事件,从而开始下一个ADC转换序列。没有必要启用定时器中断。
使用更多ADC单元
如果控制器中有多个ADC单元,则可以在每个单元上使用相同的触发器同时启动它们。这样,您可以在同一时间进行2次或3次转换,或者最多启动15次转换,并在不使用DMA的情况下立即获得结果。