昨天小秋发表了一篇文章,《SPI通信实例——一款实际工作中用到的芯片AD7928》,那么读取到这个AD值之后,我们该如何进行处理再发送给上位机呢?今天,我们要介绍的功能是:STM32读取到VIN0的AD值,然后进行滤波、去毛刺处理,每隔200ms左右发送200个数据给上位机。
我们知道,读取到的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中断函数中的数据处理,发送函数中的数据缓存。