用ADuC7026读取遥控信号(原创)
0赞某些特定情况下,我们需要知道遥控器(航模)发出信号的高电平时间或占空比,在这里我提供两种方法。遥控信号图

如图中所示,遥控指令信号是占空比可变的矩形波,如图1-1。单位周期内高电平时间决定了指令强度,因而我们最关心的其实就是一个周期内的高电平时间。对于周期不变的遥控指令信号,若是获知了其占空比,高电平时间自然就知道了,所以有两种方法来得到遥控指令,下面将分别介绍这两种策略。
定时器中断周期10us,将遥控接收器的信号输出与主机(ADuC7026)IO端口P2.1相连,通过不断检测P2.1的电平状态来完成指令的接收。
void RemoteControl ( )
{
if ((GP2DAT&0x02) == 0x02)
{
Channel_A ++;
}
else
{
if(Channel_A != 0)
{
Control_A = Channel_A;
}
Channel_A = 0;
}
return;
}
遥控指令接收程序流程如图所示。

遥控指令接收程序流程
每次定时器中断产时,这段程序都会运行一次,目的就是检测P2.1是否为高电平,若是,则计数变量Channel_A加1,否则将Channel_A的值赋给Control_A。
Control_A是一个整型数据,用Control_A乘以定时器中断周期10us就是高电平时间了,这种方法有一个缺陷:第一个Control_A的值很可能是不准的,但是第二次以至于以后的值就很准确了。
第二种方法要更容易理解,每次定时器中断时都读取P2,1状态,若为高电平则H加1,低电平则L加1,这个过程进行20次(即到达遥控信号周期20ms)时求H/(H+L)的值,这样得到的是信号的占空比,次后H和L的值归零,并再次进行上面的过程。由于遥控信号周期已知(20ms),由占空比乘以周期就可以得到信号的高电平时间,图为此方法的示意图。

遥控指令采集
与第一种方法相比较,方法二得到的高电平时间是浮点型数据,方法一得到的是整型数据,我们知道电机的控制量实际上都是整型数据,所以第一种方法要更合适一些。
另外在实验过程中我发现读取IO端口状态这一过程是非常耗费CPU时间的,特别在中断中应尽量减少这种操作,否则出错的几率会很大,很有可能在中断时间内完不成要求的工作,这样就导致程序不能发挥正常作用。
