我想用stm32的单片机采样电压,然后每周波采样128个点,如何设置呢
我是用了dma传输,DMA内存空间是1000,那我adc采样1000个点之后,第1000个点以后的数据会不会依旧是存进DMA的内存空间,将最开始的点挤掉,我是想将每个adc的采样点都上传到PC端,该怎么做呢?或者不上传到PC端,将每个采样点都要经过我写的一些算法,我就怕前1000个点还没计算完成, 然后后面的采样点又挤进来了,这样数据就不连贯了
连贯是相对,首先你要确认采样频率,就是每秒采多少次。如果按你说的每个周波采128个点,问题是如何确认周期的开始,假设是正弦波,即确认过零点。若有硬件电路支持采集过零点,采样时间T就是周期除以128,从过零点开始,每隔T时间采一个点。问题在于,采完一个周期之后,接着下一个周期就过来了,这时候要求处理器器能够将前面128个点处理掉,或缓冲到其他内存位置。dma直接采样,达到结束时,应该不会从头在来一遍,DMA没有这功能吧?我反正没用过。
使用STM可以这样搞:同一个timer作为采样间隔处理,设置到ADC通道上,当检测到过零点的时候,启动timer,这时候每隔T时间采一个点,采到的数据直接通过DMA存到缓冲区,缓冲区设置为128个采样点,采到128个时产生DMA中断,进入中断更换下一个缓冲区,退出之后处理刚才采样的数据。这样需要多个缓冲区,再将缓冲区按链表或队列的方式处理,形成循环。则处理数据的时间就跟缓冲区队列有关了,要计算好STM32处理能力和缓冲区溢出的关系。这样都是硬件采样,周期稳定,代码干预少,释放CPU资源。
还有一种思路,混沌处理,适合频率不高的采样,先按规格,例如50Hz信号采样,正负20%频率偏差,信号可能40~60Hz内波动,则设定timer的采样周期为至少大于2倍被采信号频率(香浓定理),保证无论如何都能猜到两个周期的数据,采完产生DMA中断,然后把所有数据摊开,搜索出其中一个完整的波形然后计算同时开始下一次采样,适合没有过零检测电路的系统。
这个很简单的,配置一些寄存器就好,看看rm手册的adc寄存器那块
能稍微详细的讲解一下吗?
就是你看看Datasheet的寄存器说明那部分,会有介绍怎样配置的