本帖最后由 nashui_sx 于 2019-7-6 20:41 编辑
0:stm32f103c8t6
1:#define AD_CHN 4 //要使用的ADC通道数
开启几个通道Adc_Init()里面的ADC_RegularChannelConfig函数只有多少个有效,比如例子是4,只有 1 2 3 4有效
2:#define AD_Count 50 //AD滤波采样次数 就是每个通道采集50次供平均来用
3:l例子里也有说明/*
因为规则通道转换的值储存在一个仅有的数据寄存器中,
所以当转换多个规则通道时需要使用DMA,为了避免丢失已经存储在ADC_DR寄存器中的数据。
只有在规则通道的一个通道转换结束时才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到用户指定的目的地址,
这样就保证了dma转换通道不混乱。
*/
4:这个例子的dma的优点是直接为每个通道开辟要滤波的通道缓存,使用的时候直接调用ADC_Filter就可以了,dma循环采集adc,任何时候都可以ADC_Filter,也就是使用adc之前ADC_Filter一次就可以了,所以关闭dma中断也可以
5:dma采集一个循环的时间(中断时间) 转换时间=[采样时间+ 12.5个周期(固定值)]/12m =(239.5+12.5)/12m=21us *50次=1.05ms *4通道 4.2ms
但是ADC_Filter在dma循环50次以后调用频率快到一个循环周期21us也可以,相当于每次都用之前的50次做平均,数据会有迟滞
6:更新定时器触发的dma
adc dma 为每个通道开辟好滤波空间.rar
(284.83 KB, 下载次数: 200)
2018-7-12 20:52 上传
点击文件名下载附件
adc dma tim为每个通道开辟好滤波空间.rar
(287.05 KB, 下载次数: 20)
2019-7-6 20:37 上传
点击文件名下载附件
不开启dma后面的就USART1_printf USART1_Send_Array 还有中断函数有用
一周热门 更多>