这是一个比较实用的例子,完全可以用在实际的应用当中。
数据采集是一个比较耗时间的过程,不仅因为数据量大,而且有些应用对采样周期要求比较严格,即采样频率的要求,根据香农原理,理论上采样频率至少要高于被采样信号频率的2倍。这就要求数据采集最好是单独建立一个任务来管理。
控制采样周期的办法通常有这么几个:
1. 使用延时函数。适用于采样频率比较低的场合
2. 使用定时器中断。当采样周期与系统节拍差不多的时候,采用延时的方法就不太精确了(抖动太厉害),影响采样的准确性。这时候可用定时器产生一个精确的定时来控制采样周期
3. 使用节拍钩子函数进行采样。采样周期与系统节拍相同,但要求采样程序尽可能简洁,而且不能使用中断等使自己挂起来的函数(可以想象那样子的话,系统脉搏都停了,系统还不死啊)
今天的这个例子EX3,我们采用第一种方法,并且采用了一个信号量。
首先创建两个任务:
任务A: 进行数据处理(求平均值)和显示
任务B: 以一定间隔读取ADC0832通道0数据
任务A首先建立一个信号量,这个信号量是给任务B(采集任务)用来通知任务A(数据处理任务)的。
任务B完成一次采集,就置信号量告知采样完成,任务A等到信号量以后就进行平均值计算(每十个采样值计算一次),并把每次的采样值和平均值显示出来。
在OS_cfg.h 文件中要设置#define EN_OS_SEM 为 1 ,以允许系统使用信号量
注意:EX3不包含SmallRTOS系统部分,没有下载过的可见另外一篇文章:http://blog.ednchina.com/crossmind/96609/message.aspx
下载以后解压缩到目录EX3,并把EX3要放在与EX1,EX2所在的同一个目录中。
这是运行起来的截屏
另外圣剑画的那张图(http://group.ednchina.com/306/2287.aspx)有一个错误,ADC0832 CH0错接了一个电流表,短路了,应该是电压表。
用户405252 2012-3-1 17:23
liujun6037_345432000 2008-12-10 09:41
zwj-gg_818035047 2008-12-9 22:40