固定翼飞机竖直飞行控制系统的设计
时间:06-30
来源:中电网
点击:
读取的方法如下,由TPM捕捉到脉冲的上升沿进入模定时器捕捉中断程序后,先看是不是脉冲串里的第一个,若是就把定时器清零,然后把捕捉值存入数组,这样9次后,数组里就由低到高地存下了每个脉冲发生的时间,用减法一算,各脉冲宽度就出来了。为防止出错,附加了脉冲数错误预防,就是对脉冲个数进行计数,如果在一个脉冲串里读到了多于9个脉冲就意味着有干扰了,需要尽快把所有脉宽按中间值1.5ms处理。这样虽然和遥控器发出的指令不一样,但减少了出大问题的机会。
·8ms定时中断:系统有一个模定时器18ms中断程序,因为正常的脉冲串9个脉冲不会超过18ms,所以可以让定时器在第一个脉冲开始时计数,计到18ms就认为一个脉冲串结束,把脉冲数计数器清零。模定时器捕捉中断程序里看到这个计数器被清零了就知道下一个脉冲串开始了。这个中断还为PID的定时运算提供时间标志,每进入一次中断就把标志置位,主程序读到标志被置位就进行PID运算,这样就保证了PID运算的周期是固定的。
·1.67ms中断程序和A/D中断程序:为了读取MMA7260QT输出的数据需要用A/D读值,这里每1.6667ms进入中断一次设定A/D通道,读完三个通道用时5ms,在两个脉冲串的标准间隔20ms内可以各读4次,用滑动平均值算法后可以滤除干扰。
主程序介绍
虽然传感器都是水平放置的,但因为温度电压等的不同,三个轴的输出和计算的输出是不一样的,会有少许偏差,为了解决这个问题,在上电后先对三个轴的值连续读64次后平均,把这个平均值作为飞机要稳定的目标值,这样飞机就基本稳定了。
提到稳定,PID功不可没,主程序里的PID有两处要提一下。一是因为传感器的稳定性问题和飞机的抖动,A/D输出值差2、3个数是很正常的,所以在主程序里要判断一下,如果误差值在3以内,则不进行PID运算,这样就减少了舵机无谓的抖动;二是因为飞机的前后左右重量不一致,所以在飞机前倾后仰左右摆动时要用不同的P值计算。
主程序每20ms更新一次数据,数据就是前后左右上下的控制脉冲的宽度。这个数据是把模定时器捕捉中断程序里捕捉到的数直接拿来用还是要拿PID运算的数据来用?这由一个脉宽(决定此时飞机是否要竖直飞行的脉宽)决定,这里用到的是第7个脉冲的脉宽,也就是遥控器的第7通道,这个参数被命名为Helen,当Helen > 1500(1.5ms)时就是操纵者要竖直飞行,要把PID运算的数据输出;当Helen < 1500时就是正常飞行,直接把模定时器捕捉中断程序里捕捉到的数输出就可以了。
要得到各个脉冲宽度,只要把从低到高的每个脉冲发生的时间做减法就可以了,这个减法运算也是在主程序里完成的。减法完成后还要对脉冲宽度进行出错处理,要检查一下,小于1ms的按1ms算,大于2ms的按2ms算,处理完了就可以调用发送中断发送给辅助MCU了。调用方式是把数组排列好,把发送数据计数器清零,打开发送中断允许位,这时发送缓冲区是空的,发送中断一允许,它就立刻进中断开始发送。
串口发送中断程序:程序进入本中断后首先把发送数据计数器指示的数送到发送缓冲区去发送,如发送完了就把发送中断允许位清零,以防止正在发送的数据发送完后再次进入中断;如没发送完就直接退出,等待下次中断。
辅助MCU程序流程图见图6。
·8ms定时中断:系统有一个模定时器18ms中断程序,因为正常的脉冲串9个脉冲不会超过18ms,所以可以让定时器在第一个脉冲开始时计数,计到18ms就认为一个脉冲串结束,把脉冲数计数器清零。模定时器捕捉中断程序里看到这个计数器被清零了就知道下一个脉冲串开始了。这个中断还为PID的定时运算提供时间标志,每进入一次中断就把标志置位,主程序读到标志被置位就进行PID运算,这样就保证了PID运算的周期是固定的。
·1.67ms中断程序和A/D中断程序:为了读取MMA7260QT输出的数据需要用A/D读值,这里每1.6667ms进入中断一次设定A/D通道,读完三个通道用时5ms,在两个脉冲串的标准间隔20ms内可以各读4次,用滑动平均值算法后可以滤除干扰。
主程序介绍
虽然传感器都是水平放置的,但因为温度电压等的不同,三个轴的输出和计算的输出是不一样的,会有少许偏差,为了解决这个问题,在上电后先对三个轴的值连续读64次后平均,把这个平均值作为飞机要稳定的目标值,这样飞机就基本稳定了。
提到稳定,PID功不可没,主程序里的PID有两处要提一下。一是因为传感器的稳定性问题和飞机的抖动,A/D输出值差2、3个数是很正常的,所以在主程序里要判断一下,如果误差值在3以内,则不进行PID运算,这样就减少了舵机无谓的抖动;二是因为飞机的前后左右重量不一致,所以在飞机前倾后仰左右摆动时要用不同的P值计算。
主程序每20ms更新一次数据,数据就是前后左右上下的控制脉冲的宽度。这个数据是把模定时器捕捉中断程序里捕捉到的数直接拿来用还是要拿PID运算的数据来用?这由一个脉宽(决定此时飞机是否要竖直飞行的脉宽)决定,这里用到的是第7个脉冲的脉宽,也就是遥控器的第7通道,这个参数被命名为Helen,当Helen > 1500(1.5ms)时就是操纵者要竖直飞行,要把PID运算的数据输出;当Helen < 1500时就是正常飞行,直接把模定时器捕捉中断程序里捕捉到的数输出就可以了。
要得到各个脉冲宽度,只要把从低到高的每个脉冲发生的时间做减法就可以了,这个减法运算也是在主程序里完成的。减法完成后还要对脉冲宽度进行出错处理,要检查一下,小于1ms的按1ms算,大于2ms的按2ms算,处理完了就可以调用发送中断发送给辅助MCU了。调用方式是把数组排列好,把发送数据计数器清零,打开发送中断允许位,这时发送缓冲区是空的,发送中断一允许,它就立刻进中断开始发送。
串口发送中断程序:程序进入本中断后首先把发送数据计数器指示的数送到发送缓冲区去发送,如发送完了就把发送中断允许位清零,以防止正在发送的数据发送完后再次进入中断;如没发送完就直接退出,等待下次中断。
辅助MCU程序流程图见图6。
串口接收中断:辅助MCU程序的关键在串口接收中断,接收到的数要存入指定的数组,这个容易实现,而把引导头找出来就不那么容易了,因为作为引导头的0xAA、0x55也有可能是数据,只有连起来的才是引导头,判断方法详见图6。
因为本MCU只有两个定时器,但需要控制三路脉冲,所以有两路脉冲用定时器的PWM功能实现,另外一路需要用软件模拟,本文选用的方法是用一个20ms的中断,进入中断后把I/O口置位,然后在主程序里循环判断定时器的值,当定时器的值大于要送的脉冲值时把I/O复位。
- NEC USB 3.0控制器年底大降价 加入价格战(06-26)
- 更快更灵的投影电容技术(PCT)感应控制器(04-27)
- 物联网市场发展迅速 可编程控制器前景广泛(05-26)
- 物联网带动中国本土传感器迅速增长(10-13)
- 罗姆“传感器战略”:全力完善软件解决方案(10-29)
- Littelfuse将于2014年德国推出新的电路保护功率控制和传感技术(10-12)