《《《《《正文》》》》》
《無(wú)線(xiàn)模塊選擇》
說(shuō)明:
一、上圖這種常規的 433Mhz 無(wú)線(xiàn)模塊,發(fā)射端一般用 PT2262/EV1527/PT2240/HCS301編碼。如果選擇 PT2262,接收端則直接搭配 2272,匹配好振蕩電阻和烙好 A0-A7 腳就可以直接使用了。
二、如果發(fā)射用 EV1527、PT2240、HCS301 等芯片,這些需要自已編寫(xiě)解碼程序,單片機解碼,要不斷地處理 100us-20ms 脈沖識別,還要做別的任務(wù),比如按鍵 LED 數碼掃描等。
三、如果單片機的任務(wù)單一,可以用在 main 中循環(huán)查詢(xún)端口的方式來(lái)不斷地判斷脈沖寬度,一般工程師都是用這種方式入手的,這種方式僅限 EMC153 這類(lèi)低檔 MCU,如果是 51或 ST 不推薦,原因是單片機還是有其它任務(wù),這些耗時(shí)較長(cháng),會(huì )直接造成無(wú)線(xiàn)接收的丟碼,這種解碼方式僅限入門(mén)用。
四、推薦解碼方法是一個(gè)中斷引腳加一個(gè)定時(shí)器,在中斷里完成這部分的無(wú)線(xiàn)解碼;雖然模塊在靜態(tài)時(shí),有 30us—1000us 不等雜波,占用 MCU 太多的時(shí)間,這完全可以忽視;寫(xiě)好中斷代碼就好了,中斷以外的時(shí)間處理其它任務(wù)完全沒(méi)有問(wèn)題。比如串口收發(fā),SPI通訊等。處理串口中斷,和其它定時(shí)中斷也基本不影響,如果串口波特率較高,實(shí)測有誤碼時(shí),可以將串口中斷的優(yōu)先級別高于無(wú)線(xiàn)接收。
《具體解碼方法》
一般選擇單片機具有上升沿/下降沿,雙邊沿中斷的引腳來(lái)直接連接無(wú)線(xiàn)接收模塊(老式 51 單片機僅有下降沿方式,后面講此改進(jìn)方法),注意不要灌電給接收模塊,就是單片機 5V,模塊選 3V 的,這樣會(huì )改變接收模塊的電壓,應作處理,一般此腳設為上拉輸入,但更建議將引腳設為高阻輸入,這樣減小接收模塊的負載,有利其減小電壓紋波。
如何解碼?我們選觀(guān)察下以下編碼圖,以 1527 編碼為例說(shuō)明:
上面圖中間部分是一幀完整的數據,最有特征的就是最寬的部分,俗稱(chēng)同步脈沖,兩個(gè)同步脈沖間的小脈沖是我們要解的編碼。兩個(gè)同步頭間的高電平是 25bit,其中最后 1bit 是下一同步頭的。我們只解其中的 24bit 即可。
上面圖的 CLK 是指振蕩電阻的振蕩周期,我們可以忽視,直接用示波器量下 4CLK 的寬度就好了,不用對照 DATASHEET 去找這個(gè) CLK 到底是多少。請仔細觀(guān)察上面的圖,它的H 和 L 周期是一致的,只是顛倒了位置.所以為了提高解碼效率,我們雖是雙邊沿中斷觸發(fā),但只檢查低電平的持續時(shí)間是多少就行了,高電平直接無(wú)視,請看下附流程圖。上升沿時(shí)判斷定時(shí)器的脈沖寬度,請注意,1527 這類(lèi)編碼必須要接收正確的兩次信號才可以向外輸出,才能證明數據收到了,這是許多新入門(mén)者常犯的錯誤,因為無(wú)線(xiàn)的亂碼有可能會(huì )形成這種巧合的接收,請務(wù)必校驗兩次,否則產(chǎn)品批量出貨后可能會(huì )有麻煩。
HCS301 的編碼只需接收一次就行了,它一包 64bit 位中自帶校驗碼,不需要我們這種重復兩次的方法來(lái)校驗。Chkbuf 中的數據最好也加個(gè)時(shí)間限制,超時(shí)后,校驗位為清 0,下次最收到碼時(shí),又成為了第一包數據了。數據收到后,交由主程序中查詢(xún)去處理,有可能還要有 E2 中的數據再次比較,證明是否有無(wú)對碼等的操作。
請參見(jiàn)下面的流程圖:
《EV1527 編碼芯片之無(wú)線(xiàn)解碼原理說(shuō)明》
EV1527 是一片由 CMOS 設計制造的可預燒內碼的學(xué)習碼編碼 IC,由軟件解碼,每次發(fā)4 幀,每幀 24 位加一個(gè)同步碼。此 24 位中,前 20 位為芯片內碼(即 ID,共有 2 的 20 次方,即 1048576 組組合,大大降低使用上編碼重復的幾率),后 4 位是按鍵值(即數據)。
其編碼圖形如下所示:
其中邏輯 1 是一個(gè)長(cháng)高電平加一個(gè)短低電平;邏輯 0 是一個(gè)短高電平加一個(gè)長(cháng)低電平。同步碼在 24 位編碼后面。這樣解碼的時(shí)候只要檢測高電平和低電平的持續時(shí)間就可以判斷是邏輯 1 還是邏輯 0 了,因為它們都是以高電平開(kāi)頭的,另外末尾的一個(gè)同步碼的第一個(gè)上升沿剛好可以作為第 24 位的低電平的持續時(shí)間的判斷用。因為 ASK 接收模塊當沒(méi)有接收到有效信號的時(shí)候數據腳會(huì )輸出雜亂無(wú)章的波形,不便于用中斷法解碼,宜用查詢(xún)法,其 EV1527 的解碼原理如下流程圖所示:其中需要用到定時(shí)器,定時(shí)器設為 50us 中斷一次,一直開(kāi)啟的。
具體解碼函數如下所示:需要用到的變量:
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;
///////////////////接收函數///////////////////////
void Recieve()
{
//一進(jìn)來(lái)就先把引腳的狀態(tài)讀取了,然后判斷跟前面的是否一樣,不一樣的時(shí)候才進(jìn)行后
續運算
in_bit_n = inport; //inport 是 ASK 模塊的數據腳
if(in_bit == in_bit_n)
{
return;
}
in_bit = in_bit_n;
//P3_7 = in_bit; //把值丟給 LED 口
if(timer_4_countover)
{//超時(shí)錯誤
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) //高電平,現在為高電平,其實(shí)之前是低電平的
{
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; //低長(cháng)
}
else
{
recvbit[recvbitcount] = 0x03; //高長(cháng)
}
}
else
{//出錯
RecieveError();
return;
}
timer_4_count = 0;
timer_4_countover = 0;
// 1527
recvbitcount++;
if(recvbitcount < 2)
{
return;
}
else
{
//這里判斷的電平,應該是跟實(shí)際的相反的,因為只有電平變化了,才會(huì )做相應處理,
不變化的話(huà)是直接退出的。
if((recvbit[0] == 1)&&(recvbit[1] == 2)) //高短低長(cháng)
{
recvbyte[recvbytecount] = 0;
}
else if((recvbit[0] == 3)&&(recvbit[1] == 0)) //高長(cháng)低短
{
recvbyte[recvbytecount] = 1;
}
else
{
RecieveError();
return;
}
}
recvbytecount++; //接收到的字節數加 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;
}
程序功能:使用前需要對碼,即按一下按鍵后松開(kāi),4 個(gè) LED 全亮后熄滅只留 LED2,LED3 常亮,5s 鐘內按下遙控器,可以發(fā)現 LED 分兩組閃爍三次后熄滅即可完成對碼。 以后該遙控器就可以工作。接收端收到無(wú)線(xiàn)信號后,先輸出串口,然后判斷 ID,ok 后點(diǎn)亮對應的 LED,100ms 后熄滅。若想解其他最小脈寬的編碼,只需修改程序中的如下四個(gè)變量即可:
注:所謂“最小脈寬”即 EV1527 的編碼中四倍時(shí)鐘,如下圖所示:
審核編輯:湯梓紅
-
單片機
+關(guān)注
關(guān)注
6008文章
44106瀏覽量
623609 -
無(wú)線(xiàn)模塊
+關(guān)注
關(guān)注
12文章
611瀏覽量
48021 -
eV1527
+關(guān)注
關(guān)注
2文章
9瀏覽量
25633
原文標題:10分鐘掌握EV1527無(wú)線(xiàn)模塊編解碼
文章出處:【微信號:airX嵌入式,微信公眾號:airX嵌入式】歡迎添加關(guān)注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論