|
飞机上各舵面偏转的执行机构是舵机,舵机的接头通常是3根线的杜邦头。其中电源和地是向舵机提供转动的电流,而信号线是控制舵机朝哪边转动,转动多大。
舵机的控制信号通常为PWM信号,即脉宽控制信号。具体的定义为:信号线平时为低电平,每隔20ms提升为高电平并持续一段时间,再降低到低电平,而后周期性的每隔20ms再升高为高电平一次。持续高电平的时间即对舵机进行控制,一般持续时间为1.5ms时,舵机在中位不动,持续时间为2ms左右时舵机偏转到一边的最大行程,持续时间为1ms左右时舵机偏转到另一边的最大行程。高电平持续时间离1.5ms越大,舵机偏转量就越大。因此,我们通过输出不同宽度的脉宽信号,就可以控制舵机执行相应的动作。从遥控器的接收机出来的各个通道的信号线,我们通过对其信号脉宽的计数就可以知道遥控器的各个通道打了多大的杆量。
在CY2007开发套件里,脉宽信号的计数和产生都是由FPGA来实现的,通过Verilog HDL语言进行硬件描述,我们在ARM上运行的程序可以简单而直接的访问各通道对应的地址将各通道脉宽量获取,也可以简单的将要产生的脉宽数写入相应地址由FPGA产生脉宽信号去控制舵机。具体Verilog HDL语言的实现,请参考《CY2007开发板V1.0FPGA工程下zai使用手册》。
在ARM里的飞控程序,我们有这样的代码:
char * pmem_autohandle = (char *)0x30003000;
char * pmem_autohandlegaodu = (char *)0x30003001;
char * pmem_FANGXIANGh = (char *)0x30003002;
char * pmem_FANGXIANGl = (char *)0x30003003;
char * pmem_FUYIh = (char *)0x30003004;
char * pmem_FUYIl = (char *)0x30003005;
char * pmem_SHENGJIANGh = (char *)0x30003006;
char * pmem_SHENGJIANGl = (char *)0x30003007;
char * pmem_YOUMENh = (char *)0x30003008;
char * pmem_YOUMENl = (char *)0x30003009;
于是在每秒50HZ的中断处理程序里,我们可以通过简单的访问地址而获取到遥控器输出的脉宽信号。
fpgain1 = *pmem_autohandle;
fpgain2 = *pmem_autohandlegaodu;
fpgain3 = (*pmem_FANGXIANGh*256+*pmem_FANGXIANGl)/10;
fpgain4 = (*pmem_FUYIh*256+*pmem_FUYIl)/10;
fpgain5 = (*pmem_SHENGJIANGh*256+*pmem_SHENGJIANGl)/10;
fpgain6 = (*pmem_YOUMENh*256+*pmem_YOUMENl)/10;
fpgain7 = *pmem_FANGXIANGXS;
而对于我们计算好的控制量要输出到舵机,是这样实现的:
OUT_FXDUO = tOUT_FXDUO; //tOUT_FXDUO是计算的控制量
OUT_FYDUO = tOUT_FYDUO;
OUT_SJDUO = tOUT_SJDUO;
OUT_YMDUO = tOUT_YMDUO;
其中有这样的定义:
#define OUT_FXDUO *pmem_FANGXIANGl
#define OUT_FYDUO *pmem_FUYIl
#define OUT_SJDUO *pmem_SHENGJIANGl
#define OUT_YMDUO *pmem_YOUMENl
实际上,当遥控器信号频频遭遇干扰,或需要摇杆来控制飞机时,我们可以充分利用FPGA的优势来进行用数传电台来传输遥控信号。实现方式如下:
在地面站增加一个接收机和CY2007控制板,控制板上运行的程序是采集接收机输出的各通道信号,转换成串口信号按协议发送到数传电台,即将遥控器的信号数字化后通过数传电台的跳频链路上传。同时为了安全可靠,飞机上的安装仍然保留接收机,这样就有了两条上传遥控信号的链路,平时可以以数传电台为主,当数传电台发生意外时遥控器也能直接控,并且能无缝切换。具体代码请参见源代码中的AT91F_IRQ0_HANDLER(void)函数里对fpgain1~fpgain7的赋值,其值就是遥控器各通道的脉宽信号值。
而当飞机全部调整好以后,我们甚至可以完全丢开遥控器,完全消除遥控器被干扰的可能,根据传感器状态直接输出控制量到舵机。这在一些特殊行业的应用尤为重要。
|
欢迎继续阅读楼主其他信息
|