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

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

BASCOM M8打造低成本无人机 38楼更新PPM解码

[复制链接]
跳转到指定楼层
楼主
发表于 2010-6-21 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
点击查看详情
研究了一夜终于小有成就用小弟初学单片机编程,用的是BASCOM,成功控制5个舵机转到指定角度,并无抖动。

特此发帖纪念一下,回家后上程序源代码图片。


这个成果应该可以达到平飞后自动盘旋的功能。(实现这个功能的稳定性还需要修改很多参数)

请大家提意见帮助我成长哈哈!

$hwstack = 32                                                '忽略存贮器不足
$swstack = 10                                               '忽略存贮器不足
$framesize = 40                                              '忽略存贮器不足
$regfile = "attiny13.dat"
$crystal = 9600000
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Do
     For Y = 0 To 4
     Pulseout Portb , 0 , 500                               'PB0驱动9g舵机转到中间
     Waitms 17
     Next
     For Y = 0 To 4
     Pulseout Portb , 1 , 250                               'PB19g舵机左转至60度
     Waitms 17
     Next
     For Y = 0 To 4
     Pulseout Portb , 2 , 750                               'PB29g舵机右转至60度
     Waitms 17
     Next
Loop
End
由于今天又加了些东西职能上个驱动3个舵机的实例希望对新手们有些帮助。

[ 本帖最后由 栋栋 于 2011-7-10 22:48 编辑 ]

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

沙发
发表于 2010-6-21 21:03 | 只看该作者
干吗不用定时器,直接实现10几路舵机信号很轻松:em15:
3
 楼主| 发表于 2010-6-22 00:12 | 只看该作者
原帖由 电动机 于 2010-6-21 21:03 发表
干吗不用定时器,直接实现10几路舵机信号很轻松:em15:

不是很懂,我是新手。我现在的要求就是在一个命令下,激活一种姿态。
4
 楼主| 发表于 2010-6-30 23:00 | 只看该作者
成功通过PC键盘控制舵机上下拉!而且是软串口哦soft!!哈哈哈不多话了上代码
虽然只是单个舵机,多几个也是一样的。下次目标就是让舵机根据键盘计数器矢量运动了呵呵!

$hwstack = 32                                               '忽略存贮器不足
$swstack = 10                                               '忽略存贮器不足
$framesize = 40
$regfile = "ATTINY13.dat"
$crystal = 1200000
Config Portb.2 = Output
Dim B As Byte
Dim Y As Byte
Open "comb.0:9600,8,n,1" For Output As #1
Open "comb.1:9600,8,n,1" For Input As #2
  Print #1 , "请输入任何数字或字符:"
   For Y = 0 To 30
       Pulseout Portb , 2 , 500                             '9g舵机回中
       Waitms 17
       Next
Do
    B = Inkey(#2)
   If B = 119 Then                                          '键盘w
      Print #1 , Chr(b)
       For Y = 0 To 30
       Pulseout Portb , 2 , 250                             '9g舵机左转
       Waitms 17
       Next
       End If
   If B = 115 Then                                          '键盘s
      Print #1 , Chr(b)
       For Y = 0 To 30
       Pulseout Portb , 2 , 750                             '9g舵机右转
       Waitms 17
       Next
   End If
     If B = 113 Then                                        '键盘q舵机回中
      Print #1 , Chr(b)
       For Y = 0 To 30
       Pulseout Portb , 2 , 500                             '9g舵机回中
       Waitms 17
       Next
   End If
Loop

Close #2
Close #1
End
5
 楼主| 发表于 2010-6-30 23:04 | 只看该作者
注意使用ATTINY13开软串口,时钟必须为$crystal = 1200000,否则收到的数据都是乱码。

为了能够控制飞机已经又迈出了第一步了!希望会对新手有些帮助。
6
 楼主| 发表于 2010-7-1 10:57 | 只看该作者
上视频咯!


舵机来回的稳定性还是差了点,可能没有使用外部晶振的关系。继续修改,开贴纪念哈哈哈哈!

[ 本帖最后由 栋栋 于 2010-7-1 13:47 编辑 ]
7
 楼主| 发表于 2010-7-1 22:27 | 只看该作者
更新修改后的值,可以根据键盘按键转动舵机,虽然精度很低,但是已经算矢量输出了。

$hwstack = 32                                               '忽略存贮器不足
$swstack = 10                                               '忽略存贮器不足
$framesize = 40
$regfile = "ATTINY13.dat"
$crystal = 1200000
Config Portb.2 = Output
Dim B As Byte
Dim Y As Byte
Dim Z As Integer
Open "comb.0:9600,8,n,1" For Output As #1
Open "comb.1:9600,8,n,1" For Input As #2
  Print #1 , "请输入任何数字或字符:"
   For Y = 0 To 30
       Pulseout Portb , 2 , 500                             '9g舵机回中
       Waitms 17
       Next
Z = 0
Do
    B = Inkey(#2)
   If B = 119 Then                                          '键盘w
      Print #1 , Chr(b)
       Z = 150
       Pulseout Portb , 2 , Z                               '9g舵机左转
       Waitms 17
   End If
   If B = 115 Then                                          '键盘s
         Z = 850
       Pulseout Portb , 2 , Z                               '9g舵机右转?
       Waitms 17
    End If
     If B = 113 Then                                        '键盘q舵机回中
      Print #1 , Chr(b)
       For Y = 0 To 10
       Pulseout Portb , 2 , 500                             '9g舵机回中
       Waitms 17
       Next
   End If
Loop

Close #2
Close #1
End



[ 本帖最后由 栋栋 于 2010-7-1 22:59 编辑 ]
8
发表于 2010-7-3 16:50 | 只看该作者
支持lz,偶刚开始学,以后还得向lz多多请教:em26:
9
 楼主| 发表于 2010-7-4 16:19 | 只看该作者
原帖由 xuzhaohuatom 于 2010-7-3 16:50 发表
支持lz,偶刚开始学,以后还得向lz多多请教:em26:

我也是刚刚开始学。一起学习,我这几天发现用IF语句并不是最有效的,而且舵机没有精确锁定位置,正在尝试CASE语句
10
 楼主| 发表于 2010-7-4 16:25 | 只看该作者
舵机控制只是一小部分,接下去还有很多东西要加上去。高度计,最终用串行接口把这些模块连接起来就可以了。
11
 楼主| 发表于 2010-7-6 10:26 | 只看该作者
发现一个很严重的问题,我这样只能做到转动,还不能做到锁定某个位置。还需要改进。。。。。
12
发表于 2010-8-17 12:15 | 只看该作者
建议楼主立即着手进行多路舵机的控制实验.
控制一个舵机和控制几个舵机可不是简简单单加几行代码的事情哦.
祝成功.
13
 楼主| 发表于 2010-9-6 13:57 | 只看该作者
原帖由 danielwang 于 2010-8-17 12:15 发表
建议楼主立即着手进行多路舵机的控制实验.
控制一个舵机和控制几个舵机可不是简简单单加几行代码的事情哦.
祝成功.


我的要求仅限控制无人机的飞行最多也就4路。通过串口传输已经OK了。程序测试下来,很稳定用的是mega8的芯片。
14
发表于 2010-9-7 02:21 | 只看该作者
//Timre1
DDRB|=1<<5|1<<6|1<<7;
ICR1=20000;//基频20MS
OCR1A=1500;
OCR1B=1500;
TCCR1A=(1<<COM1A1|1<<COM1B1|1<<COM1C1);//比较匹配的时候清零
TCCR1B=(1<<WGM13)|(1<<CS11);// Phase and Freq correct ICR1=Top

用定时器控制单片机的代码。。稳定可靠,而且为异步操作,只要在代码里修改输出比较器的值就可以了。。希望能帮到点忙
15
发表于 2010-9-7 09:24 | 只看该作者
如果只做驱动电机这一件事情,用循环也是可以的,否则还是用定时器比较好,可以实现高精度多路输出,如果信号要求比较标准(50Hz),精度要求又很高,那么最多也就实现9路了。楼上的说轻轻松松十几路是做不到的(不是说管脚不够),轻轻松松十几路输出的信号,也能驱动舵机,但是信号的精度和刷新频率无法同时满足要求,玩玩可以,或者搞机器人这样的东西。
16
发表于 2010-10-3 00:35 | 只看该作者
楼主上位机软件是什么编的啊?
我认为控制多路舵机,还是用定时器生成类似PPM的码串行输出,然后外面用个移位寄存器就可以了,最多可以控制20/2=10路舵机呢,够用了吧
17
发表于 2010-10-3 00:54 | 只看该作者
用定时器吧,不然程序复杂了就不行了
18
发表于 2010-10-3 14:44 | 只看该作者
祝贺
19
发表于 2010-11-11 20:40 | 只看该作者
学习学习。
20
发表于 2011-1-1 15:02 | 只看该作者
:em24: :em03: :em03: :em03: :em01:
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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