光电米测试电路设计报告

光电米测试仪

课程设计说明书

专业:电子信息技术     班级:         

姓名:                 学号:          

组别:             指导教师: 李天超

日期:2011年9月2号    设计序号№:01

考勤   报告成绩   调试成绩   奖励成绩   总成绩

指导教师签名:     日期:

1概述

光电米测试仪是一种有效的测量电线、电缆长度的新型设备,它能在电线、电缆的生产线和复绕状态下对电线、电缆进行有效的长度测量和定长控制,从而实现电线、电缆的高精度测量和控制。光电米测试仪作为一种有效的高精度的计量仪表,已经广泛的应用于电线、电缆,纺织,影印,印染,皮革绸缎,布匹,钢材,塑料薄膜,地毯制作等行业,是一种适合与现代工业生产的新型测量设备。

2系统电路设计

2.1原理框图(行为、结构描述设计)

      

                        图1 光电米测试仪原理框图

   系统设计思路是开关机按钮、增加、减少、单位长度光电传感器采用反射式光电开关电路,为了提高光电开关对环境杂散光的抗干扰性能,利用调制技术对光电开关电路的电源进行500Hz频率调制,使得这些电路工作时的状态受到功能信号和调制信号的二维约束,实现功能电路性能的唯一性的同时,又提高了它的抗干扰能力和实用性;500Hz调制信号由单片机提供,工作时,功能信号传送给单片机,它根据增加和减少的预置测试长度进行数字显示,并驱动吐线电机转动吐线,数字显示数字开始递减,当吐线长度等于原预置长度时,吐线电机停转,单片机输出信号驱动电剪剪断线体,同时发出“嘟嘟”声告知完成。

2.2 电路设计(物理描述设计)

2.2.1 系统电源电路设计

A) 行为结构描述设计

   电源原理框图

          

                       图2 电源电路原理框图

B)电源电路原理图                                  

                   

图3 AC/DC电源电路原理图

   电源电路设计根据系统电路正常工作所需的额定电源电压分析后进行优化进行分析可知,CPU电源和周边电路采用5VDC电流300mADC,负载电源采用24VDC/300mA,根据以上分析,选用AC/DC电源模块LH20-10D0524-03 ,特点是220V/50Hz供电,两路直流输出5VDC/24VDC,若该产品采用直流24CDC供电时可选择两套方案,其电源电路可选择DC/DC电源模块PWB4805LT-1W5;电路原理图如图4。

图4 24VDC供电电路原理图

2.2.2 功能按键控制电路

                    

图                  图5功能按键控制电路原理图

   图中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

环  境:编译环境为keilC Uv2

硬  件:STC12C5A56S2单片机,LV8731V电机驱动芯片,四位一体数码管,电磁式有源蜂鸣器,LED指示灯,反射式光电耦合器(按键)

功  能:通过按键设定所需要的线长(精确至0.1m),启动电机或者手动卷线,对卷线长度进行计数,当到达设定长度时(精确至0.01m)电机停转,  

日  期:20##年11月30日

备  注:

设计者:李琳

*******************************************/

#include<intrins.h>                        //包含汇编指令文件

#include<reg52.h>                          //包含型号头文件

#define FOSC 12000000L                     // 声明晶振频率

#define T0MS (65536-FOSC/1000+14)       //1ms计时初始值

sfr AUXR=0x8E;                              //单片机特殊功能寄存器

sfr P4=0xc0;                                //声明P4口的位置

sfr P4SW=0xBB;                             //声明P4口控制寄存器

sfr P0M0=0x94;                       //声明P0口模式配置寄存器0

sfr P0M1=0x93;                       //声明P0口模式配置寄存器1

sfr P1M0=0x92;                       //声明P1口模式配置寄存器0

sfr P1M1=0x91;                       //声明P1口模式配置寄存器1

sfr P2M0=0x96;                       //声明P2口模式配置寄存器0

sfr P2M1=0x95;                       //声明P3口模式配置寄存器1

sbit sd_led=P1^6;                         //加按键指示灯

sbit ds_led=P1^5;                    //减按键指示灯

sbit speaker=P1^4;                        //蜂鸣器控制输出端,为1时鸣响,为0时不响

sbit ajkongzhi2=P1^3;                    //开关机按键调制信号

sbit ajkongzhi1=P1^2;                    //其它按键调制信号

sbit fz_led=P1^1;                         //计数指示灯-红

sbit zz_led=P1^0;                         //计数指示灯-黄

sbit w1=P4^4;                              //声明数码管位选管脚1

sbit w2=P2^7;                              //声明数码管位选管脚2

sbit w3=P2^6;                              //声明数码管位选管脚3

sbit w4=P2^5;                             //声明数码管位选管脚4

sbit dp=P0^7;                             //声明小数点控制位

sbit aj1=P3^3;                           //声明按键1所对应的管脚

sbit aj2=P4^2;                           //声明按键2所对应的管脚

sbit aj3=P3^2;                           //声明按键3所对应的管脚

sbit aj4=P4^3;                           //声明按键4所对应的管脚

sbit ST=P2^0;                             //电机待机/工作控制脚

sbit DC11=P2^1;                          //电机控制信号

sbit DC12=P2^2;                          //电机控制信号

sbit DC21=P2^3;                          //电机控制信号

sbit DC22=P2^4;                           //电机控制信号

bit power;                       //电源状态标志,为0时为待机状态,为1时为工作状态         

unsigned char shuzi[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; 

//常用数字所对应的数值(0-9) 0x00为数码管不亮    

unsigned char qianwei,baiwei,shiwei,gewei;   //显示数位千、百、十、个

unsigned char  flag,flag2,flag3; 

//flag为0时表示为power=0状态,为1时表示为power=1状态

//flag2为电机转动标志,为1时开始转动,为0时不转动      

      //flag3为0时计数键锁定,为1时计数键解锁                   

unsigned int jishi1,jishi2,jishi3,jishi4,jishi5,jishi6,jishi11,jishi22,jishi32;           

//jishi1-4为按键1-4调制信号计数 ,                    

//jishi5为开关机按键时间计时,jishi6为500毫秒计时位

//jishi11为蜂鸣器鸣响时间计时                            

//jishi22为增加键加速计时,jishi32为减少键加速计时

unsigned char weizhi;            //数码管位选标志

unsigned int xianchang;         //线长计数,单位0.01m

sfr WDT=0xC1;                                  //声明看门狗寄存器

/*******************************************

* 函 数 名: init

* 功能描述: 系统初始化程序

* 函数说明: 对端口和定时器进行初始化

* 调用函数: 无

* 全局变量: 无

* 输    入: 无

* 返    回: 无

* 设 计 者: 李琳  日期: 20##-11-30

* 版    本: 1.0

/*******************************************/

void inti()

{

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();

* 全局变量:

* 输    入:  无

* 返    回:  无

* 设 计 者: 李琳  日期: 20##-11-30

* 版    本:   1.0

/*********************************************/

void main()

   inti();                              //初始化子函数

  WDT=0x3f;                           //喂狗,8.3886S溢出

   while(1)                           //等待

   {

  }

}

/*****************************************

* 函 数 名: timer0

* 功能描述: 定时中断T0子函数

* 函数说明: 按1ms为时间单位进行动作,使单片机程序运行的每一步都在准确的控制之下

* 调用函数: 无

* 全局变量: 无

* 输    入: 无

* 返    回: 无

* 设 计 者: 李琳  日期: 20##-11-30

* 备    注: 每次中断均为1ms,精确至0.1us

* 版    本: 1.0

/***************************************/      

void timer0() interrupt 1 using 1              //定时器T0

     WDT=0x3f;                                //喂狗,8.3886S溢出

    TL0=T0MS;                               //定时器T0赋初值

    TH0=T0MS>>8;

    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++;

         else if(jishi5<1000)                  //2S反应-待机模式与开机模式转换

            {

            jishi5++;

             jishi11=200;                    //蜂鸣器鸣响200ms          

            }

        else

            {

                 jishi11=200;                //蜂鸣器鸣响200ms

                jishi5=0;

                 if(power==0)

                     power=1;                //系统开机运行

                 else

                    power=0;                //系统待机

            }

       }

     else

       {

           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;                    //开机显示画面

       }

 else if(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)                    //数码管显示控制

             {

                      case 1:{               //数码管十位显示

                              P0=shuzi[qianwei];

                              w1=1;w2=w3=w4=0;

                              break;

                             }

                      case 2:{               //数码管个位显示

                               P0=shuzi[baiwei];

                                 dp=1;

                                  w2=1;w1=w3=w4=0;

                                  break;

                              }

                      case 3:{              //数码管0.1位显示

                               P0=shuzi[shiwei];

                                  w3=1;w2=w1=w4=0;

                                  break;

                              }

                      case 4:{              //数码管0.01位显示

                           P0=shuzi[gewei];

                              w4=1;w2=w3=w1=0;

                              break;

                              }

                      default: weizhi=0;

             }

                 weizhi++;                       //显示位置切换

                DC11=1;                         //电机控制信号输出

                 DC12=0;

                 DC21=1;

                 DC22=0;

         if(flag2==1)                            //电机转动状态

         {

             if(xianchang>0)                     //当设定线长未达到时,

             ST=0;                               //电机转动

             else

             ST=1;                               //电机停转

         }

         else

         ST=1;                                   //电机不转

         if(aj2==ajkongzhi1)                       //增加按键

              {

                  if(jishi2<jishi22)                //消抖时间500ms

                      jishi2++;

            else

             {  

                 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;

                 else if(xianchang<10)

                   xianchang++;

                 else if(xianchang<9900)

                   xianchang=xianchang+100;

                 else if(xianchang<9990)

                   xianchang=xianchang+10;

                 else if(xianchang<9999)

                   xianchang++;

                 else

                   xianchang=9999;           //超出最大值,不再增加

               }

         }

      else

         {

           jishi2=0;

           jishi22=500;

         }

          if(aj3==ajkongzhi1)                         //减少按键

              {

             if(jishi3<jishi32)                     //消抖时间500ms

                 jishi3++;

             else

               {

                        jishi11=100;                 //蜂鸣器响0.1S

                     sd_led=1;       

                     ds_led=0;                     //减按键指示灯点亮

                      fz_led=1;

                      zz_led=1;

                      jishi3=0;

                     if(jishi32>49)

                     jishi32=jishi32-25;           //持续按键时加速

      if(xianchang>9999)             //线长所处范围不同时,按键权重不同

                     xianchang=9999;

                     else if(xianchang>9990)

                     xianchang--;

                     else if(xianchang>10)

                     xianchang=xianchang-10;

                     else if(xianchang>0)

                     xianchang--;

                     else

                     xianchang=0;                  //超出最小值,不再减少                 }

           }

      else

         {

         jishi3=0;

         jishi32=500;

         }

        if((aj4==ajkongzhi1)&&(flag3==1))         //线长计数信号

         {

             if(jishi4<2)                               //2ms消抖

                 jishi4++;

             else

                 {

                 jishi11=50;                   //蜂鸣器响50ms                                          sd_led=1;       

                 ds_led=1;

                zz_led=~zz_led;               //线长计数指示灯交替显示

                fz_led=~zz_led;

                  jishi4=0;

                 flag3=0;                          //线长锁定

                 if(xianchang>1)

                 xianchang--;

                 else if(xianchang==1)

                 {

                 xianchang=0;

                 jishi11=1000;               //线长到位,蜂鸣器鸣响1S,提示

                 }

                 else

                 xianchang=0;

                  }

           }

       else if(aj4!=ajkongzhi1)

           {

           jishi4=0;

           flag3=1;                                 //线长解锁

           }

         ajkongzhi1=~ajkongzhi1;            //按键调制信号1

        }

         else

         power=0;

ajkongzhi2=~ajkongzhi2;                      //按键调制信号2

if(power==0)                                   //待机时,按键调制信号1关闭,节能

ajkongzhi1=0;

}

5 总结

参考文献:

1.李照青.单机原理与接口技术。北京航空航天大学出版社. 1999.3

2.马忠梅.单片机的C语言应用程序设计.北京航空航天大学出版社.2003.1.13.

3.张石.微控制器原理及接口技术实验教程.沈阳:学出版社.2004.1

1光电米测试仪元器件清单

附图:系统电路原理图

相关推荐