zoukankan      html  css  js  c++  java
  • 接近开关,光耦

    型号:中国沪工集团  LJ18A3-8-Z/CX   (四线制   NPN  常开-常闭)

    目的:将接近开关的信号赋给蜂鸣器,但是接近开关一般接24VDC,假如有高电平的输出,那么不能直接接到FPGA引脚或者单片机的IO口上,我知道的有两种方法:

    方法一:光电隔离

               我这里采用的是TLP-521-4

               电路图如下:

               

    方法二:http://bbs.21ic.com/icview-167011-1-1.html

    joyme的话:(自己去理解)

    段落一:没有必要那么复杂,传感器信号无非是高电平或低电平,所以检测时只考虑把IO拉低就好,高电平阻止进入MCU
    如果NPN是OC(集电极开路输出)则直接接到MCU IO口,IO口上拉一个电阻就好了
    如果NPN输出不是OC,接一个二极管阻止24V串入MCU就好

    段落二:有什么干扰?为什么24V对单片机会毁灭性打击?

    1、接近开关既没有大电流、高电压,又没有高频切换,何来你说的那么严重的干扰?

    2、24V是接近开关的电源,你也不会傻到直接把24V连到单片机上吧

    我前面的帖子说了,接近开关多数为OC输出,即只会拉低,不会主动输出高电平(估计也是考虑设计兼容性),所以只需加上拉电阻到单片机电源就可以把信号直接接MCU的IO口
    即使不是OC输出,高电平是24V,也可以用我说的另一种方式加一个二极管阻止高电平到IO口就搞定了

    FPGA程序(很简单):

    `timescale 1ns/1ns
    module clk_ctrl(clk,rst_n,clk_out,signal_in,signal_out);
    input clk;//50MHZ,T=20ns
    input rst_n;
    input signal_in;
    output clk_out;
    output signal_out;

    reg clk_out_reg;//T=2*(50000*20)=2000000ns,即500HZ
    reg[15:0] cnt;
    reg signal_out;
    reg signal_reg;

    always@(posedge clk or negedge rst_n)
    begin
    if(!rst_n)
    begin
    cnt <= 16'b0;
    end
    else
    if(cnt == 16'b1100_0011_0101_0000)
    cnt <= 16'b0;
    else
    cnt <= cnt + 1'b1;
    end

    always@(posedge clk or negedge rst_n)
    begin
    if(!rst_n)
    begin
    clk_out_reg <= 1'b0;
    end
    else if(cnt == 16'b1100_0011_0101_0000)
    begin
    clk_out_reg <= ~clk_out_reg;
    end
    end

    assign clk_out = clk_out_reg;

    always@(posedge clk or negedge rst_n)
    begin
    signal_reg = signal_in;
    signal_out = signal_reg;
    end

    endmodule

    其中:signal_in是信号输入(黑色线),signal_out绑定蜂鸣器的引脚。

    关于NPN接近开关的简单介绍:

    PNP与NPN型传感器根本的区别在哪?

    PNP与NPN型传感器其实就是利用三极管的饱和和截止,输出两种状态,属于开关型传感器。但输出信号是截然相反的,即高电平和低电平。NPN输出是低电平0,PNP输出的是高电平1。

       

        PNP与NPN型传感器(开关型)分为六类:

        1、NPN-NO(常开型)

        2、NPN-NC(常闭型)

        3、NPN-NC+NO(常开、常闭共有型)

        4、PNP-NO(常开型)

        5、PNP-NC(常闭型)

        6、PNP-NC+NO(常开、常闭共有型)

        PNP与NPN型传感器一般有三条引出线,即电源线VCC、0V线,out信号输出线。

        1、PNP类

        PNP是指当有信号触发时,信号输出线out和电源线VCC连接,相当于输出高电平的电源线。

        对于PNP-NO型,在没有信号触发时,输出线是悬空的,就是VCC电源线和out线断开。有信号触发时,发出与VCC电源线相同的电压,也就是out线和电源线VCC连接,输出高电平VCC。

        对于PNP-NC型,在没有信号触发时,发出与VCC电源线相同的电压,也就是out线和电源线VCC连接,输出高电平VCC。当有信号触发后,输出线是悬空的,就是VCC电源线和out线断开。

        对于PNP-NC+NO型,其实就是多出一个输出线OUT,根据需要取舍。

        2、NPN类

        NPN是指当有信号触发时,信号输出线out和0v线连接,相当于输出低电平,ov。

        对于NPN-NO型,在没有信号触发时,输出线是悬空的,就是0v线和out线断开。有信号触发时,发出与OV相同的电压,也就是out线和0V线连接,输出输出低电平OV。

        对于NPN-NC型,在没有信号触发时,发出与0V线相同的电压,也就是out线和0V线连接,输出低电平0V。当有信号触发后,输出线是悬空的,就是0V线和out线断开。

        对于NPN-NC+NO型,和NPN-NC+NO型类似,多出一个输出线OUT,及两条信号反相的输出线,根据需要取舍。

    集电极开路输出的结构OC门(理解)

    我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。对于图1,当左端的输入为“0”时,前面的三极管截止(即集电极C跟发射极E之间相当于断开),所以5V电源通过1K电阻加到右边的三极管上,右边的三极管导通(即相当于一个开关闭合);当左端的输入为“1”时,前面的三极管导通,而后面的三极管截止(相当于开关断开)。

    我们将图1简化成图2的样子。图2中的开关受软件控制,“1”时断开,“0”时闭合。很明显可以看出,当开关闭合时,输出直接接地,所以输出电平为0。而当开关断开时,则输出端悬空了,即高阻态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端的电平就被这个负载拉到低电平了,所以这个电路是不能输出高电平的。

    再看图三。图三中那个1K的电阻即是上拉电阻。如果开关闭合,则有电流从1K电阻及开关上流过,但由于开关闭和时电阻为0(方便我们的讨论,实际情况中开关电阻不为0,另外对于三极管还存在饱和压降),所以在开关上的电压为0,即输出电平为0。如果开关断开,则由于开关电阻为无穷大(同上,不考虑实际中的漏电流),所以流过的电流为0,因此在1K电阻上的压降也为0,所以输出端的电压就是5V了,这样就能输出高电平了。但是这个输出的内阻是比较大的(即1KΩ),如果接一个电阻为R的负载,通过分压计算,就可以算得最后的输出电压为5*R/(R+1000)伏,即5/(1+1000/R)伏。所以,如果要达到一定的电压的话,R就不能太小。如果R真的太小,而导致输出电压不够的话,那我们只有通过减小那个1K的上拉电阻来增加驱动能力。但是,上拉电阻又不能取得太小,因为当开关闭合时,将产生电流,由于开关能流过的电流是有限的,因此限制了上拉电阻的取值,另外还需要考虑到,当输出低电平时,负载可能还会给提供一部分电流从开关流过,因此要综合这些电流考虑来选择合适的上拉电阻。

    如果我们将一个读数据用的输入端接在输出端,这样就是一个IO口了(51的IO口就是这样的结构,其中P0口内部不带上拉,而其它三个口带内部上拉),当我们要使用输入功能时,只要将输出口设置为1即可,这样就相当于那个开关断开,而对于P0口来说,就是高阻态了。

    对于漏极开路(OD)输出,跟集电极开路输出是十分类似的。将上面的三极管换成场效应管即可。这样集电极就变成了漏极,OC就变成了OD,原理分析是一样的。

    另一种输出结构是推挽输出。推挽输出的结构就是把上面的上拉电阻也换成一个开关,当要输出高电平时,上面的开关通,下面的开关断;而要输出低电平时,则刚好相反。比起OC或者OD来说,这样的推挽结构高、低电平驱动能力都很强。如果两个输出不同电平的输出口接在一起的话,就会产生很大的电流,有可能将输出口烧坏。而上面说的OC或OD输出则不会有这样的情况,因为上拉电阻提供的电流比较小。如果是推挽输出的要设置为高阻态时,则两个开关必须同时断开(或者在输出口上使用一个传输门),这样可作为输入状态,AVR单片机的一些IO口就是这种结构。

    试验图片如下:

       

  • 相关阅读:
    BadUSB 利用
    java 将函数作为参数传递
    odoo12 修行提升篇之 常用的高阶函数 (二)
    odoo12 修行提升篇之 异步定时任务 (一)
    odoo12 修行基础篇之 利用kanban做分析 点击跳转分析模型列表 (九)
    odoo12 修行基础篇之 kanban (八)
    odoo12 修行基础篇之 记录批处理 (七)
    odoo12 修行基础篇之 列表的筛选和分组 (六)
    odoo12 修行基础篇之 添加记录编码 (五)
    odoo12 修行基础篇之 添加工作流和操作记录 (四)
  • 原文地址:https://www.cnblogs.com/chasing/p/3647346.html
Copyright © 2011-2022 走看看