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

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

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

[复制链接]
61
发表于 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:

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

62
 楼主| 发表于 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:
63
发表于 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%的范围上只有很差的步进量。。。


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

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

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

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

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

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

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

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

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


不用,你留着研究吧。

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

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

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


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

AVR的指令周期比51更短,效率更高,如果也是12M主频,完全没有问题。
70
发表于 2008-5-16 14:41 | 只看该作者
这种事情,汇编是首选。否则只能用更强的cpu了,gale不要放弃啊。
71
发表于 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、如果要做头部感应,是否可以用红外方式???

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


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


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

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


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


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

:em26: :em26: :em26: :em26:
78
发表于 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();
        }
}
79
 楼主| 发表于 2008-5-16 21:29 | 只看该作者
传感器饱和似乎没什么办法解决,慢点转,呵呵。
80
发表于 2008-5-16 21:49 | 只看该作者
原帖由 xunicheng 于 2008-5-16 21:29 发表
传感器饱和似乎没什么办法解决,慢点转,呵呵。

郁闷啊,就这么简单的程序,其输出脉冲还是不稳定,舵机颤抖个不停,开始我还以外是驱动信号电压5V的原因,加电阻分压到3.4V以后还是一样。似乎在这个1.2M主频的东西上还是有麻烦啊。。。找了一段文章:
在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。
   舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
   0.5ms--------------0度;
   1.0ms------------45度;
   1.5ms------------90度;
   2.0ms-----------135度;
   2.5ms-----------180度;
请看下形象描述吧:



这只是一种参考数值,具体的参数,请参见舵机的技术参数。
   小型舵机的工作电压一般为4.8V或6V,转速也不是很快,一般为0.22/60度或0.18/60度,所以假如你更改角度控制脉冲的宽度太快时,舵机可能反应不过来。如果需要更快速的反应,就需要更高的转速了。
要精确的控制舵机,其实没有那么容易,很多舵机的位置等级有1024个,那么,如果舵机的有效角度范围为180度的话,其控制的角度精度是可以达到180/1024度约0.18度了,从时间上看其实要求的脉宽控制精度为2000/1024us约2us。如果你拿了个舵机,连控制精度为1度都达不到的话,而且还看到舵机在发抖。在这种情况下,只要舵机的电压没有抖动,那抖动的就是你的控制脉冲了。而这个脉冲为什么会抖动呢?当然和你选用的脉冲发生器有关了。一些前辈喜欢用555来调舵机的驱动脉冲,如果只是控制几个点位置伺服好像是可以这么做的,可以多用几个开关引些电阻出来调占空比,这么做简单吗,应该不会啦,调试应该是非常麻烦而且运行也不一定可靠的。其实主要还是他那个年代,单片机这东西不流行呀,哪里会哟!
使用传统单片机控制舵机的方案也有很多,多是利用定时器和中断的方式来完成控制的,这样的方式控制1个舵机还是相当有效的,但是随着舵机数量的增加,也许控制起来就没有那么方便而且可以达到约2微秒的脉宽控制精度了。听说AVR也有控制32个舵机的试验板,不过精度能不能达到2微秒可能还是要泰克才知道了。其实测试起来很简单,你只需要将其控制信号与示波器连接,然后让试验板输出的舵机控制信号以2微秒的宽度递增。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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