光电米测试电路设计报告Word格式文档下载.docx
《光电米测试电路设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《光电米测试电路设计报告Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
图中U1光电开关单元电路用于开机/待机功能控制电路,ajkonzhi2端子单片机输入500Hz信号驱动光电开关器件U1发光二极管,使他产生发射一个光脉冲串,当反射物体置于光电开关器件U1上方合适位置时,光脉冲串经反射物体将光反射给U1光电三极管转换成功能控制电信号传送给CPU,同理,U2(加)、U3(减)、U4(线单位长度脉冲发生电路)的工作原理类同,其目的是为了避免电器开关易磨损和产生干扰。
电路参数计算,由于电路单元电路的类同性,所以以U1、Q1、Q17组成的单元电路为设计目标,计算如下,根据光电开关电路U1的发光二极管、R5、Q17的集电极、发射机构成的回路列KVL方程,已知条件:
该支路工作在数字开关状态,电源电压5V,支路电流10mA(由光电开关器件的参数决定,并设光电开关器件的发光二极管的工作电压为VF),R5电路参数由下
(1)、
(2)计算;
R5=
(1)
P(功率)=
(2)
电阻功率取安全系数为5,则PR=0.16mW;
取标称值R5=300R(1/16W)。
若选择光电开关器件中的BJT集电极电流为IC=0.5mA,则有以下(3)式决定,
R6=(5V-VCES)/0.3mA=(5V-0.5V)/0.3mA=15kΩ(3)
取标称值R6=15kΩ(1/16W)。
R53计算条件是IC=10mA,Q17的β值为250,输入电压脉冲幅值等于5V,则R53值由下式(4)决定,
R53=(5V-VBEQ17)/10mA/βQ17
=(5V-0.6V)/10mA/250=110kΩ(4)
取标称值R53=100kΩ(1/16W)。
R13是Q1的偏置电阻,其电路参数计算由(5)式决定,
R13=(VU1CE-VBEU1)/0.3mA/βQ1=208kΩ(5)
上式中VU1CE=1V,是由于光电开关元件的光电三极管暴露在杂散光下产生一个光电流形成的UU1CE=1V,所以VU1C=1V,取标称值R13=200K/1/16W。
同理R1=10KΩ/1/16W。
其中C1是一个加速电容,它是为了提高电路的反应速度而设定的,其原理是电路稳态时C1不起作用,当他的两端电位突然变化时,将产生一个阶跃电流,加速Q1BJT的状态翻转,达到提高开关速度的目的。
2.2.3单片机与显示电路
图6单片机与显示电路原理图
图中CPU选择STC12C5A40S2,选择12MHz时钟,显示电路采用3位半LED字段共阴极显示模块,采用扫描式驱动方式;
功能操作采用LED显示,供用户确定操作状态。
其蜂鸣器供操作者确定参考状态。
2.2.4驱动电路
图7中是系统电路的直流电机和步进电机的驱动电路,它采用隔离电路U5、U5、U7、U11光电隔离器进行负载与CPU之间的电隔离,防止负载意外状态负载24V高压CPU的损害,提高系统稳定的可靠性。
电机驱动电路采用专用芯片LV8731V,特点:
它是一个全桥式功率驱动芯片,体积小,效率高,它可以驱动直流电机又可驱动步进电机,并且功能选择多样化,控制功能端数量少,工作效率高,给设计提高了方便。
图7驱动电路原理图
3系统PCB设计
PCB电路板选择双层电路板布局,采用贴片元件来提高元件布置密度,同时要求全工艺制板。
PCB如下图。
图8系统电路PCB电路板图
4软件工程设计
4.1算法
4.2程序
/*******************************************
文件:
Test.c
环境:
编译环境为keilCUv2
硬件:
STC12C5A56S2单片机,LV8731V电机驱动芯片,四位一体数码管,电磁式有源蜂鸣器,LED指示灯,反射式光电耦合器(按键)
功能:
通过按键设定所需要的线长(精确至0.1m),启动电机或者手动卷线,对卷线长度进行计数,当到达设定长度时(精确至0.01m)电机停转,
日期:
2011年11月30日
备注:
设计者:
李琳
*******************************************/
#include<
intrins.h>
//包含汇编指令文件
reg52.h>
//包含型号头文件
#defineFOSCL//声明晶振频率
#defineT0MS(65536-FOSC/1000+14)//1ms计时初始值
sfrAUXR=0x8E;
//单片机特殊功能寄存器
sfrP4=0xc0;
//声明P4口的位置
sfrP4SW=0xBB;
//声明P4口控制寄存器
sfrP0M0=0x94;
//声明P0口模式配置寄存器0
sfrP0M1=0x93;
//声明P0口模式配置寄存器1
sfrP1M0=0x92;
//声明P1口模式配置寄存器0
sfrP1M1=0x91;
//声明P1口模式配置寄存器1
sfrP2M0=0x96;
//声明P2口模式配置寄存器0
sfrP2M1=0x95;
//声明P3口模式配置寄存器1
sbitsd_led=P1^6;
//加按键指示灯
sbitds_led=P1^5;
//减按键指示灯
sbitspeaker=P1^4;
//蜂鸣器控制输出端,为1时鸣响,为0时不响
sbitajkongzhi2=P1^3;
//开关机按键调制信号
sbitajkongzhi1=P1^2;
//其它按键调制信号
sbitfz_led=P1^1;
//计数指示灯-红
sbitzz_led=P1^0;
//计数指示灯-黄
sbitw1=P4^4;
//声明数码管位选管脚1
sbitw2=P2^7;
//声明数码管位选管脚2
sbitw3=P2^6;
//声明数码管位选管脚3
sbitw4=P2^5;
//声明数码管位选管脚4
sbitdp=P0^7;
//声明小数点控制位
sbitaj1=P3^3;
//声明按键1所对应的管脚
sbitaj2=P4^2;
//声明按键2所对应的管脚
sbitaj3=P3^2;
//声明按键3所对应的管脚
sbitaj4=P4^3;
//声明按键4所对应的管脚
sbitST=P2^0;
//电机待机/工作控制脚
sbitDC11=P2^1;
//电机控制信号
sbitDC12=P2^2;
sbitDC21=P2^3;
sbitDC22=P2^4;
//电机控制信号
bitpower;
//电源状态标志,为0时为待机状态,为1时为工作状态
unsignedcharshuzi[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
//常用数字所对应的数值(0-9)0x00为数码管不亮
unsignedcharqianwei,baiwei,shiwei,gewei;
//显示数位千、百、十、个
unsignedcharflag,flag2,flag3;
//flag为0时表示为power=0状态,为1时表示为power=1状态
//flag2为电机转动标志,为1时开始转动,为0时不转动
//flag3为0时计数键锁定,为1时计数键解锁
unsignedintjishi1,jishi2,jishi3,jishi4,jishi5,jishi6,jishi11,jishi22,jishi32;
//jishi1-4为按键1-4调制信号计数,
//jishi5为开关机按键时间计时,jishi6为500毫秒计时位
//jishi11为蜂鸣器鸣响时间计时
//jishi22为增加键加速计时,jishi32为减少键加速计时
unsignedcharweizhi;
//数码管位选标志
unsignedintxianchang;
//线长计数,单位0.01m
sfrWDT=0xC1;
//声明看门狗寄存器
/*******************************************
*函数名:
init
*功能描述:
系统初始化程序
*函数说明:
对端口和定时器进行初始化
*调用函数:
无
*全局变量:
*输入:
*返回:
*设计者:
李琳日期:
2011-11-30
*版本:
1.0
/*******************************************/
voidinti()
{
WDT=0x3f;
//喂狗,8.3886S溢出
TMOD=0x11;
//定时器T0工作在模式1-16位计数器
TL0=T0MS;
//定时器T0赋初值
TH0=T0MS>
>
8;
TR0=1;
//定时器T0启动
ET0=1;
//定时器T0中断允许
EA=1;
//总中断允许
PT0=1;
//定时器T0高中断优先级
ajkongzhi1=0;
//按键调制信号1初始化
ajkongzhi2=0;
//按键调制信号2初始化
P4SW=0x70;
//P4口功能初始化
P0M0=0xff;
//P0口输出模式初始化
P0M1=0x00;
P1M0=0xff;
//P1口输出模式初始化
P1M1=0x00;
P2M0=0xff;
//P2口输出模式初始化
P2M1=0x00;
power=0;
//上电时处于待机状态
AUXR=0X81;
//ALE禁止输出,定时器T0计数加速,对晶振频率不分频计数
speaker=0;
//蜂鸣器状态初始化
jishi11=1000;
//蜂鸣器上电鸣响1S}
/********************************************
main
主程序
先对系统初始化,然后等待
init();
/*********************************************/
voidmain()
inti();
//初始化子函数
WDT=0x3f;
//喂狗,8.3886S溢出
while
(1)//等待
{
}
/*****************************************
timer0
定时中断T0子函数
按1ms为时间单位进行动作,使单片机程序运行的每一步都在准确的控制之下
*备注:
每次中断均为1ms,精确至0.1us
/***************************************/
voidtimer0()interrupt1using1//定时器T0
WDT=0x3f;
//喂狗,8.3886S溢出
//定时器T0赋初值
TH0=T0MS>
TR0=1;
//定时器T0启动if(jishi11>
0)//蜂鸣器鸣响控制
{
jishi11--;
speaker=1;
}
else
speaker=0;
if(aj1==ajkongzhi2)//复位/开关按键
if(jishi1<
200)//200ms反应
jishi1++;
else
{
jishi11=200;
//蜂鸣器鸣响200ms
jishi1=0;
if(flag2==0)
flag2=1;
//电机转动
else
flag2=0;
//电机停转
}
if(jishi5<
200)
jishi5++;
elseif(jishi5<
1000)//2S反应-待机模式与开机模式转换
{
//蜂鸣器鸣响200ms
}
jishi11=200;
jishi5=0;
if(power==0)
power=1;
//系统开机运行
else
power=0;
//系统待机
}
{
jishi1=0;
jishi5=0;
if(power==0)//待机模式
sd_led=1;
//led待机
ds_led=1;
fz_led=1;
zz_led=1;
P0=0;
//数码管待机
weizhi=1;
w1=w2=w3=w4=0;
ST=1;
//线圈待机
flag=0;
//状态标志
flag2=0;
//电机待机
jishi22=500;
jishi32=500;
xianchang=9999;
//开机显示画面
elseif(power==1)//正常工作模式
{
if(flag==0)
if(jishi6<
500)//开机时数码管显示控制
jishi6++;
else
jishi6=0;
if(xianchang>
0)
{
xianchang=xianchang-1111;
//开机时线长依次递减1111
sd_led=~sd_led;
//led闪动
ds_led=~ds_led;
fz_led=~fz_led;
zz_led=~fz_led;
}
else
flag=1;
xianchang=1000;
//开机默认切线长度为10.00m
sd_led=1;
ds_led=1;
fz_led=1;
zz_led=1;
qianwei=(xianchang%10000)/1000;
//显示数字十位的运算
baiwei=(xianchang%1000)/100;
//显示数字个位的运算
shiwei=(xianchang%100)/10;
//显示数字0.1位的运算
gewei=xianchang%10;
//显示数字0.01位的运算
if(qianwei==0)//当十位为0时,数码管不显示
qianwei=10;
switch(weizhi)//数码管显示控制
case1:
{//数码管十位显示
P0=shuzi[qianwei];
w1=1;
w2=w3=w4=0;
break;
}
case2:
{//数码管个位显示
P0=shuzi[baiwei];
dp=1;
w2=1;
w1=w3=w4=0;
break;
}
case3:
{//数码管0.1位显示
P0=shuzi[shiwei];
w3=1;
w2=w1=w4=0;
case4:
{//数码管0.01位显示
P0=shuzi[gewei];
w4=1;
w2=w3=w1=0;
default:
weizhi=0;
weizhi++;
//显示位置切换
DC11=1;
//电机控制信号输出
DC12=0;
DC21=1;
DC22=0;
if(flag2==1)//电机转动状态
if(xianchang>
0)//当设定线长未达到时,
ST=0;
//电机转动
ST=1;
//电机停转
//电机不转
if(aj2==ajkongzhi1)//增加按键
if(jishi2<
jishi22)//消抖时间500ms
jishi2++;
{
jishi11=100;
//蜂鸣器响0.1S
sd_led=0;
//加按键指示灯点亮
ds_led=1;
fz_led=1;
zz_led=1;
jishi2=0;
if(jishi22>
49)
jishi22=jishi22-25;
//持续按键时加速
if(xianchang<
0)//线长所处范围不同时,按键权重不同
xianchang=0;
elseif(xianchang<
10)
xianchang++;
9900)
xianchang=xianchang+100;
9990)
xianchang=xianchang+10;
9999)
xianchang=9999;
//超出最大值,不再增加
jishi2=0;
if(aj3==ajkongzhi1)//减少按键
if(jishi3<
jishi32)//消抖时间500ms
jishi3++;
{
//蜂鸣器响0.1S
ds_led=0;
//减按键指示灯点亮
fz_led=1;
zz_led=1;
jishi3=0;
if(jishi32>
jishi32=jishi32-25;
if(xianchang>
9999)//线长所处范围不同时,按键权重不同
elseif(xianchang>
xianchang--;
xianchang=xianchang-10;
xianchang--