奥迪 发表于 2010-8-6 09:47:47

通用伺服电机的工作原理


.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    dttime   dt   time
;22    1ms    261.5ms29    2ms
;51   10ms    6318ms   64   18.8ms
;65   19.6ms144 200ms197500ms
;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

这遥控伺服机当学生时玩车不知拆了多少了
页: [1]
查看完整版本: 通用伺服电机的工作原理