![]() |
發(fā)布時間: 2019-3-25 21:12
正文摘要:各位大神好,小弟用74HC595這個串入并出的芯片控制繼電器的吸合,但是繼電器的外部三個端子上沒有接任何電源的時候是可以正確按照我代碼的控制順序進行繼電器的吸合。視頻見https://v.youku.com/v_show/id_XNDExMDk2 ... |
izhonguo 發(fā)表于 2019-4-2 19:36 去掉24v電源,就用板上的12V電源引到繼電器,串一個小功率負載試試。我經常用繼電器控制220V電源,都沒出現(xiàn)過這樣的問題。 |
ysandi 發(fā)表于 2019-4-2 15:55 而且板子我買了三家不同的,都是這個問題,可以復現(xiàn)。我這周一嘗試了直接用HC595的芯片插面包板上,自己將輸出的八個引腳接到一組帶光耦分離的繼電器板子上,不過我現(xiàn)在還沒有能把595面包板上對應的引腳電壓給輸出正確,程序還是同樣的程序,但是燒入單片機之后輸出到芯片上拿萬用表量并不能實現(xiàn)我控制的引腳高低電平。 我用的是P3^4,P3^5,P3^6,P3^7這幾個IO口,但是沒有接上拉下拉電阻。 |
zl2168 發(fā)表于 2019-4-1 21:13 不應該是驅動力不足啊,我看他這個板子上595的輸出端口是直接接在了另一塊驅動芯片LN2803上,單獨一組12V的直流電源驅動的。請看我12樓的電路圖。 |
笨笨兔 發(fā)表于 2019-4-2 14:40 二極管我買了1A/50V的整流二極管, 但是繼電器線圈怎么加方向二極管?這個是直接封裝好的繼電器,只有外部三個端口,共同端COM, 常閉端NC, 常開端NO。是說把NO和COM兩個端口加反向二極管?可是這兩個端子無所謂正負啊,我就是導通了負載的正極電源線而已,應該沒有正反級的說法吧。。負載端我倒是可以試驗一下反接二極管,但是還沒有收到。。。 |
你不接24V會正常,說明程序沒問題。我估計問題是出在繼電器這塊板上。你仔細找一找,你接入24V電源的接口是否與電路板的其他地方有相連(比如電路板的正極)。 |
給繼電器線圈加反向二極管吧? 看起來你的負載不是感性負載。。。。。。 |
595驅動力不足 |
izhonguo 發(fā)表于 2019-4-1 10:29 這段程序改這樣才合理些。
|
wc86110 發(fā)表于 2019-3-29 12:48 不是。。獨立電源是從220V直接降壓到24V的一組電源,控制繼電器板子的12V電源也是從220V直接降到12V的一組電源,兩個是完全獨立的。。只不過都是從插排上接的市電。二極管我買了1A/50V的整流二極管,還沒有收到。收到后,我也試試增加是否能排除干擾。謝謝! |
wulin 發(fā)表于 2019-3-29 11:20 嗯嗯,上周按照您的指點,在網上買了排除干擾的一些硬件,但是還沒有收到。所以想試試其他的方法是否可以解決。控制單片機的代碼現(xiàn)在簡化之后,如果通過串口發(fā)送數(shù)據到單片機執(zhí)行相應的繼電器閉合的話,外部24V接在繼電器的外部端子上,竟然沒有問題。但是如果直接把數(shù)據寫死在程序里,就會出現(xiàn)控制的問題。即使發(fā)送的是同樣的數(shù)據。寫死在程序里的數(shù)據如果要實現(xiàn)兩組隔段時間輸出的話,中間要加一個延時函數(shù),有沒有可能是延時函數(shù)導致的單片機輸出0/1,從而引起的繼電器不受控? /*----------------------------------------------- 工程名: STC操作74HC595級聯(lián) 控制繼電器程序 -----------------------------------------------*/ #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; //數(shù)據線 sbit POWER = P0^0; //閉合模塊總電源繼電器,模塊通電 sbit RPOWER = P0^1; //閉合模塊總電源繼電器,模塊通電 /*----------------------------------------------- 全部變量函數(shù)定義 -----------------------------------------------*/ /*----------------------------------------------- 函數(shù)名:初始化程序 -----------------------------------------------*/ /*******************串口初始化函數(shù)*************************/ void URATinit() { PCON &= 0x7F; //波特率不倍速9600 SCON = 0x50; //8位數(shù)據,可變波特率 TMOD= 0x20; //設定定時器1為8位自動重裝方式 TL1 = 0xFD; //設定定時初值 TH1 = 0xFD; //設定定時器重裝值 ET1 = 0; //禁止定時器1中斷 TR1 = 1; //啟動定時器1 EA = 1; //開總中斷 ES = 1; //開串口中斷 } /**********串口發(fā)送函數(shù)**************/ void SendOneByte(uchar i) { SBUF = i; //發(fā)送數(shù)據 while(!TI); //等待發(fā)送完成 TI = 0; //發(fā)送中斷請求標志位清0 } /*----------------------------------------------- 函數(shù)名:single 74HC595寫入字節(jié)函數(shù) -----------------------------------------------*/ void SEND_HC595(uchar dat) { uchar i; for(i=0;i<8;i++) { dat <<= 1; DATA = CY; //溢出位賦值數(shù)據輸出端 SCK = 1; //移位時鐘 SCK = 0; } } /*----------------------------------------------- 函數(shù)名:74HC595寫入字節(jié)函數(shù) -----------------------------------------------*/ 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; } /*----------------------------------------------- 函數(shù)名:main 主函數(shù) -----------------------------------------------*/ void main(void) { POWER = 1; //閉合模塊總電源繼電器,模塊通電 RPOWER = 1; //閉合電磁鐵模塊總電源繼電器,模塊通電 OE=1; SCK = 0; //初始化移位時鐘端 RCK = 0; //初始化鎖存輸出端 URATinit(); //初始化串口 while(1) { HC595(); } } /*----------------------------------------------- 函數(shù)名:中斷函數(shù) -------------------------------------------------*/ void receive() interrupt 4 { static uchar i=0; //靜態(tài)計數(shù)變量 RI=0; //接收中斷請求標志位清0 status=SBUF; //接收到的數(shù)據串保存在模式選擇中 if(status[0]==0xAA) { i++; if(i>=rnum) { flag=1; i=0; //計數(shù)變量清0 } } } |
izhonguo 發(fā)表于 2019-3-29 09:50 樓主所謂的獨立電源是不是使用同一個電源引出的不同電壓?尤其用的是開關電源驅動大負載對整個電路的穩(wěn)定性影響肯定不小 是在繼電器兩端并接二極管 |
izhonguo 發(fā)表于 2019-3-29 09:50 你既然已經明確的知道干擾源來自繼電器觸點火花,為什么不在此處設法解決?其它方法都是隔靴搔癢。 |
按沙發(fā)的指點做。 |
wulin 發(fā)表于 2019-3-26 09:03 強烈感謝wulin總工您的回復,您說的好多名詞我得先搜搜看怎么做。新手入行,要學習的太多了。 真的十分感謝您的耐心指點! ![]() |
笨笨兔 發(fā)表于 2019-3-26 08:54 一個負載大概也就是幾百mA的電流,不通過繼電器用直流的24V正負極直接接負載端沒有問題,而且電源功率很足,計算過即使所有板子的繼電器同時開也不可滿足電流需求。電路我得畫一下,剛接觸硬件這行業(yè),好多工具還沒有。謝謝! |
首先要找干擾源,從你表述的現(xiàn)象看是繼電器觸點開關產生的火花干擾(直流電尤甚)。這種干擾的頻譜范圍很寬,獨立DC電源并不能消除空間輻射干擾。建議:1.在繼電器動、靜觸點間加裝阻容吸收電路。2.MCU與74HC595的信號線及信號地線加共模磁環(huán)(信號線及信號地線成對),盡量縮短74HC595之間聯(lián)級信號線及信號地線加共模磁環(huán)。3.降低信號傳輸阻抗(MCU的IO口設為強推挽,信號線與地之間跨接1K電阻)。4.改為光耦隔離,MOS管代替繼電器。 |
控制幾十個繼電器都無問題,估計是你的電路有瑕疵,上電路吧! 再個:你的繼電器接的什么負載? |
wc86110 發(fā)表于 2019-3-25 23:29 接線很簡單,所有驅動繼電器的12伏電源是獨立一組,然后該12伏電源通過板子上的芯片降壓然后驅動芯片的vcc,外接繼電器的24V也是獨立的一組電源。 光電隔離措施是指驅動繼電器和hc595芯片之間嗎?這個板子是買的現(xiàn)成的,問了老板,他說不需要啊。 |
7358655 發(fā)表于 2019-3-25 22:27 繼電器買的是封裝好的,就是一塊595的芯片外加一塊驅動繼電器的芯片,沒有光耦。所以封裝好的繼電器應該是有反接二極管吧。我看看型號,再查一下。謝謝! |
上視頻不如上電路圖。考究的電路都使用獨立電源,并采用光電隔離措施避免干擾,視頻都沒看到這些 |
4個級聯(lián)的情況也試驗了,程序里循環(huán)寫兩組數(shù)據,第一組發(fā)0xff,0x00,0x00,0xff,然后延時幾秒后,第二組數(shù)據0x00,0xff,0xff,0x00。 在繼電器外部的24VDC電源沒有接上的情況下,繼電器按照程序設計的進行吸合。視頻見https://v.youku.com/v_show/id_XNDEwNTQzODAzNg==.html?spm=a2hzp.8244740.0.0 一旦外部24V直流電源接通,其實就是把正極從繼電器的共同端吸合至常開端,接通24V電源控制其他設備。就會出現(xiàn)程序初始化就繼電器全部吸合的狀態(tài),然后感覺是到了延時函數(shù)的時候繼電器瘋狂的吸合,感覺像是延時函數(shù)中的循環(huán)在不停的往HC595的DS端寫入0和1導致。視頻見:https://v.youku.com/v_show/id_XNDEwNTQzOTU5Ng==.html?spm=a2hzp.8244740.0.0 這一周都在反復改代碼重新接線調整,但是一直失敗。。。是一直失敗。。。查了網上說的繼電器在斷在的時候線圈會產生反向電動勢, 關鍵問題是程序初始化燒入單片機后,都沒有斷開的步驟直接就全部吸合了。 百思不得其解。望大家指點一二。謝謝! |
你把接負載后變化頻率調低點,或者說把繼電器打開關閉時間給長點,再檢查你電路繼電器線圈上反接有二極管沒,這兩個建議足以解決你的問題。 |