據悉:順德勒流鎮鎮府企業部門已取得了“中國商業LED生產基地”的稱號,LED照明產業的趨勢發展已到了個高速路口;本月中山“LED燈博會”我也有幸參加,通過大約4個小時的精心調查,LED產品在燈飾照明上有了很大的突破性,也就是說在照明應用上有了很大的改善,實際照明效果和節能效果及光效壽命等參數都有很大的突破。另外再配合創意性的燈具產品,突顯了LED所具有的獨特性和取代白熾燈甚至取代熒光節能燈的可能性。通過參展,我也認識到LED產業已悄悄地由小作坊轉向大規模,在資本上已由小打小鬧轉向資本營運化;洗牌的力度開始加大! 因此,本人為了不甘落伍,針對LED的靈活性在驅動的基礎上加快智能LED控制板的學習和研究。國外同行,針對智能調光產品已非常成熟了,但在國內才剛剛起步;國外在集中照明控制領域中已發展成熟上位機控制下位的技術,在節能低碳方面,信息傳感網絡方面已融合得非常完美。本人在綠博士照明有限公司業余期間,大量的實踐調光控制程序,總算取得了一點點小成績,現在編寫出來和有興趣的朋友們一起探討! 本次所有的程序研究都是基于本人開發的“WICN-01”單片機開發板所試的,所使用的單片機也是市場上性價比最有競爭力的STC系列單片機。 紅外線解碼方案的研究(芯片STC-89C52RC單片機): 為了提高研究的速度,本人首先采用日本upd6122芯片標準PPM碼進行解碼,該碼在日本及中國等家電產品中應用非常多,PPM碼的解碼方案就是用一把“時間尺寸”來測量接收到的紅外碼,通過這個時間標尺的判斷就可以得到二進制的數據,如此循環解碼出32位數據碼值,然后根據解得的碼值進行數據判斷,最后轉向所要執行的各個功能子程序以達到調光、定時、通信等目的。 解碼的成功第一點是解碼的“時間標尺”應該很精確,由于單片機型號的不同,所執行命令的周期性不同,因此,你算的時間精度和實際用示波器測量出來的精度是很大差別的,因此,要想成功解碼手上必須要有一臺數字示波器,一方面可以用來測量波形,另一方面數字示波器可以存儲波形用來慢慢分析波形是否正確,以及口頭讀碼的功能。upd6122芯片標準PPM碼的時間標尺一般是882us,在用這個標尺之前當然就是要像電視機中的“行場同步信號”那樣使用引導碼進行對齊,也就是發射和接收要找到一個同步點,這樣才能解出正確的數據。在解碼數據時,要重點的掌握匯編語言特別是C語言,如果沒有C語言干脆就不要搞程序!另外,要重點掌握各種算法對于各個寄存器狀態的影響,通過計算和查閱各個數據才能正確解碼,因此編程序的算法顯得相當重要。本人在實際解碼時也算是嘗盡了各種方法,用匯編語言解碼時,解碼很成功;但在用C語言解碼時卻遲遲顯示沒有反映,反復檢查各種算法,問題還是出在算法不合理造成沒有解到碼,外部中斷和定時中斷應用得不熟練。最終研究出5個調光檔位,2個慢調光檔位(當然,如果你要更多的檔位方法也是一樣的),5個檔位在調光時顯得調光很生硬,突然達到某個亮度;因此我加上兩個慢調光檔位,當你想調亮時,單片機自動地按一個時間線性慢調亮,這樣使人的眼睛能很好的去適應這個增亮或減暗的光線。當在高興時問題又來了,就是在每更換一個檔位時,其由于我設置了外部中斷優先于定時中斷,而我的調光PWM波形是由定時中斷得來的,這樣就使我在連續按遙控器時,外部中斷就在不停的產生,如此打亂了定時中斷的波形產生,因此,在連續按遙控器時燈管會出現閃動的現象。由于我使用的解碼MCU是STC-89C52RC,其不帶有PCA模塊,因此不得不想辦法自己來做紅外發射程序。 紅外發射程序心得(芯片STC-12C5A60S2單片機): 紅外發射首先要解決的就是發射信號不含有“連發碼”,發射的波形中只包含32位數據碼,這就是要求;發射信號當然和解碼過程序是反向的,因此在發射程序上要解決怎樣將32個數據一個一個地發出去,并讓另外一個單片機接收下來。通過查閱大量的資料,我只需在高電平時發射數據,低電平不發射,然后將32個數據通過移位的方法,一個一個的移到一個寄存器中,對這個寄存器中的數據進行高低電平的判斷,最后解決什么時間射,什么時間不發射,如此就可以在紅外線二極管中發射出一串數據來,讓接收方接收信號。但問題還有啊?紅外二極管的發射是需要38K-40K的頻率進行調制啊!不調制不能發射,更發射得不遠啊!那么,怎樣將我要發射的數據調制在這38k的載波上呢?方法有兩種:一種是通過中斷的方法,二種是通過軟件定時的方法,網絡上大部份是建議中斷的方法,但方法太過于復雜,不方便移值。我最后還是采用自己想的辦法“軟件定時法”,就是在高電平時發射38k載波,低電平時不發射載波,載波的頻率和周期是不變的,但載波的發射個數是可以改變的,這樣通過計算載波的周期和引導碼、數據碼的比例關系,就可能得出具體該發多少個載波周期,這種方法非常簡便適用。但是問題總是有的,就是發射總是不正確,難道我的這種簡單方法是行不通的嗎?不應該啊,我計算過好多次了,應該沒問題的,最多是波形最終測量的時間有點偏差嘛!為了驗證子程序了正確性不得不重新寫驗證程序了,幸好我的開發板上有6位LED顯示,常規學習者認為這幾個LED只能做一下流水燈試驗,其實這幾個LED燈作用不僅僅如此,更重要的功能是可能顯示是不是我們想要得到的數據啊!通過驗證,問題出在移位程序語句,我沒有良好的運用“進位位CY”,通過改進,程序可以一個個地將數據正確的移入CY中了,下一步就是判斷CY的值,然后判斷發射時間,但是問題還有啊!真是要命!!!!怎么還不行啊?發出去的數據不是我想要的啊??檢查了2個小時才知道,我們書面上寫的二進制高低方向和發射方向是不一樣的,再加上又要取反碼,幾個倒轉就不知道發射出去的是什么數據了。好在公司的示波器可以存波形,通過讀波形顯示的數據才知道,書面上的據數方向是:左邊是高位,右面是低位,如十六進制的0X04=00000100B,而不能是00100000B;發射時應該從書面的高位向低位開始發射數據;如:0X03=00000011(書面),發射時應該11000000,這樣發射數據,要注意00000011是不等于取反的00000011的數據喲!這些都是些小細節,但錯了就是不行!!!! 如此,一串數據發射出去了,接收方也正確的解了碼,說明我的程序正確。 通過紅外編碼和解碼程序的理解和編寫,我們可以聯想出更多的通信協議,也可以用這種方法來聯想理解其它協議和運用,紅外線編碼和解碼程序我認為是學習各種協議的基礎,非常重要。
|