一、無線透傳概述與應(yīng)用
無線模塊 (RF wireless module) ,是數(shù)字?jǐn)?shù)傳電臺 (Digital radio)的模塊化產(chǎn)品,是指借助DSP 技術(shù)和無線電技術(shù)實(shí)現(xiàn)的高性能專業(yè)數(shù)據(jù)傳輸電臺模塊。 無線模塊延伸到很多的系統(tǒng)中,工業(yè)控制的開關(guān)量io設(shè)備,485無線傳輸設(shè)備dw-m1,模擬量采集和控制設(shè)備。從使用最早的按鍵電碼、電報、模擬電臺模塊加無線MODEM,發(fā)展到數(shù)字電臺模塊和DSP、軟件無線電;傳輸信號也從代碼、低速數(shù)據(jù)(300~1200bps)到高速數(shù)據(jù) (N64KNE1)。
E22-230T22S/30S/900T22S/T30S是全新一代的LoRa無線模塊基于SEMTECH公司SX1262射頻芯片的無線串口模塊 (UART),具有多種傳輸方式,E22-230T22S/30S工作在(220.125~236.125MHz) 頻段(默認(rèn)230.125MHz),E22-900T22S/T30S工作在(850.125~930.125MHz)頻段(默認(rèn)868125MHz), LoRa擴(kuò)頻技術(shù),TTL電平輸出,兼容3.3V與5V的10口電壓。E22-230T22S/30S/900T22S/T30S采用全新一代LoRa擴(kuò)頻技術(shù),與傳統(tǒng)SX1276方案相比,SX1262方案傳輸距離更遠(yuǎn),可達(dá)5KM,速度更快,功耗更低,體積更小,支持空中喚醒無線配置、載波監(jiān)聽、自動中繼、通信密鑰等,功能,支持分包長度設(shè)定。
二、本文中使用的無線透傳模塊
LoRa模塊(內(nèi)置MCU)采用億百特E22-400T22S與E22-400T30S,可實(shí)現(xiàn)廣播監(jiān)聽、定點(diǎn)傳輸、搭配設(shè)計的PCB使用:
模塊連接
三、配置步驟與程序講解
1、模塊配置
配置準(zhǔn)備:準(zhǔn)備好 E22 無線電臺,將 M0 撥碼開關(guān)撥至 0,M1 撥碼開關(guān)撥至1,設(shè)置為配置模式(模式 2),如下圖。(注:撥碼開關(guān)帶標(biāo)識端(ON 端)為 0);
配置:打開配置軟件 RF_Setting(E22-E9X(SL)) V2.8.exe,選擇并打開串口,讀取參數(shù),此時會顯示電臺參數(shù),修改參數(shù)后,點(diǎn)擊寫入?yún)?shù)即完成參數(shù)配置,如下圖。(注:1、除頻率信道外,其他參數(shù)均按下圖配置,具體參數(shù)說明可參考產(chǎn)品手冊;2、頻率通道關(guān)系到兩個電臺的對頻,因此需要將兩個配對的電臺均
設(shè)置為相同的頻率通道(0~83),如圖將兩個電臺的信道均設(shè)為5);
測試準(zhǔn)備:將 M0 撥碼開關(guān)撥至 0,M1 撥碼開關(guān)也撥至 0,設(shè)置為一般模式(模式 0),如下圖。(注:撥碼開關(guān)帶標(biāo)識端(ON 端)為 0)
測試:兩個電臺均配置完成,且設(shè)為一般模式后,就能夠正常地進(jìn)行信號的發(fā)射和接收,通過串口調(diào)試助手 XCOM 進(jìn)行測試,如圖所示。
2、程序部分
透傳數(shù)據(jù):
初始化透傳串口,采用結(jié)構(gòu)體形式進(jìn)行初始化:
透傳接收處理:
//串口接收處理函數(shù)
/**
* @brief 接受收據(jù)數(shù)據(jù)幀解包
* @param R_data 逐個接收到的數(shù)據(jù)
pUSART: 串口號
* @retval : 解包狀態(tài)
*/
void Xbee_ReceivedByte_SUART(u8 R_data, struct USART_TypeDefStruct *pUSART)
{
// IAP_Recieve(R_data);
Through_RecStringCmd(pUSART,R_data); //串口數(shù)據(jù)透傳解析
switch (pUSART->RecvParse.R_state) //接收數(shù)據(jù)幀解包用的結(jié)構(gòu)變量
{
case 0:
{
if (R_data == (u8)'$')
{
pUSART->RecvBuff[0] = R_data;
pUSART->RecvParse.R_state = 1;
pUSART->RecvParse.sum = R_data;
return ;
}
break;
}
case 1:
{
pUSART->RecvBuff[1] = R_data; // MASTER +SLAVER
pUSART->RecvParse.R_state++;
pUSART->RecvParse.sum += R_data;
return ;
}
case 2:
{
pUSART->RecvBuff[2] = R_data; // 功能碼字節(jié)
pUSART->RecvParse.R_state++;
pUSART->RecvParse.sum += R_data;
return ;
}
case 3:
{
pUSART->RecvBuff[3] = R_data; // Rec Data Length; 字節(jié)長度
pUSART->RecvParse.R_state++;
pUSART->RecvParse.sum += R_data;
pUSART->RecvParse.p_rec_num = 4; //接收數(shù)據(jù)緩沖器指針
switch(pUSART->RecvBuff[2])
{
case 0x02:
pUSART->RecvParse.lenth_rec_num = 9; //lenth_rec_num 接收長度-1
break;
case 0x03:
case 0x07:
pUSART->RecvParse.lenth_rec_num = 7; //lenth_rec_num 接收長度-1
break;
default:
pUSART->RecvParse.lenth_rec_num = 7+R_data; //lenth_rec_num 接收長度-1
break;
}
return ;
}
case 4:
{
pUSART->RecvBuff[pUSART->RecvParse.p_rec_num++] = R_data;
if(pUSART->RecvParse.p_rec_num >= pUSART->RecvParse.lenth_rec_num)
{
pUSART->RecvParse.R_state = 5;
}
pUSART->RecvParse.sum += R_data;
return ;
}
case 5: //接收數(shù)據(jù)
{ // RecvBuff 接收的字符串緩沖器
pUSART->RecvBuff[pUSART->RecvParse.p_rec_num++] = R_data;
if(pUSART->RecvParse.sum == R_data) // 校驗(yàn)和通過
{
ReceivedComPortDataEvent(pUSART->RecvBuff,pUSART);
}
pUSART->RecvParse.R_state = 0;
return ;
}
default:
{
pUSART->RecvParse.R_state = 0;
return ;
}
}
pUSART->RecvParse.R_state = 0;
return ;
}
透傳發(fā)送任務(wù)處理:
/**
* @brief 該函數(shù)必須1ms定時器中調(diào)用
* @param None
* @retval : None
*/
void CommProtocol_task(void)
{
if(N_1ms_EventUpData>0)
{
u8 i;
N_1ms_EventUpData = 0;
for(i=0;i<SIZEREPEATARRAY;i++)
{
if(RepeatArray[i].enable ==1) //發(fā)送使能
{
RepeatArray[i].n_1ms ++; //時間變量累加1ms
if(RepeatArray[i].n_1ms>=RepeatArray[i].period_ms) //時間到達(dá)發(fā)送定時周期
{
RepeatArray[i].n_1ms = 0; //時間變量復(fù)位,待發(fā)送數(shù)據(jù)幀進(jìn)入收發(fā)緩沖池
SetSendBuffer(RepeatArray[i].pUSART,0xA2, //串口,功能碼0XA2, 定時返回數(shù)據(jù)
OwnAddr,RepeatArray[i].objAddr, //發(fā)送者,接收者,發(fā)送者地址要根據(jù)程序作相應(yīng)變動
RepeatArray[i].regaddr,RepeatArray[i].length, //基地址,字節(jié)長度
EE_ParaData.c+RepeatArray[i].regaddr,0); //發(fā)送的起始數(shù)據(jù)地址指針,返回標(biāo)志
}
}
}
}
}
main函數(shù)
int main(void)
{
LED_Init(); //初始化與LED連接的硬件接口
CommProtocol_init(); //通信協(xié)議緩沖隊(duì)列初始化,只是將數(shù)據(jù)幀緩沖隊(duì)列中的發(fā)送使能標(biāo)志清零
XBeeUsart_init(); //初始化電臺的串口通信實(shí)例
UsartShow_init(); //GPS串口初始化
SystemIni();
SysTick_Config(SystemCoreClock / 1000); //1ms
SetContiuneDefaultData(); // 初始化向地面站連續(xù)發(fā)送數(shù)據(jù)的地址空間
while(1)
{
CommProtocol_task();
USART_Send_Task(&XBee_Usart); //向XBee串口發(fā)送任務(wù)
if(N_1ms_GPS_Watch>10)
{
N_1ms_GPS_Watch=0;
unPkg_GPS_task(); //解析GPS數(shù)據(jù)任務(wù)
}
EE_ParaData.name.Ki = rand()%100+1;
}
}
程序兼容STM32F1系列單片機(jī),移植或直接使用工程即可,F(xiàn)4系列只需修改串口部分。以上程序只是主要的處理過程,有一些函數(shù)未給出,都包含在工程中。
3、上位機(jī)
安裝:安裝很簡單,按照資料的安裝步驟一步步安裝即可,安裝成功后打開我們的文件夾,如圖箭頭1所指JS-GCS.exe就是我們的上位機(jī)程序。
數(shù)據(jù)添加:將程序中的需要透傳到上位機(jī)的數(shù)據(jù)添加到上圖箭頭2的飛鴻地址表中,如圖,注意地址與H地址的填寫,是根據(jù)字節(jié)長度來決定的。
添加完數(shù)據(jù)保存關(guān)閉,打開上位機(jī),就可以看到我們所需要的數(shù)據(jù),如圖
上位機(jī)連接透傳模塊前,需要把T30S用數(shù)據(jù)線連接到電腦,T22S與單片機(jī)串口連接,然后如圖選擇對應(yīng)的串口號,無線電變?yōu)榫G色表示連接成功。
數(shù)據(jù)上傳:這里用一個GPS來測試,把GPS數(shù)據(jù)發(fā)送到上位機(jī)觀察,GPS解析如下,解析后賦值給透傳的結(jié)構(gòu)體,另外把生成一個0-100的隨機(jī)數(shù)賦值給Ki:
/************************
* 解包GPS數(shù)據(jù)
*
*************************/
void unPkg_GPS_task(void)
{
char strtemp[50];
static u8 t = 0;
u8 i;
u8 length;
short tmp;
if(New_GPS_Packet==1)
{
New_GPS_Packet = 0;
N_1ms_GPS_Watch = 0;
//$GPGGA,050029.00,3202.2762,N,11848.9585,E,1,04,1.8,12.42,M,1.92,M,,*67
if((gps_head[0]=='G')&&(gps_head[1]=='G')&&(gps_head[2]=='A')) //GGA
{
p_stdio = 0;
if(getstr(Gpsstr)>0)
{
//EE_ParaData.name.GpsSol_iTow =Gpsstr[5]-'0';
}
if(getstr(strtemp)>0)
{
GPS_Latitude = getGPS_degree(strtemp);
EE_ParaData.name.GPS_avail = 1;
}
else
{
EE_ParaData.name.GPS_avail =0;
}
EE_ParaData.name.GPS_Latitude = GPS_Latitude;
getstr(strtemp); // 'N'
if(getstr(strtemp)>0)
GPS_Longitude = getGPS_degree(strtemp);
EE_ParaData.name.GPS_Longitude = GPS_Longitude;
getstr(strtemp); //'w'
if(getstr(strtemp)>0)
GPS_avail = atoi(strtemp);
if(getstr(strtemp)>0)
GPS_starnum = atoi(strtemp); //12
EE_ParaData.name.GPS_StarNum = GPS_starnum;
if(getstr(strtemp)>0)
GPSHdop = atof(strtemp); //15
if(getstr(strtemp)>0)
GPS_Altitude = atof(strtemp); //13
EE_ParaData.name.GPS_Altitude = GPS_Altitude;
}
if((gps_head[0]=='G')&&(gps_head[1]=='S')&&(gps_head[2]=='A')) //GSA
{
p_stdio = 0;
getstr(strtemp); // 模式
getstr(strtemp); // 定位類型
for(i=0;i<12;i++)
{
StarID[i] = 0xfe;
if(getstr(strtemp)>0)
StarID[i] = atoi(strtemp);
}
if(getstr(strtemp)>0)
Pdop = atof(strtemp);
if(getstr(strtemp)>0)
Hdop = atof(strtemp);
if(getstr(strtemp)>0)
Vdop = atof(strtemp);
EE_ParaData.name.GPS_Pdop = Pdop;
}
//#BESTVELA,COM1,0,75.0,FINESTEERING,729,18045.000,80000000,b748,1250;SOL_COMPUTED,DOPPLER_VELOCITY,0.150,0.000,0.0562,316.726716,0.1090,0.0*48f920de
if((gps_head[0]=='S')&&(gps_head[1]=='T')&&(gps_head[2]=='V')&(gps_head[3]=='E')&&(gps_head[4]=='L'))
{
p_stdio = 0;
t++;
if(t>=5)
{
// Beep();
t = 0;
}
while(str[p_stdio++] !=';') // 不處理分號前數(shù)據(jù)
{
if(p_stdio>=150) return;
}
getstr(strtemp); // get "SOL_COMPUTED"
getstr(strtemp); // get DOPPLER_VELOCITY
getstr(strtemp); // get latency
getstr(strtemp); // get age
if(getstr(strtemp)>0)
GPSSpeed[0] = atof(strtemp);
if(getstr(strtemp)>0)
GPSSpeed[1] = atof(strtemp);
if(getstr(strtemp)>0)
GPSSpeed[2] = atof(strtemp);
tmp= (short)(100*GPSSpeed[0]*cos(GPSSpeed[1]*deg_rad));
}
}
length = length;
}
數(shù)據(jù)觀測與上位機(jī)使用,可以看到GPS數(shù)據(jù)已經(jīng)上傳到上位機(jī),數(shù)據(jù)區(qū)與數(shù)據(jù)觀測區(qū)是一個實(shí)時動態(tài)的數(shù)據(jù),非常便于觀測
數(shù)據(jù)修改,點(diǎn)擊1位置彈出edit修改框,在修改值中輸入我們需要的數(shù)值,例如這里輸入5,然后點(diǎn)擊保存
Kp變?yōu)?說明寫入成功
我們到單片機(jī)上看仿真的數(shù)據(jù)也已經(jīng)被修改
四、IAP功能
IAP,全名為in applacation programming,即在應(yīng)用編程,與之相對應(yīng)的叫做isp,in system programming,在系統(tǒng)編程,兩者的不同是isp需要依靠燒寫器在單片機(jī)復(fù)位離線的情況下編程,需要人工的干預(yù),而iap則是用戶自己的程序在運(yùn)行過程中對User Flash 的部分區(qū)域進(jìn)行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預(yù)留的通信口對產(chǎn)品中的固件程序進(jìn)行更新升級。在工程應(yīng)用中經(jīng)常會出現(xiàn)我們的產(chǎn)品被安裝在某個特定的機(jī)械結(jié)構(gòu)中,更新程序的時候拆機(jī)很不方便,使用iap技術(shù)能很好地降低工作量。不懂原理的小伙伴自行搜索喲。如圖依次點(diǎn)擊,選擇bin文件,最后點(diǎn)擊編程即可燒錄到單片機(jī)。這部分程序后續(xù)會上傳,BOOT和APP文件。文章來源:http://www.zghlxwxcb.cn/news/detail-848073.html
五、總結(jié)
該上位機(jī)配合E22透傳模塊使用,傳輸距離遠(yuǎn),數(shù)據(jù)修改和觀測數(shù)據(jù)非常方便,對無人車、無人機(jī)PID調(diào)試可以大大提高效率,PID調(diào)試時可以實(shí)時觀測實(shí)際值與目標(biāo)值的變化來快速整定PID參數(shù),當(dāng)然對其他的調(diào)試如需遠(yuǎn)程觀察數(shù)據(jù)的項(xiàng)目來說也很方便。文章來源地址http://www.zghlxwxcb.cn/news/detail-848073.html
到了這里,關(guān)于STM32無線透傳、PID調(diào)試工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!