找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4019|回复: 8
打印 上一主题 下一主题
收起左侧

单片机控制光电开关异常,仿真没有这种情况

[复制链接]
跳转到指定楼层
楼主
ID:676703 发表于 2020-6-27 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
制作光电计数器,仿真和实物都一步步摸索过来... 又有想不明白的地方,请做过或者了解的朋友能指导或者分享一下经验、看法,谢谢大家!!
采用槽型光耦,当计数是十的整数倍时,连接单片机的led报警闪烁2s,  下方还有两个led的模块是光电转换模块,一个led作电源指示(绿色),另一个作开关指示(红色)。仿真图如图1,视频是实物操作。
问题: 1、感觉当物体经过光电开关时,数码管显示的计数值和物体的速度有关,速度快计数跳变少,速度慢计数很多!但仿真时不是这样的啊。光电计数模块的输出作为外部中断的输入。
2、当物体经过速度变慢时,感觉物体进入和出来,数码管会产生两次跳变!不应该啊。。。
已经检查过实际电路,感觉没有问题,应该是代码的问题?但是本人小白一个,而且仿真也没有问题,现在很迷茫。。

代码:
#include<AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
uchar duan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码
uchar wei[2]={0X01,0X02}; //位的控制端
uint c,v,date; //定义数据类型
uint dispcount=0;

sbit led=P1^4;         //定义P1.4口是led
/*****延时函数*****/
void delay(uchar t)
{
        uchar i,j;
        for(i=0;i<t;i++)
                for(j=13;j>0;j--);
}
/*****数码管动态扫描*****/
void xianshi()
{
/***数据转换***/
        c=date/10;  //求十位
        v=date%10;      //求个位
        P2=wei[0];
        P0=duan[c];
        delay(20);
        P2=wei[1];
        P0=duan[v];
        delay(20);
}
/*****中断函数*****/
void ExtInt0() interrupt 0   //中断服务程序
{
        dispcount++;        //外部中断一次,计数加一
        if(dispcount>99)   //计数范围0~50
                dispcount=1;
}

/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能                   : 定时器0初始化
*******************************************************************************/
void Timer0Init()
{
        TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。
        TH0=0XFC;   //给定时器高八位赋初值,定时1ms
        TL0=0X18;        
        ET0=1;      //打开定时器0中断允许
        EA=1;       //打开中断总开关
        TR0=1;      //打开定时器0                        
}
/*****主函数*****/
void main()
{
//        static u16 i;
        TCON=0x01;     //中断设置 TCON寄存器
        IE|=0x81;       //IE外部中断0请求标志位
        Timer0Init();  //定时器0初始化
        while(1)
        {
                date=dispcount;
                xianshi();           //调用数码管显示   
        }
}
/*******************************************************************************
* 函 数 名         : void Timer0() interrupt 1
* 函数功能                   : 定时器1中断函数
*******************************************************************************/
void Timer0() interrupt 1
{
        static u16 i;
        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0X18;
        if(dispcount%10==0&&dispcount!=0)      
        {
                i++;
                if(i%100==0)       //100ms
                        led=~led;
                if(i>=2000)       //时间大于2s
                {
                        i=2000;
                        led=1;
                }
        }
        else
        {
                led=1;   
                i=0;
        }
}


51hei图片20200627101759.png (36.74 KB, 下载次数: 52)

51hei图片20200627101759.png

VID_20200627100049.rar

11.66 MB, 下载次数: 3

实物检验(视频不大)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:332444 发表于 2020-6-27 23:44 | 只看该作者
1发光管通常导通电压是硅三极管结电压的2倍,这样比较好记,即:0.6-0.7*2=1.2-1.4,供电若使用5V则5-1.3=3.7V,发光管通常选的电流在10毫安,那么,计算电阻=3.7/10=0.37K;
2接收端三极管电流按1:1计算即发光管电流多少三极管电流也多少,计算电阻=5V/10毫安=0.5K;
3仿真软件其实可以粗略帮助确定电路参数的验证。
4弄个仿真电路,放置信号源电压5V,用示波器观察817输入与输出波形。

从图上波形看,基本符合粗略计算的值,同时也可看出,电压的幅值可以直接送去IO用,不需要再次征信处理。
5光耦817是封闭型的,槽型的基本也差不多,甚至可能需要更大的发光管电流,比如50毫安也未可知,因此,实际电路用可调电阻调节。
6小的发光管电流经过开环放大整形,开环放大倍数极高,极大可能出现干扰波形被认为是计数波形,因而极有可能出现不稳定现象。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:319023 发表于 2020-6-27 11:55 | 只看该作者
有没看光电模块的规格书,  会不会 和光电模块有关呢 ? 或者需要类似软件去抖动的功能
回复

使用道具 举报

地板
ID:94031 发表于 2020-6-27 14:17 | 只看该作者
慢时会有一个不稳定阶段,造成多计数,要消除加施密特触发。
回复

使用道具 举报

5#
ID:332444 发表于 2020-6-27 23:47 | 只看该作者
因此说图中设计参数存在问题,至少放大器应该有控制增益的负反馈回路,而不是开环放大。
回复

使用道具 举报

6#
ID:213173 发表于 2020-6-28 07:32 | 只看该作者
楼主的程序没有严重问题,估计问题在自制的光电模块。按下图修改,在不接正反馈电阻的情况下调整电位器找到合适的比较电位,再接上正反馈电阻,这样LM393比较器就具有施密特特性,可以有效改善可靠性。反馈电阻选择范围100KΩ~2.2MΩ。


回复

使用道具 举报

7#
ID:332444 发表于 2020-6-28 09:32 | 只看该作者
先看一个演示,接着分析软件部分。

回复

使用道具 举报

8#
ID:676703 发表于 2020-7-1 16:35 | 只看该作者
xianfajushi 发表于 2020-6-27 23:44
1发光管通常导通电压是硅三极管结电压的2倍,这样比较好记,即:0.6-0.7*2=1.2-1.4,供电若使用5V则5-1.3=3 ...

解释很有助于我理解,现在问题已解决,谢谢!
回复

使用道具 举报

9#
ID:676703 发表于 2020-7-1 16:37 | 只看该作者
wulin 发表于 2020-6-28 07:32
楼主的程序没有严重问题,估计问题在自制的光电模块。按下图修改,在不接正反馈电阻的情况下调整电位器找到 ...

之前考虑不细致,现在用了可调电阻,已经实现预期需求。谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表