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

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

大家齐动手,跟我来做头部运动传感器。终于成功了,感谢Gale兄的辛苦!

[复制链接]
61
 楼主| 发表于 2008-5-15 21:12 | 只看该作者
原帖由 gale 于 2008-5-15 20:55 发表


我明白你的意思,直接输出驱动舵机的PWM信号,这个应该没有问题,我就打算先这么试验了。

另外,刚才编辑了楼上的帖子,关于PPM1.2V驱动不了TINY13中断的问题,重新画板时,记得放一个三极管反向哦



这个我记下了。

呵呵,理论和实际还是相差很远啊,纸上谈兵,有很多问题是想不到的,做过以后才知道。

前两天调332的充电板,比较器的指示电路死活调不出来,然后才发现原理图有错误,管脚接错了,继续调试,又发现,电路实现的方法根本就是错的,板子废掉一半。只有另一面的332控制电路可以用。

这次打板,时间赶得很急,没仔细设计,做了4种电路,废掉了两种,失败失败……

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

62
发表于 2008-5-15 21:55 | 只看该作者
原帖由 xunicheng 于 2008-5-15 21:12 发表



这个我记下了。

呵呵,理论和实际还是相差很远啊,纸上谈兵,有很多问题是想不到的,做过以后才知道。

前两天调332的充电板,比较器的指示电路死活调不出来,然后才发现原理图有错误,管脚接错了, ...


悲惨的消息:舵机信号是周期22ms的PWM信号,1ms脉冲代表-100% 2ms脉冲代表+100%,也就是说,2ms-1ms=1ms的时间需要分为200份(假如精度有1%的话),这就意味着要精确控制舵机,需要做到5us的精确PWM,以TINY13的能力,全速做还差不多,中间要穿插传感器分析,这个。。。:em17:
63
 楼主| 发表于 2008-5-15 22:09 | 只看该作者
原帖由 gale 于 2008-5-15 21:55 发表


悲惨的消息:舵机信号是周期22ms的PWM信号,1ms脉冲代表-100% 2ms脉冲代表+100%,也就是说,2ms-1ms=1ms的时间需要分为200份(假如精度有1%的话),这就意味着要精确控制舵机,需要做到5us的精确PWM,以TIN ...

是这样吗??:em22: :em22: :em22:
64
发表于 2008-5-15 22:35 | 只看该作者
你是问“舵机信号是这样吗?” 还是问“实现5us很困难吗?”
如果是前者,我只能说:是,示波器图见http://bbs.mx3g.com/thread-16917-1-1.html
为了保险,我刚才又用T9+蓝箭微接测量了一次,确实是这样,而且步进很细微,可以做到4us

如果是后者,我也只能说:确实很困难,1.2M主频的AVR CPU,为了方便计算,就当1M好了,差不多1us一个指令,也就是说,如果没有硬件的帮助,要实现5us步进的准确PWM,需要能够在5条指令中完成PWM的基本控制,这几乎要耗尽CPU的资源,其他什么事情也不能干了。如果用硬件PWM的话,又存在一个问题,那就是舵机的PWM只是在5% 10%这样极小的占空比之间变化,而AVR的硬件PWM是0%~100%,8位的PWM摊到5%的范围上只有很差的步进量。。。


另,这个传感器太灵敏了,我放在桌面上,轻微的桌面变形都会引发传感器的动作,几乎成为一个报警器了。我想正规的陀螺仪应该会使用两个传感器,一个高灵敏的用于轻微的运动,一个低灵敏的用于剧烈运动。
65
 楼主| 发表于 2008-5-15 22:41 | 只看该作者
不错,这个传感器的确太灵敏,商品的陀螺也是用一个传感器的,但是可以测量的角速度比较大,或者说比较迟钝。

舵机没必要一定要送20ms的脉冲,你试试送一个方波,它也能正常工作。
66
 楼主| 发表于 2008-5-15 22:47 | 只看该作者
还有,用定时器中断来做,会很省资源。

不过13只有1个定时器,头疼。

[ 本帖最后由 xunicheng 于 2008-5-15 22:52 编辑 ]
67
发表于 2008-5-15 22:59 | 只看该作者
原帖由 xunicheng 于 2008-5-15 22:47 发表
还有,用定时器中断来做,会很省资源。

不过13只有1个定时器,头疼。

我全部都是用中断完成的,不过CPU太慢,中断也不灵啊,举例来说,我简单试验了一下,用中断产生方波,效果很好,然后打开外部中断接收PPM信号,由于外部中断要处理PPM信号,CPU主频低执行的比较慢,所以一旦遥控器开机,PPM出现,定时器中断的方波就不成样子了。

这个传感器做简单的方向性判断还是不错的,要定量分析就很痛苦,稍微动一下就饱和了。。。

今晚收摊了!东西要不要发还给你?
68
 楼主| 发表于 2008-5-15 23:05 | 只看该作者
原帖由 gale 于 2008-5-15 22:59 发表

我全部都是用中断完成的,不过CPU太慢,中断也不灵啊,举例来说,我简单试验了一下,用中断产生方波,效果很好,然后打开外部中断接收PPM信号,由于外部中断要处理PPM信号,CPU主频低执行的比较慢,所以一旦遥 ...


不用,你留着研究吧。

mega8的电路图,有空发给我。

还有,源程序能否发来我学习学习??

[ 本帖最后由 xunicheng 于 2008-5-15 23:07 编辑 ]
69
 楼主| 发表于 2008-5-15 23:35 | 只看该作者
总觉得不太对。舵机信号是500微秒-1500微秒,用定时器来做,每个周期至少有500微妙的时间来做其它的事情。即使要做到1微妙的精度,也只需要设置定时器定时501微秒就行啊。而且每个周期是20ms,至少有几万个机器周期来用。

我是根据用汇编玩51时候的经验来说的啊,AVR不懂,也许是乱说。

gale看看这篇文章:http://www.mcu123.com/news/Article/uc/uc8051/200608/173.html


忙过着一阵,试着拿汇编爬一下。

[ 本帖最后由 xunicheng 于 2008-5-15 23:39 编辑 ]
70
发表于 2008-5-16 11:38 | 只看该作者
原帖由 xunicheng 于 2008-5-15 23:35 发表
总觉得不太对。舵机信号是500微秒-1500微秒,用定时器来做,每个周期至少有500微妙的时间来做其它的事情。即使要做到1微妙的精度,也只需要设置定时器定时501微秒就行啊。而且每个周期是20ms,至少有几万个机器 ...


看过了,单独搞定舵机驱动还是没问题的,我昨晚不知遇到了什么问题,用TINY13定时器全速产生方波只能有40us周期,再低就不行了,今晚再试试看。

AVR的指令周期比51更短,效率更高,如果也是12M主频,完全没有问题。
71
发表于 2008-5-16 14:41 | 只看该作者
这种事情,汇编是首选。否则只能用更强的cpu了,gale不要放弃啊。
72
发表于 2008-5-16 14:57 | 只看该作者
原帖由 yhybear 于 2008-5-16 14:41 发表
这种事情,汇编是首选。否则只能用更强的cpu了,gale不要放弃啊。


十年前也是从51汇编爬过来的,现在已经基本放弃汇编了,开发成本高啊,放弃久了也就生疏了。其实用了AVR以后,用C基本没有遇到过啥子麻烦,这次主要是TINY13的主频太低了。。。

另,这个东西我调了几个工作时了,有如下心得:
1、传感器太灵敏,这不是好事是坏事,非常容易饱和,不容易精确反映动作情况,需要有办法减弱其灵敏度
2、CPU主频太低,PPM解码分析什么的都是小事,很容易搞定,可要想达到“锁尾”,需要有一些比较复杂的计算
3、供电部分建议二级稳压,比如7806来一个 1117再来一个,因为太灵敏了,要减少其他因素带来的扰动
4、强烈建议用高主频大空间单片机,要想效果好,早晚用大宝,还有一些滤波、容错算法需要占用RAM和ROM啊
5、PPM信号输入要加三极管整形
6、如果要做头部感应,是否可以用红外方式???

另外,昨天我一直在想,这个东西还能做什么有趣的东西呢?
73
发表于 2008-5-16 15:10 | 只看该作者
gale,先把这个做出来阿
其他好玩的我帮你想哈
74
发表于 2008-5-16 15:30 | 只看该作者
听说要角速度的处理要用卡尔曼滤波。
75
 楼主| 发表于 2008-5-16 15:59 | 只看该作者
gale兄,你画个mega8的电路,我打板,早动手早出东东。
76
发表于 2008-5-16 16:01 | 只看该作者
原帖由 xunicheng 于 2008-5-16 15:59 发表
gale兄,你画个mega8的电路,我打板,早动手早出东东。


不用着急,电路简单,我先面包板上搞搞。说实话,早日出东西是不指望了,楼上的卡X曼滤波已经着实吓了我一跳了,也诚征其他高手参加,不过我估计难,能把这个搞出来,就是一个锁尾陀螺仪,还是二维的,呵呵:em15:
77
发表于 2008-5-16 16:25 | 只看该作者
原帖由 gale 于 2008-5-16 14:57 发表


十年前也是从51汇编爬过来的,现在已经基本放弃汇编了,开发成本高啊,放弃久了也就生疏了。其实用了AVR以后,用C基本没有遇到过啥子麻烦,这次主要是TINY13的主频太低了。。。

另,这个东西我调了几个工 ...


说的很对:em26:
这个东西用在自平衡机器人,固定翼的自动平衡,飞机自动油门自动补偿中都可以试试啊,都满好玩的啊。:em19:
其实讨论一下这些东西也不错,过过干瘾,练练脑子。:em15:
78
 楼主| 发表于 2008-5-16 16:44 | 只看该作者
原帖由 gale 于 2008-5-16 16:01 发表


不用着急,电路简单,我先面包板上搞搞。说实话,早日出东西是不指望了,楼上的卡X曼滤波已经着实吓了我一跳了,也诚征其他高手参加,不过我估计难,能把这个搞出来,就是一个锁尾陀螺仪,还是二维的,呵呵 ...

:em26: :em26: :em26: :em26:
79
发表于 2008-5-16 20:27 | 只看该作者

我现在发愁就是传感器的饱和

刚才快速搞定了两个舵机的驱动——定时器只做一件事情是很轻松的。见下:Servo1 2可取值0~200,100是中立点
//////////////////////////////////////////////////////////////////
//设置定时器0
//9.6M振荡器下主频为1.2M
//1.2M主频下 256分频=213.333us计1个数
BYTE Servo1;
BYTE Servo2;
void ServoInit(void)
{
        TCCR0A = 0;                                //不作为PWM使用
        TCCR0B = 0b00000100;        //定时器/计数器0控制寄存器bit7~3保留,bit2~0时钟选择
                                                        //000定时器计数器停止
                                                        //001=CK 010=CK/8 011=CK/64 100=CK/256 101=CK/1024
                                                        //110=外部T0脚,下降沿
                                                        //111=外部T0脚,上升沿
        TIMSK0 = 0b00000010;        //允许定时器0溢出中断
        Servo1=0;
        Servo2=0;
}

/////////////////////////////////////////////////
//定时器中断服务程序
//20ms中断一次
//舵机信号是20~22ms周期,-100%~+100% 对应1ms~2ms的脉宽

#define Delay5us() {BYTE j;for(j=0;j<2;j++) asm ("nop;");}//延时5us

SIGNAL (SIG_OVERFLOW0)
{
        BYTE i;
        
        TCNT0=256-94;

        //拉高两个舵机输出
        PWMH();        

        //延时1ms
        for(i=0;i<200;i++)
        {
                Delay5us();
        }

        //根据舵机比例在合适时机拉低舵机输出
        for(i=0;i<200;i++)
        {               
                if(i>Servo1)        PWM1L();
                if(i>Servo2)        PWM2L();
                Delay5us();
        }
}
80
 楼主| 发表于 2008-5-16 21:29 | 只看该作者
传感器饱和似乎没什么办法解决,慢点转,呵呵。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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