《《《《《正文》》》》》
《無線模塊選擇》
說明:
一、上圖這種常規(guī)的 433Mhz 無線模塊,發(fā)射端一般用 PT2262/EV1527/PT2240/HCS301編碼。如果選擇 PT2262,接收端則直接搭配 2272,匹配好振蕩電阻和烙好 A0-A7 腳就可以直接使用了。
二、如果發(fā)射用 EV1527、PT2240、HCS301 等芯片,這些需要自已編寫解碼程序,單片機解碼,要不斷地處理 100us-20ms 脈沖識別,還要做別的任務,比如按鍵 LED 數(shù)碼掃描等。
三、如果單片機的任務單一,可以用在 main 中循環(huán)查詢端口的方式來不斷地判斷脈沖寬度,一般工程師都是用這種方式入手的,這種方式僅限 EMC153 這類低檔 MCU,如果是 51或 ST 不推薦,原因是單片機還是有其它任務,這些耗時較長,會直接造成無線接收的丟碼,這種解碼方式僅限入門用。
四、推薦解碼方法是一個中斷引腳加一個定時器,在中斷里完成這部分的無線解碼;雖然模塊在靜態(tài)時,有 30us—1000us 不等雜波,占用 MCU 太多的時間,這完全可以忽視;寫好中斷代碼就好了,中斷以外的時間處理其它任務完全沒有問題。比如串口收發(fā),SPI通訊等。處理串口中斷,和其它定時中斷也基本不影響,如果串口波特率較高,實測有誤碼時,可以將串口中斷的優(yōu)先級別高于無線接收。
《具體解碼方法》
一般選擇單片機具有上升沿/下降沿,雙邊沿中斷的引腳來直接連接無線接收模塊(老式 51 單片機僅有下降沿方式,后面講此改進方法),注意不要灌電給接收模塊,就是單片機 5V,模塊選 3V 的,這樣會改變接收模塊的電壓,應作處理,一般此腳設為上拉輸入,但更建議將引腳設為高阻輸入,這樣減小接收模塊的負載,有利其減小電壓紋波。
如何解碼?我們選觀察下以下編碼圖,以 1527 編碼為例說明:
上面圖中間部分是一幀完整的數(shù)據(jù),最有特征的就是最寬的部分,俗稱同步脈沖,兩個同步脈沖間的小脈沖是我們要解的編碼。兩個同步頭間的高電平是 25bit,其中最后 1bit 是下一同步頭的。我們只解其中的 24bit 即可。
HCS301 的編碼只需接收一次就行了,它一包 64bit 位中自帶校驗碼,不需要我們這種重復兩次的方法來校驗。Chkbuf 中的數(shù)據(jù)最好也加個時間限制,超時后,校驗位為清 0,下次最收到碼時,又成為了第一包數(shù)據(jù)了。數(shù)據(jù)收到后,交由主程序中查詢?nèi)ヌ幚?,有可能還要有 E2 中的數(shù)據(jù)再次比較,證明是否有無對碼等的操作。
請參見下面的流程圖:
《EV1527 編碼芯片之無線解碼原理說明》
EV1527 是一片由 CMOS 設計制造的可預燒內(nèi)碼的學習碼編碼 IC,由軟件解碼,每次發(fā)4 幀,每幀 24 位加一個同步碼。此 24 位中,前 20 位為芯片內(nèi)碼(即 ID,共有 2 的 20 次方,即 1048576 組組合,大大降低使用上編碼重復的幾率),后 4 位是按鍵值(即數(shù)據(jù))。
其編碼圖形如下所示:
extern unsigned char timer_4_count;
extern unsigned char timer_4_countover;
unsigned char in_bit = 0;
unsigned char rx_start = 0;
unsigned char rx_data_ok = 0;
unsigned char recvbit[4];
unsigned char recvbitcount = 0;
unsigned char recvbyte[40];
unsigned char recvbytecount = 0;
unsigned char Recv_data[5];
unsigned char in_bit_n = 0;
///////////////////接收函數(shù)///////////////////////
void Recieve()
{
//一進來就先把引腳的狀態(tài)讀取了,然后判斷跟前面的是否一樣,不一樣的時候才進行后
續(xù)運算
in_bit_n = inport; //inport 是 ASK 模塊的數(shù)據(jù)腳
if(in_bit == in_bit_n)
{
return;
}
in_bit = in_bit_n;
//P3_7 = in_bit; //把值丟給 LED 口
if(timer_4_countover)
{//超時錯誤
RecieveError();
return;
}
// 接收 4 次電平變化,才能確定 1 bit
if((timer_4_count > min_time_l)&&(timer_4_count < max_time_l))
{//窄脈沖,4~14,就是 200us~700us
if(in_bit) //高電平,現(xiàn)在為高電平,其實之前是低電平的
{
recvbit[recvbitcount] = 0x00; //低短
}
else//低電平
{
recvbit[recvbitcount] = 0x01; //高短
}
}
else if((timer_4_count > min_time_h)&&(timer_4_count < max_time_h))
{//寬脈沖,16~60,就是 800us~3000us
if(in_bit)
{
recvbit[recvbitcount] = 0x02; //低長
}
else
{
recvbit[recvbitcount] = 0x03; //高長
}
}
else
{//出錯
RecieveError();
return;
}
timer_4_count = 0;
timer_4_countover = 0;
// 1527
recvbitcount++;
if(recvbitcount < 2)
{
return;
}
else
{
//這里判斷的電平,應該是跟實際的相反的,因為只有電平變化了,才會做相應處理,
不變化的話是直接退出的。
if((recvbit[0] == 1)&&(recvbit[1] == 2)) //高短低長
{
recvbyte[recvbytecount] = 0;
}
else if((recvbit[0] == 3)&&(recvbit[1] == 0)) //高長低短
{
recvbyte[recvbytecount] = 1;
}
else
{
RecieveError();
return;
}
}
recvbytecount++; //接收到的字節(jié)數(shù)加 1。
recvbitcount = 0; //
if(recvbytecount < RECV_BIT_NUMBER)
{// 未接收完
return;
}
recvbytecount = 0;
timer_4_count = 0;
rx_data_ok = 1;
}
50us 定時器中斷函數(shù):
unsigned long Timer4Count = 0;
unsigned char timer_4_count = 0;
unsigned char timer_4_countover = 0;
{
static unsigned char tt4=0;
//PA_ODR_ODR2=~PA_ODR_ODR2;
tt4++;
if(tt4>=20)
{//1ms
tt4=0;
Timer4Count++;
//PA_ODR_ODR3=~PA_ODR_ODR3;
}
timer_4_count++;
if(timer_4_count == 0)
timer_4_countover++;
TIM4_SR_UIF=0;
}
程序功能:使用前需要對碼,即按一下按鍵后松開,4 個 LED 全亮后熄滅只留 LED2,LED3 常亮,5s 鐘內(nèi)按下遙控器,可以發(fā)現(xiàn) LED 分兩組閃爍三次后熄滅即可完成對碼。 以后該遙控器就可以工作。接收端收到無線信號后,先輸出串口,然后判斷 ID,ok 后點亮對應的 LED,100ms 后熄滅。若想解其他最小脈寬的編碼,只需修改程序中的如下四個變量即可:
注:所謂“最小脈寬”即 EV1527 的編碼中四倍時鐘,如下圖所示:
審核編輯:湯梓紅
-
單片機
+關(guān)注
關(guān)注
6058文章
44822瀏覽量
644856 -
無線模塊
+關(guān)注
關(guān)注
12文章
635瀏覽量
49028 -
eV1527
+關(guān)注
關(guān)注
2文章
9瀏覽量
25814
原文標題:10分鐘掌握EV1527無線模塊編解碼
文章出處:【微信號:airX嵌入式,微信公眾號:airX嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
想找一個芯片方案,無線發(fā)碼專用集成電路,類似于EV1527,但要求是免調(diào)試的。希望知道的推薦下。
請問單片機解碼433MHZ EV1527學習型編碼ic 學習功能如何用程序?qū)崿F(xiàn)?
基于STM32和hs1527、ev1527、rt1527、fp1527的無線接收解碼程序
基于STM32和hs1527、ev1527、rt1527、fp1527的無線接收解碼程序
SYN480R模塊解碼EV1527該怎樣去使用呢
EV1527射頻模塊調(diào)試過程分享
eV1527學習碼編碼IC

評論