5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
楼主: c_nmusic
打印 上一主题 下一主题

共轴双桨自动驾驶直升机

[复制链接]
661
 楼主| 发表于 2009-2-7 10:05 | 只看该作者

回复 662楼 的帖子

谢谢你的提醒:em05:

我仔细看了一下我用的模块的芯片手册,上面支持DGPS,默认打开的。
但我这里周围没有DGPS的基站,所以没有DGPS信号可供使用。
比较郁闷啊。

欢迎继续阅读楼主其他信息

662
 楼主| 发表于 2009-2-10 11:57 | 只看该作者
最近买了MPX4115A气压传感器和16位I2CAD,看看能不能发挥出这个气压传感器的最佳效果,用这个来帮助我确定飞机的高度。
¥150块一个呢,真够贵的。

刚才拆飞机,居然发现一个陀螺仪的盖子给撞掉了,就是被边上的螺冒给撞下来了。
居然还能飞,真是神奇。



这已经是第二个因为安装问题弄坏的陀螺仪了。:em17:
663
 楼主| 发表于 2009-2-10 15:34 | 只看该作者
刚才在研究 气压传感器的AN http://www.freescale.com/files/sensors/doc/app_note/AN1646.pdf 的时候,以外地发现了滤掉低频杂波的很好的软件的方法。那就是移动平均。

在我的飞机上实际测试了一下,对加速度计的数据做了一个64次的移动平均后效果超级好。马达的震动无法继续影响加速度计了。幸亏用的芯片内存大,对加速度计每个轴都要保留64个原始数据还真消耗不少内存呢。:em15:



这个是Excel计算的移动平均结果,蓝色的线是原始的数据,黑色的是移动平均后的结果。

[ 本帖最后由 c_nmusic 于 2009-2-10 15:49 编辑 ]
头像被屏蔽
664
发表于 2009-2-11 18:31 | 只看该作者
感谢分享.
665
发表于 2009-2-14 23:19 | 只看该作者
再顶
接着顶
666
发表于 2009-2-15 03:55 | 只看该作者
超级菜鸟顶一下 看看最终能发展成个什么样子
667
发表于 2009-2-15 07:32 | 只看该作者
:em04: 不懂
668
 楼主| 发表于 2009-2-17 19:43 | 只看该作者
为了减小接收机的干扰,同时又不想把接收天线竖起来好像桅杆那样,最近入手FUTABA T6EX。
2.4G的频率不需要很长的天线就可以了。

今天完成接收机的调试工作,这个控还真复杂呢。不过好在各个通道的PPM输出格式没有变化,我代码不需要改动就可以了。

前几天完成了新的电源板和气压传感器一个AVR Mega系列的任务小板的布线工作。现在可以接12个I2C设备,同时已经集成了包括GPS数据解析,温度传感器,光敏电阻驱动的照明电路,I2C的EEPROM,和一个实时时钟。下面能玩得东西就更多了。:em15:
669
 楼主| 发表于 2009-2-18 21:34 | 只看该作者
今天下雪,试飞好困难,于是继续调整代码。

写了一个通过I2C总线更新AVRM8的BootLoader。为了避免刷新错误导致无法启动,现在的逻辑是程序上来就启动到BootLoader段,然后通过I2C总线得到命令再去执行用户代码。

研究了一天AVR-GCC的内联,静态函数声明,终于可以将Bootloader的主程序准确地放到BootLoader段的起始地址上了。刚才已经测试过了,可以通过ARM7将SD卡上的bin文件直接烧录进去。非常方便了。:em15:
670
 楼主| 发表于 2009-2-25 09:43 | 只看该作者
气压传感器基本调试通过,ADS1100还是很好用的,差分输入可以将分辨率提高。
而且还内置放大功能,最大可以将输入信号放大8倍。可惜我当初设计电路时没有注意到这个气压传感器输出1个大气压时电压就已经4.19V了,结果只好飞线。
如果仔细调整,用一个基准电压源,效果还能更好。



现在的识别精度已经可以达到分米级别了。:em15: I2C的接口,用起来非常方便。
671
发表于 2009-2-25 11:02 | 只看该作者
有GPS、3轴陀螺、3轴加速度传感器完全可以确定飞机姿态。。。不一定要用气压传感器的,何况这个不一定准确。。。
672
 楼主| 发表于 2009-2-25 12:57 | 只看该作者
高度保持要如何实现呢?GPS的高度根本不能用,差太多了。:em05:
673
发表于 2009-2-25 18:53 | 只看该作者
用上当然好,就是不一定必要。
关键是飞机姿态控制比较难搞。。。要能根据加速度传感器和角速度传感器测出飞机的状态,而且要能动态调整。。。。飞机姿态测量效果好的话,本身就能知道机头飞行的方向、左右倾角、前后俯仰角度了。
674
 楼主| 发表于 2009-2-25 19:33 | 只看该作者

回复 675楼 的帖子

是的哦,很难弄准哦。现在的马达震动加上用的这些便宜器件,要想拿来做惯性导航肯定会偏到姥姥家去了。用好的器件成本又太高了,所以只好采用这种互补的方式来实现。:em15:
675
发表于 2009-2-25 22:07 | 只看该作者
当然要和GPS配合使用。。。不是全惯性的。全惯性的当然不行。加速度传感器和角速度传感器只是测量飞机的姿态控制。GPS修正航向。
676
 楼主| 发表于 2009-2-26 12:04 | 只看该作者
Atmel 的AVR M8 的I2C/TWI BootLoader终于稳定了,真的还有不少问题呢。下面总结一下,希望对后来人有帮助。

我的目的是,将整个BootLoader都放到M8自带的BootLoader段内,然后加电时从BootLoader启动,再由程序通过I2C总线上传新固件或者引导BootLoader启动程序。

看起来并不复杂,将整个BootLoader的代码都编译进BootLoader段也很容易。通过在调用的函数前加上BOOTLOADER_SECTION,这个是在<avr/boot.h>里定义的一个宏。告诉编译器这个函数要放到bootloader段里。最后的实际编译效果可以查看那个.map文件。

这里有一点比较麻烦,就是必须将主函数放到最前面,否则加电后可能先执行某个子程序去了。通过将所有调用的函数前加上static就可以做到这点。

以上步骤都相对容易,设置bootloader的段地址也可以在网上找到相关资料。但下面就郁闷了。

经过这样的过程,Bootloader可以被引导,但有的时候不正常。我在测试中加了一个灯的闪烁代码,结果发现有时候灯闪烁的速度很慢。当时不知道原因,以为编译器的问题、内置晶振的不稳定问题、加电电压不稳损坏了代码、芯片损坏等等原因。足足查了4天啊,真是痛苦。3个芯片,同样的代码,有一个怎么都好使,另外2个时好时坏。

最后,在网上找到老外的一个BootLoader,也是I2C的,终于发现问题所在。

原来设置成从BootLoader区引导后,必须在进入C的main前设置好堆栈。以前这部编译器帮我完成了,所以我从没注意。但这回就需要自己来写了。于是一段比较简单的汇编代码后,终于我的BootLoader可以正常执行了。

vectors.S 文件内容:

#include <avr/io.h>

#if __AVR_MEGA__
  #define XJMP jmp
  #define XCALL call
#else
  #define XJMP rjmp
  #define XCALL rcall
#endif

        .section .boot_vectors,"ax",@progbits
        XJMP    start
                                                
        .word   0               // pad (vector 7)
        .word   0               // pad (vector 8)
               
                // 中断向量表,我们没有调用中断,所以都是空。
                // 保留这个向量表的意识是,一旦我们需要调用中断了
                // 可以加在下面。
        //vector  __vector_9      // OverFlow0
                .word   0
        //vector  __vector_10
                .word   0
        //vector  __vector_11     // OverFlow0
                .word   0
        //vector  __vector_12
                .word   0
        //vector  __vector_13
                .word   0
        //vector  __vector_14
                .word   0
        //vector  __vector_15
                .word   0
        //vector  __vector_16     // OverFlow0
                .word   0
        //vector  __vector_17     // TWI
                .word   0
        //vector  __vector_18
                .word   0
        //vector  __vector_19     // TWI
                .word   0
        //vector  __vector_20
                .word   0
        //vector  __vector_21
                .word   0
        //vector  __vector_22
                .word   0
        //vector  __vector_23
                .word   0
        //vector  __vector_24     // TWI
                .word   0
        //vector  __vector_25
                .word   0
        //vector  __vector_26
                .word   0
        //vector  __vector_27
                .word   0
        //vector  __vector_28
                .word   0
        //vector  __vector_29
                .word   0
        //vector  __vector_30
                .word   0
        //vector  __vector_31
                .word   0
        //vector  __vector_32
                .word   0
        //vector  __vector_33     // TWI
                .word   0

        // We don't need any vectors higher than 33, so don't waste the flash


#define __zero_reg__    r1
               
                // 全局的__stack变量
        .global __stack
        .set    __stack, RAMEND


start:
                // 设置堆栈,这个非常重要!
                // 必须在进入C程序前设置好
        clr     __zero_reg__
        out     _SFR_IO_ADDR(SREG), __zero_reg__
        ldi     r28,lo8(__stack)
        ldi     r29,hi8(__stack)
        out     _SFR_IO_ADDR(SPH), r29
        out     _SFR_IO_ADDR(SPL), r28

        ldi     r24,lo8(0)
        ldi     r25,hi8(0)
                       
        XJMP    main

修改了老外的引导代码,简化了一些。这个是针对M8芯片的。

由于换文件后如果有同名的section,编译器会在后面自动加一个.1。所以这里用了2个section。
.bootloader  0xc25,这个是给C的程序用的。偏移了0x25个字节,因为那个汇编编译后生成了这么多的代码。
.boot_vectors 0xc00,这个是给这个汇编用的。
需要在Project Options的Memory Settings里设置好。

[ 本帖最后由 c_nmusic 于 2009-2-26 18:39 编辑 ]
677
发表于 2009-3-1 11:10 | 只看该作者
贵在坚持。。。挺LZ的精神
678
 楼主| 发表于 2009-3-2 19:42 | 只看该作者
上一张最新的图片。





最近在研究加速度计的数据融合问题,有点效果,但还有不少问题。
679
发表于 2009-3-2 23:20 | 只看该作者
顶。。。加油!
680
 楼主| 发表于 2009-3-3 11:27 | 只看该作者
看起来还是要用香蕉插啊。

JST插和3P对空插头看起来并不大可靠,尤其是长时间振动后,开始有些接触不良了。
表现为马达起转困难,类似电流不足的现象。

今天买了一个5000mAh的大电池,真够大的,看起来我的四轴都装不下呢。
差不多有400g重了。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

快速回复 返回顶部 返回列表