查看: 5000|回复: 32
|
servo programing
[复制链接]
|
|
版主好,小弟又有一些问题关于servo的program。
我找到了一个简单的program但是不明白为何如此写法。。。
希望版可以帮帮忙,谢谢!
Counter EQU 0Ch ;Servo delay counter register
Position EQU 0Dh ;Servo Position register
Servo1 EQU RB.0 ;Servo I/O port pin
Main .
.
Servo MOVLW 248 ;Load Counter with # of cycles for
MOVWF Counter ;1 ms Servo Delay
BSF Servo1 ;Activate the Servo1 output
CALL Delay ;Wait for 1ms to pass
MOVF Position,0 ;Load W with servo position
;00 & FF=extremes, 128=centre
MOVWF Counter ;and store in Counter for next delay
CALL Delay ;Keep servo active for position delay
BCF Servo1 ;Deactivate the Servo1 output
.
. ;Do other processing here, but
;remember to update each servo
;approximately once every 20 ms
Delay ;Servo time delay
NOP ad the loop with one cycle
DECFSZ Counter ;Counter=Counter-1
GOTO Delay ;If Counter is not 0, repeat
RETURN ;If 0, return |
|
|
|
|
|
|
|
发表于 4-5-2008 05:37 PM
|
显示全部楼层
我不懂要怎样解释。不过大概大概。
servo motor用pwm来控制position.
0-9ms-2.1ms有些是1.0ms-2.0ms.

http://mcu-programming.blogspot.com/2006/09/servo-motor-control.html
这个program一开始delay 1 ms (counter).
过后再delay 0-1ms(position).看你要servo 去那里。
过后等到20ms.在从新execute 过。
这个program是用instructrion execution time 来generate pulse.可以很准, 不过不flexible. crystal frequency改, mcu不一样都可能用不到了。 |
|
|
|
|
|
|
|

楼主 |
发表于 4-5-2008 07:52 PM
|
显示全部楼层
如果我用bsf, call delay 1.5ms, 然后bcf可以吗? |
|
|
|
|
|
|
|
发表于 5-5-2008 12:58 AM
|
显示全部楼层
原帖由 dns 于 4-5-2008 07:52 PM 发表 
如果我用bsf, call delay 1.5ms, 然后bcf可以吗?
也是可以。不过在你给的program. 255最多可以去到delay 1ms而已。 |
|
|
|
|
|
|
|

楼主 |
发表于 5-5-2008 01:34 AM
|
显示全部楼层
我想要控制servo可以向左向右甚至可以停着,
应该要怎么写呢?我用的是asm
谢谢版主! |
|
|
|
|
|
|
|
发表于 5-5-2008 08:58 AM
|
显示全部楼层
原帖由 dns 于 5-5-2008 01:34 AM 发表 
我想要控制servo可以向左向右甚至可以停着,
应该要怎么写呢?我用的是asm
谢谢版主!
请问你用什么MCU?
你要控制一粒Servo motor 而已?
如是一个, 用内建的HW PWM是最简单的做法。 |
|
|
|
|
|
|
|

楼主 |
发表于 5-5-2008 10:25 PM
|
显示全部楼层
我用的是16F877A, 打算用来控制6~9个SERVO. |
|
|
|
|
|
|
|
发表于 6-5-2008 12:44 AM
|
显示全部楼层
原帖由 dns 于 5-5-2008 10:25 PM 发表 
我用的是16F877A, 打算用来控制6~9个SERVO.
6-9 个servo的话,你这个program不能用。
浪费时间。不precise.用timer generate吧。不过microcontroller的limitation,resolution可能去不到很高。
你的resolution要多高? |
|
|
|
|
|
|
|

楼主 |
发表于 6-5-2008 11:18 AM
|
显示全部楼层
不好意思小弟只是个初学者,很多东西都不懂。
什么是resolution?
我的servo不用很precise,可以转动就行了。 |
|
|
|
|
|
|
|
发表于 6-5-2008 02:18 PM
|
显示全部楼层
resolution ahh...
16F877A 好像是 10个 bit 的啊。。 |
|
|
|
|
|
|
|
发表于 6-5-2008 03:15 PM
|
显示全部楼层
原帖由 dns 于 6-5-2008 11:18 AM 发表 
不好意思小弟只是个初学者,很多东西都不懂。
什么是resolution?
我的servo不用很precise,可以转动就行了。
6~9个SERVO, 一开始就应该说明。 
还是先问清楚先。。。请问, 你的servo motor
1. 长什么样子?请放照片。
2. 做什么用途?
3. 为什么要6~9个?
先理解了才给解答吧。。。 |
|
|
|
|
|
|
|

楼主 |
发表于 7-5-2008 01:39 PM
|
显示全部楼层

我要用SERVO来做ROBOT ARM.这是我要用的SERVO。
ROBOTARM 要有一共要有3个手指。
一个手指要有2~3个SERVO来做关节。 |
|
|
|
|
|
|
|
发表于 7-5-2008 04:44 PM
|
显示全部楼层
原帖由 dns 于 7-5-2008 01:39 PM 发表 
我要用SERVO来做ROBOT ARM.这是我要用的SERVO。
ROBOTARM 要有一共要有3个手指。
一个手指要有2~3个SERVO来做关节。
你可以做Software PWM, 6-9 个 low Freq 的Soft PWM, 不会有问题。 |
|
|
|
|
|
|
|

楼主 |
发表于 8-5-2008 11:12 PM
|
显示全部楼层
原来如此,酱software应该要如何写呢?
我的robot arm要接去一个手套,
当我们将手指弯曲时,robot arm也要跟着做。
这一点有点困扰,因为我不懂program的flowing应该怎么写,
希望版主们可以帮帮忙,谢谢!! |
|
|
|
|
|
|
|
发表于 9-5-2008 10:11 AM
|
显示全部楼层
原帖由 dns 于 8-5-2008 11:12 PM 发表 
原来如此,酱software应该要如何写呢?
我的robot arm要接去一个手套,
当我们将手指弯曲时,robot arm也要跟着做。
这一点有点困扰,因为我不懂program的flowing应该怎么写,
希望版主们可以帮帮忙,谢谢!!
下面我用CCS C 写了简单的8ch Soft PWM, resolution 是8bit, duty cycle (0-255)
频率可以通过preload 来改变, 输出是PortD。
PWMx_duty = (0-255), 改变PWM 的Duty Cycle。
其他的你自己写了。。。不明白再问。
[ 本帖最后由 pic 于 9-5-2008 10:54 PM 编辑 ] |
|
|
|
|
|
|
|

楼主 |
发表于 9-5-2008 12:07 PM
|
显示全部楼层
不好意思版主,我不会用c-language,请问有asm吗? |
|
|
|
|
|
|
|
发表于 9-5-2008 05:21 PM
|
显示全部楼层
原帖由 dns 于 9-5-2008 12:07 PM 发表 
不好意思版主,我不会用c-language,请问有asm吗?
对不起, 我不用ASM。 (用ASM 我会找不到吃, 我是指我自己, 不包括其他人。) |
|
|
|
|
|
|
|
发表于 9-5-2008 11:39 PM
|
显示全部楼层
原帖由 dns 于 9-5-2008 12:07 PM 发表 
不好意思版主,我不会用c-language,请问有asm吗?
老实说, 我觉得用16f877a generate 9 channel pwm给servo motor很难。用pic斑竹的方式, 20mhz crystal 的pic.
每392 machine cycle就要interrupt一次。
resolution = 8 bits, 255 steps.
不过servo motor的pwm range是0.9ms-2.1ms/20ms. 8 bits的resolution只能给那个servo motor大概(2.1-0.9)/20 *255 = 16个steps.
你首先要confirm每一次interrupt,你的irq 不能太久,一定要在392 machine cycles里面搞定全部irq function.
接下来, 你还有其他的任务。 相信你的mcu不只是拿来做pwm 吧。
终结来讲, 这个program可能不简单写。还用asm来写, 会吐。
我建议用两个mcu.一个专门拿来generate pwm.另一个做processing其他的东西。
可以用usart, i2c来link 这两个mcu. |
|
|
|
|
|
|
|
发表于 10-5-2008 07:14 AM
|
显示全部楼层
原帖由 fritlizt 于 9-5-2008 11:39 PM 发表 
老实说, 我觉得用16f877a generate 9 channel pwm给servo motor很难。用pic斑竹的方式, 20mhz crystal 的pic.
每392 machine cycle就要interrupt一次。 resolution = 8 bits, 255 steps.
不过servo motor的pwm range是0.9ms-2.1ms/20ms. 8 bits的resolution只能给那个servo motor大概(2.1-0.9)/20 *255 = 16个steps.
你首先要confirm每一次interrupt,你的irq 不能太久,一定要在392 machine cycles里面搞定全部irq function.
接下来, 你还有其他的任务。 相信你的mcu不只是拿来做pwm 吧。
首先, 我不曾玩过或做过Servo motor的project, 我上面的源码, 只是示范如何做简单的Soft PWM,
(它并不是我特意设计来给Servo 用, 它是我以前做DMX灯光控制时而做的。)
我的源码里的resolution 是8bit, 其实可以改成4bit (16Step), 5bit (32step), 6bit (64Step), 来争取更多的MCU time。
要用20MHZ的PIC16来做, 不是不可能, 可以做0~2ms 的PWM(Full time), 过后的18ms 释放给其他的Task用
也可以考虑用PIC18F, 40Mhz。
我建议用两个mcu.一个专门拿来generate pwm.另一个做processing其他的东西。
可以用usart, i2c来link 这两个mcu.
我非常赞同用双MCU来实现. (我有一款的DMX灯光控制也是用双MCU) |
|
|
|
|
|
|
|

楼主 |
发表于 10-5-2008 02:17 PM
|
显示全部楼层
酱如果我把servo的数量减少到6个
program会不会简单一点呢? |
|
|
|
|
|
|
| |
本周最热论坛帖子
|