本帖最后由 xxdcq 于 2016-4-17 12:34 编辑
由于乐迪T7F遥控器不具备旋钮控制,只有拨杆,拨杆只有2档,所以控制云台角度也只有2档,即只能水平朝前和竖直向下拍摄。
设计了一个小装置可以将拨杆的两档信号转换成六档信号出来就可以实现云台的6档倾斜角度
电路非常简单,采用宏晶单片机STC15F102W,成本不超过2元钱
原先云台输入线是直接插在接收机上,现在将云台输入线插在这个小装置的输出端,小装置的信号输入端接在接收机上,
连接很简单
通过拨杆动作了来改变角度,只要拨杆状态发生变化(不管是由上到下还是由下到上),云台倾斜角度都会改变一次,角度每次改变18度
变化范围0--90度。
15--20是装置信号输出值,代表一定的脉冲宽度,符合航模遥控设备舵机信号标准。
演示视频:
源代码:
;******************************************************************************
;程序功能:将拨动开关2档信号脉冲转换成6档信号脉冲
;mcu STC15F102W;内部晶振11.0592M,1.38T
;******************************************************************************
;特殊功能寄存器定义
p3m1 equ 0b1h
p3m0 equ 0b2h
auxr equ 8eh
auxr1 equ 0a2h ;选择双指针
ie2 equ 0afh
wdtrst equ 0c1h
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下行程
;******************************************************************************
org 0000h
ljmp start
org 0003h
reti
org 000bh
ljmp t0_int
org 0013h
reti
org 001bh
reti
;******************************************************************************
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
;******************************************************************************
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
|
|