我们知道,读取到的AD值都是瞬时的,变革可能会比较大,那么我们就须要进行处理,也便是常用的滤波去毛刺——常日的做法都是去掉最大、最小,再取均匀。我们利用定时器中断取值,每次中断取1个数据。第一次取20个数据,利用冒泡法从小到大排序,去掉前5个、后5个,中间10个取均匀,这样打算得到1个值;第二次,我们取上一次排序前的后15个数据,再重新取5个,然后按照第一次的方法进行取值;以此类推,统共得到200个值,一次性发送给上位机。采取这种方法,以下两点须要把稳:
1、采样的连续性。利用定时器中断取采样值,那么这个中断就不应该停滞,也便是说,在发送给上位机的时候,定时器中断也是在进行取值的。小秋之前写程序的时候,就忽略了这个问题,然后涌现的结果是:采样数据画出来的曲线有阶梯性,不是连续的。
2、在发送给上位机之前该当先缓存要发送的数据,由于在发送过程中定时器中断还是在进行取值的,为避免滋扰,这个缓存必须要有。

下面进入程序部分,平台是STM32F103,采样芯片是AD7928,这个芯片配置在小秋的上一篇文章《SPI通信实例——一款实际事情中用到的芯片AD7928》已经先容过了,有兴趣的朋友可以去看看。
主函数中,设定定时器3的中断韶光为200us,即每200us取一次采样值。第一次我们共取25个数据,滤波去毛刺得到一个值,第二次重新取5个,加上第1次的后15个,再得到一个值......这样算下来的结果是,每5个定时器中断得到一个值,即1ms一个值,200个值刚好200ms。取完200个值之后,在主函数中的while(1)循环中发送。
定时器3初始化设置
冒泡法从小到大排序,去掉首尾各5个,取均匀值
发送函数,在主函数的while(1)循环中发送
这篇文章的重点是:定时器3中断函数中的数据处理,发送函数中的数据缓存。