由于乐迪T7F遥控器不具备旋钮控制,只有拨杆,拨杆只有2档,所以控制云台角度也只有2档,即只能水平超前和竖直向下拍摄。
设计了一个小装置可以将拨杆的两档信号转换成六档信号出来就可以实现云台的6档倾斜角度
电路非常简单,采用宏晶单片机STC15F102W,成本不超过2元钱
原先云台输入线是直接插在接收机上,现在将云台输入线插在这个小装置的输出端,小装置的信号输入端接在接收机上,
连接很简单
通过拨杆动作了来改变角度,只要拨杆状态发生变化(不管是由上到下还是由下到上),云台倾斜角度都会改变一次,角度每次改变18度
变化范围0--90度。
15--20是装置信号输出值,代表一定的脉冲宽度,符合航模遥控设备舵机信号标准。
演示视频:
?from=y1.7-1.2[/media]
源代码:
;******************************************************************************
;程序功能:将拨动开关2档信号脉冲转换成6档信号脉冲
;mcu STC15F102W;内部晶振11.0592M,1.38T
;******************************************************************************
;特殊功能寄存器定义
p1m1 equ 91h
p1m0 equ 92h
p0m1 equ 93h
p0m0 equ 94h
p2m1 equ 95h
p2m0 equ 96h
p3m1 equ 0b1h
p3m0 equ 0b2h
p1asf equ 9dh ;p1.x口作为a/d的使能
auxr equ 8eh
auxr1 equ 0a2h ;选择双指针
ie2 equ 0afh
adcontr equ 0bch ;a/d控制
adres equ 0bdh ;a/d结果
wdtrst equ 0c1h
isp_data equ 0c2h
isp_addh equ 0c3h
isp_addl equ 0c4h
isp_cmd equ 0c5h
isp_trig equ 0c6h
isp_contr equ 0c7h
p5m1 equ 0c9h
p5m0 equ 0cah
t2h equ 0d6h
t2l equ 0d7h
;******************************************************************************
;引脚定义
pin bit p3.2 ;标准IO
pout bit p3.3 ;推挽输出
led bit p3.4
;******************************************************************************
;所用的寄存器
;00h--0bh 工作寄存器
;0ch--13h 堆栈
pswtime equ 14h ;输出脉冲高电平时间范围15--20(1.5ms--2.0ms)
;100us一个定时周期
pswbuf equ pswtime+1
pswcycle equ pswbuf+1 ;输出脉冲周期一般取200(20ms)100us一个定时周期
;******************************************************************************
;位状态
keystatus bit 00h ;拨动开关状态,0在上面,1在下面
upordown bit 01h ;是上行程还是下行程,0上行程,1下行程
;******************************************************************************
;isp参数定义(常数)
enable_isp equ 3eh ;<12MHz
enable_isp1 equ 7dh
enable_isp2 equ 52h
ispwaitcmd equ 00h
isprdcmd equ 01h
ispwrcmd equ 02h
isperasecmd equ 03h
;******************************************************************************
;命令(常数)
;******************************************************************************
org 0000h
ljmp start
org 0003h
reti
org 000bh
ljmp t0_int
org 0013h
reti
org 001bh
reti
;******************************************************************************
;11.0592M晶震,延时25ms
dt25ms:
mov r6,#200
dt0:
mov r7,#125
dt1:
mov wdtrst,#00110001b ;清看门狗
nop
nop
nop
nop
djnz r7,dt1
djnz r6,dt0
ret
org 0043h
;******************************************************************************
start:
clr ea
mov sp,#0ch
mov wdtrst,#00110001b ;启动看门狗,看门狗溢出时间为142.2ms
lcall ioinit
lcall sysinit
;主程序开始
clr led
mov r5,#8
main:
lcall dt25ms
djnz r5,main
setb led
lcall go ;启动pout输出
mov r5,#200 ;等10秒,等2轴云台初始化完成
main1:
lcall dt25ms
lcall dt25ms
djnz r5,main1
clr led
lcall pcl ;先测量脉冲初始宽度
mov a,t2h
cjne a,#4bh,main2
mov a,t2l
cjne a,#0ach,main3
clr keystatus ;拨动开关在上面
ljmp main5
main2:
jnc main4
clr keystatus ;拨动开关在上面
ljmp main5
main3:
jnc main4
clr keystatus ;拨动开关在上面
ljmp main5
main4:
setb keystatus ;拨动开关在下面
main5:
lcall pcl ;测量脉冲初始宽度
mov a,t2h
cjne a,#4bh,main6
mov a,t2l
cjne a,#0ach,main7
ljmp main9
main6:
jnc main8
ljmp main9
main7:
jnc main8
ljmp main9
main8:
jb keystatus,main5 ;上次也是1状态没变
setb keystatus ;拨动开关在下面
cpl led
lcall change ;改变脉冲宽度
ljmp main5
main9:
jnb keystatus,main5 ;上次也是0状态没变
clr keystatus ;拨动开关在上面
cpl led
lcall change ;改变脉冲宽度
ljmp main5
;******************************************************************************
ioinit:
mov p0,#0ffh
mov p1,#0ffh
mov p2,#0ffh
mov p3,#0f7h ;pout低电平
mov p3m1,#00000000b
mov p3m0,#00001000b
ret
;******************************************************************************
sysinit:
mov tmod,#11h ;t0,t1都为16位定时器方式
mov auxr,#04h ;先禁止t2工作,t2不需要12分频
mov th0,#0ffh ;100us定时作为输出脉冲时基
mov tl0,#0a4h
clr psw.4 ;第一组工作寄存器
clr psw.3
clr c
clr ex1
clr tf0
clr tf1
clr tr1
mov pswtime,#15 ;输出脉冲先在起始位置
clr upordown ;先上行程
ret
;******************************************************************************
go:
mov pswbuf,pswtime ;输出脉冲宽度赋值
mov pswcycle,#200 ;输出脉冲周期20ms
setb et0
setb ea
setb pout
setb tr0
ret
;******************************************************************************
;测量输入脉冲宽度
pcl:
mov wdtrst,#00110001b ;清看门狗
jb pin,pcl ;如果是高电平需要等到变低
pcl1:
mov wdtrst,#00110001b ;清看门狗
jnb pin,pcl1 ;等待上升沿
mov t2h,#00h ;最大5.92ms
mov t2l,#00h
orl auxr,#10h ;启动T2
pcl2:
mov wdtrst,#00110001b ;清看门狗
jb pin,pcl2 ;等待脉冲结束
anl auxr,#0efh ;停止T2
ret
;******************************************************************************
change:
jb upordown,change1
inc pswtime ;是上行程就增大脉冲宽度
mov a,pswtime
cjne a,#20,change2
setb upordown ;变为下行程
ljmp change2
change1:
dec pswtime ;是下行程就减小脉冲宽度
mov a,pswtime
cjne a,#15,change2
clr upordown ;变为上行程
change2:
ret
;******************************************************************************
t0_int:
djnz pswbuf,t0_int1
clr pout
t0_int1:
djnz pswcycle,t0_int2
mov pswcycle,#200 ;输出脉冲周期20ms
mov pswbuf,pswtime
setb pout
t0_int2:
clr tf0
mov th0,#0ffh ;100us定时作为输出脉冲时基
mov tl0,#0a4h
reti
;******************************************************************************
end
|