izhonguo 发表于 2019-4-2 19:36 去掉24v电源,就用板上的12V电源引到继电器,串一个小功率负载试试。我经常用继电器控制220V电源,都没出现过这样的问题。 |
ysandi 发表于 2019-4-2 15:55 而且板子我买了三家不同的,都是这个问题,可以复现。我这周一尝试了直接用HC595的芯片插面包板上,自己将输出的八个引脚接到一组带光耦分离的继电器板子上,不过我现在还没有能把595面包板上对应的引脚电压给输出正确,程序还是同样的程序,但是烧入单片机之后输出到芯片上拿万用表量并不能实现我控制的引脚高低电平。 我用的是P3^4,P3^5,P3^6,P3^7这几个IO口,但是没有接上拉下拉电阻。 |
zl2168 发表于 2019-4-1 21:13 不应该是驱动力不足啊,我看他这个板子上595的输出端口是直接接在了另一块驱动芯片LN2803上,单独一组12V的直流电源驱动的。请看我12楼的电路图。 |
笨笨兔 发表于 2019-4-2 14:40 二极管我买了1A/50V的整流二极管, 但是继电器线圈怎么加方向二极管啊?这个是直接封装好的继电器,只有外部三个端口,共同端COM, 常闭端NC, 常开端NO。是说把NO和COM两个端口加反向二极管?可是这两个端子无所谓正负啊,我就是导通了负载的正极电源线而已,应该没有正反级的说法吧。。负载端我倒是可以试验一下反接二极管,但是还没有收到。。。 |
你不接24V会正常,说明程序没问题。我估计问题是出在继电器这块板上。你仔细找一找,你接入24V电源的接口是否与电路板的其他地方有相连(比如电路板的正极)。 |
给继电器线圈加反向二极管吧? 看起来你的负载不是感性负载。。。。。。 |
595驱动力不足 |
izhonguo 发表于 2019-4-1 10:29 这段程序改这样才合理些。
|
wc86110 发表于 2019-3-29 12:48 不是。。独立电源是从220V直接降压到24V的一组电源,控制继电器板子的12V电源也是从220V直接降到12V的一组电源,两个是完全独立的。。只不过都是从插排上接的市电。二极管我买了1A/50V的整流二极管,还没有收到。收到后,我也试试增加是否能排除干扰。谢谢! |
wulin 发表于 2019-3-29 11:20 嗯嗯,上周按照您的指点,在网上买了排除干扰的一些硬件,但是还没有收到。所以想试试其他的方法是否可以解决。控制单片机的代码现在简化之后,如果通过串口发送数据到单片机执行相应的继电器闭合的话,外部24V接在继电器的外部端子上,竟然没有问题。但是如果直接把数据写死在程序里,就会出现控制的问题。即使发送的是同样的数据。写死在程序里的数据如果要实现两组隔段时间输出的话,中间要加一个延时函数,有没有可能是延时函数导致的单片机输出0/1,从而引起的继电器不受控? /*----------------------------------------------- 工程名: STC操作74HC595级联 控制继电器程序 -----------------------------------------------*/ #include <reg51.H> #define uint unsigned int #define uchar unsigned char uint status[5]={00}; //测试程序模式选择 uchar table0[] ="OK\n"; //用于串口助手返回验证 uchar table1[]="ERROR\n";//用于串口助手返回验证 bit flag=0; uint rnum=5; /*----------------------------------------------- STC单片机 硬件设备引脚定义如下 -----------------------------------------------*/ sbit OE = P3^4; //使能线 sbit SCK = P3^6; //时钟线 sbit RCK = P3^7; //锁存线 sbit DATA = P3^5; //数据线 sbit POWER = P0^0; //闭合模块总电源继电器,模块通电 sbit RPOWER = P0^1; //闭合模块总电源继电器,模块通电 /*----------------------------------------------- 全部变量函数定义 -----------------------------------------------*/ /*----------------------------------------------- 函数名:初始化程序 -----------------------------------------------*/ /*******************串口初始化函数*************************/ void URATinit() { PCON &= 0x7F; //波特率不倍速9600 SCON = 0x50; //8位数据,可变波特率 TMOD= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 EA = 1; //开总中断 ES = 1; //开串口中断 } /**********串口发送函数**************/ void SendOneByte(uchar i) { SBUF = i; //发送数据 while(!TI); //等待发送完成 TI = 0; //发送中断请求标志位清0 } /*----------------------------------------------- 函数名:single 74HC595写入字节函数 -----------------------------------------------*/ void SEND_HC595(uchar dat) { uchar i; for(i=0;i<8;i++) { dat <<= 1; DATA = CY; //溢出位赋值数据输出端 SCK = 1; //移位时钟 SCK = 0; } } /*----------------------------------------------- 函数名:74HC595写入字节函数 -----------------------------------------------*/ void HC595() { uchar i,j; if(flag==1) { for(i=0;i<3;i++) { SendOneByte(table0);//返回PC "OK"(用串口助手文本模式接收) } } ES=0; for(j=0;j<rnum;j++) { SEND_HC595(status[j]); } RCK=1; OE=0; RCK=0; ES=1; flag=0; } /*----------------------------------------------- 函数名:main 主函数 -----------------------------------------------*/ void main(void) { POWER = 1; //闭合模块总电源继电器,模块通电 RPOWER = 1; //闭合电磁铁模块总电源继电器,模块通电 OE=1; SCK = 0; //初始化移位时钟端 RCK = 0; //初始化锁存输出端 URATinit(); //初始化串口 while(1) { HC595(); } } /*----------------------------------------------- 函数名:中断函数 -------------------------------------------------*/ void receive() interrupt 4 { static uchar i=0; //静态计数变量 RI=0; //接收中断请求标志位清0 status=SBUF; //接收到的数据串保存在模式选择中 if(status[0]==0xAA) { i++; if(i>=rnum) { flag=1; i=0; //计数变量清0 } } } |
izhonguo 发表于 2019-3-29 09:50 楼主所谓的独立电源是不是使用同一个电源引出的不同电压?尤其用的是开关电源驱动大负载对整个电路的稳定性影响肯定不小 是在继电器两端并接二极管 |
izhonguo 发表于 2019-3-29 09:50 你既然已经明确的知道干扰源来自继电器触点火花,为什么不在此处设法解决?其它方法都是隔靴搔痒。 |
按沙发的指点做。 |
wulin 发表于 2019-3-26 09:03 强烈感谢wulin总工您的回复,您说的好多名词我得先搜搜看怎么做。新手入行,要学习的太多了。 真的十分感谢您的耐心指点! ![]() |
笨笨兔 发表于 2019-3-26 08:54 一个负载大概也就是几百mA的电流,不通过继电器用直流的24V正负极直接接负载端没有问题,而且电源功率很足,计算过即使所有板子的继电器同时开也不可满足电流需求。电路我得画一下,刚接触硬件这行业,好多工具还没有。谢谢! |
首先要找干扰源,从你表述的现象看是继电器触点开关产生的火花干扰(直流电尤甚)。这种干扰的频谱范围很宽,独立DC电源并不能消除空间辐射干扰。建议:1.在继电器动、静触点间加装阻容吸收电路。2.MCU与74HC595的信号线及信号地线加共模磁环(信号线及信号地线成对),尽量缩短74HC595之间联级信号线及信号地线加共模磁环。3.降低信号传输阻抗(MCU的IO口设为强推挽,信号线与地之间跨接1K电阻)。4.改为光耦隔离,MOS管代替继电器。 |
控制几十个继电器都无问题,估计是你的电路有瑕疵,上电路吧! 再个:你的继电器接的什么负载? |
wc86110 发表于 2019-3-25 23:29 接线很简单,所有驱动继电器的12伏电源是独立一组,然后该12伏电源通过板子上的芯片降压然后驱动芯片的vcc,外接继电器的24V也是独立的一组电源。 光电隔离措施是指驱动继电器和hc595芯片之间吗?这个板子是买的现成的,问了老板,他说不需要啊。 |
7358655 发表于 2019-3-25 22:27 继电器买的是封装好的,就是一块595的芯片外加一块驱动继电器的芯片,没有光耦。所以封装好的继电器应该是有反接二极管吧。我看看型号,再查一下。谢谢! |
上视频不如上电路图。考究的电路都使用独立电源,并采用光电隔离措施避免干扰,视频都没看到这些 |
4个级联的情况也试验了,程序里循环写两组数据,第一组发0xff,0x00,0x00,0xff,然后延时几秒后,第二组数据0x00,0xff,0xff,0x00。 在继电器外部的24VDC电源没有接上的情况下,继电器按照程序设计的进行吸合。视频见https://v.youku.com/v_show/id_XNDEwNTQzODAzNg==.html?spm=a2hzp.8244740.0.0 一旦外部24V直流电源接通,其实就是把正极从继电器的共同端吸合至常开端,接通24V电源控制其他设备。就会出现程序初始化就继电器全部吸合的状态,然后感觉是到了延时函数的时候继电器疯狂的吸合,感觉像是延时函数中的循环在不停的往HC595的DS端写入0和1导致。视频见:https://v.youku.com/v_show/id_XNDEwNTQzOTU5Ng==.html?spm=a2hzp.8244740.0.0 这一周都在反复改代码重新接线调整,但是一直失败。。。是一直失败。。。查了网上说的继电器在断在的时候线圈会产生反向电动势, 关键问题是程序初始化烧入单片机后,都没有断开的步骤直接就全部吸合了。 百思不得其解。望大家指点一二。谢谢! |
你把接负载后变化频率调低点,或者说把继电器打开关闭时间给长点,再检查你电路继电器线圈上反接有二极管没,这两个建议足以解决你的问题。 |