机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2091|回复: 1

通用伺服电机的工作原理

[复制链接]
发表于 2010-8-6 09:47:47 | 显示全部楼层 |阅读模式
未命名.jpg
.include "8515def.inc"                ; 器件配制文件, 本实验使用AT90S8515
.def dt = r22                                ; 定义dt等于r22
.org        $000                                ; 程序首地址
        rjmp        reset4                        ; 跳过中断区
        
.org        $010                                ; 主程序首地址,注意,不同器件的中断地址范围是不同的!
reset4:
        ldi r17,$02                ;置堆栈指针,AT90S8515的RAM最大地址为$025F, 设堆栈底为$025F
        ldi r16,$5f
        out sph,r17                ; 高位堆栈sph=$02
        out spl,r16                ; 低位堆栈spl=$5f

shiyan4:
        ldi r17,$ff
        out ddrb,r17        ; pb口方向寄存器设置为输出,1为输出
        out portb,r17        ; 设pb口内部上拉
        out ddrd,r17        ; pd口方向寄存器设置为输出,1为输出
        out portd,r17   ; 设pd口内部上拉
        
start3:                                ; 设置舵机摆动周期常数, 即调节节拍常数
        LDI R23,$11        
        LDI R25,$11
                    ;R23=R25=$50摆动周期1S; 如=$30摆动周期0.5S
; 如=20-10摆动周期, 也可理解为调节拍范围
                    ;$8强劲舞曲          ; $18   男儿当自强       ;$11 少年梦
                                ; 可作自唱自演跳舞机器人设计用。
start6:                                ; 舵机向-60度方向移动
        sbi        $18,0                ; 置pb.0为1
        rcall        de10        ;1ms,-60度
        cbi        $18,0                ; 清pb.0为0
        rcall        de10        ;1ms,-60度
        rcall        de185        ;19ms

        DEC        R23                        ;R23-1
        CPI         R23,$01        ;R23 与立即数$01比较
        BRSH        start6        ;大于等于则转移到, 小于顺序执行
        rcall        de200        ; 调用2ms延时程序
        
start60:                        ; 舵机向+60度方向移动
        sbi        $18,0                ; 置pb.0为1
        rcall        de20        ;2ms,+60度
        cbi        $18,0                ; 清pb.0为0
        rcall        de20        ; 调用2ms,+60度
        rcall        de18        ; 调用18ms
        
        DEC        R25                        ;R25-1
        CPI         R25,$01        ; ;R25 与立即数$01比较
        BRSH        start60        ;大于等于则转移到, 小于顺序执行
        rcall        de200   ; 调用20ms
        rjmp        start3        ;循环检测

de10:                                ; 1ms延时子程序
        ldi        dt,21                ;1ms
        rcall        delay        ; 调用通用延时子程序
        ret                                ; 子程序返回
de15:                                ; 1.5ms延时子程序
        ldi        dt,26                ;1.5ms
        rcall        delay        ; 调用通用延时子程序
    ret                                ; 子程序返回
de20:                                ; 2ms延时子程序
        ldi        dt,28                ;2ms
        rcall        delay        ; 调用通用延时子程序
        ret                                ; 子程序返回
de18:                                ; 18ms延时子程序
        ldi        dt,63            ;18ms
        rcall        delay        ; 调用通用延时子程序
        ret                                ; 子程序返回
de185:                                 ; 19ms延时子程序
        ldi        dt,64                ;18.8ms
        rcall        delay        ; 调用通用延时子程序
        ret                                ; 子程序返回
de19:                                ; 20ms延时子程序
        ldi        dt,65                ;19.6ms
        rcall        delay        ; 调用通用延时子程序
        ret                                ; 子程序返回

de200:                        ;20ms延时子程序
        ldi        dt,50           ;2ms,DT=100-10无多大变化
        rcall        delay        ; 调用通用延时子程序
        ret                                ; 子程序返回
;延时时间对照表
;**********************************
;fos=8MHz
;dt   time    dt  time   dt   time
;22    1ms    26  1.5ms  29    2ms
;51   10ms    63  18ms   64   18.8ms
;65   19.6ms  144 200ms  197  500ms
;249    1s
;**********************************
delay:                                ; 通用延时子程, 子程序2级嵌套
            push dt                ; 进栈,需2t
del1:        push dt                ; 进栈,需2t
del2:        push dt                ; 进栈,需2t
del3:        dec dt                ; dt-1,需1t
        brne        del3        ; 上条指令执行后Z=0转, Z=1顺执, 需1t/2t
        pop dt                        ; 出栈, 需2t
        dec dt                        ; dt-1,需1t
        brne        del2        ; 上条指令执行后Z=0转, Z=1顺执, 需1t/2t
        pop dt                        ; 出栈, 需2t
        dec dt                        ; dt-1,需1t
        brne        del1        ; 上条指令执行后Z=0转, Z=1顺执, 需1t/2t
        pop dt                        ; 出栈, 需2t
        ret                                ; 子程序返回, 需4t
回复

使用道具 举报

发表于 2010-8-6 11:15:34 | 显示全部楼层
这遥控伺服机当学生时玩车不知拆了多少了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-11-30 02:38 , Processed in 0.055784 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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