freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

基于arm的modbus和tcp-can總線適配器的硬件設計-資料下載頁

2025-06-24 16:39本頁面
  

【正文】 當CAN總線有較高的負電壓時通過二極管的短路可起到一定的過壓保護作用,PCA82C251的RS腳上接有一個斜率電阻。基于總線協(xié)議適配器的不同單元電路設計要求,適配器的硬件設計實現(xiàn)了Modbus接口電路、CAN總線接口電路、微控制器電路、CAN總線收發(fā)電路等電路部分的設計。電路設計中主要使用了RS一232總線驅動器MAX23AT89552單片機、獨立CAN通信控制器SJA1000T、光電隔離器件6N137和CAN總線驅動器PCA82C251等芯片??偩€協(xié)議適配器的硬件電路原理圖如圖410所示,總線協(xié)議適配器的硬件電路PCB如圖411所示,總線協(xié)議適配器的實物如圖412所示。圖410總線適配器的硬件電路原理圖圖411總線適配器的硬件電路PCB圖412總線適配器的實物 以太網接口電路設計Modbus/TCP 總線接口電路如圖413 所示。該電路中主要有以太網控制芯片ENC424J600 和RJ45接口。ENC424J600 通過SPI 總線和中斷與AT91SAM9M10 微控制器進行數(shù)據交互。其中, ENC424J600 與RJ45 接口之間選用的是漢仁公司的HR911103A 網絡變壓器, 消除了雙絞線上的干擾和部分諧波,實現(xiàn)了電氣隔離功能,提高了系統(tǒng)的抗干擾能力和收發(fā)的穩(wěn)定性。圖413 Modbus/TCP總線接口電路以太網發(fā)送接口TX+和TX實現(xiàn)了一個差分對和電流模式發(fā)送器。當PHY發(fā)送時, 通過改變TX+和TX的相對灌電流, 在以太網電纜上產生差分電壓。以太網的接收接口RX+和RX工作原理類似于發(fā)送接口。為了正確地終止發(fā)送和接收傳輸線,在發(fā)送接口和接收接口分別連接四個電阻( Ω、精度為1%)RRR3 和R4。在接收信號路徑上,使用兩個電容( nF、精度為10%)C1 和C2 與電阻R3 和R4 構成了一個RC高通濾波器,以降低基線漂移。C3 和C4 可以防止直流電流,并為兩個差分對提供穩(wěn)定的共模電壓。總線適配器的軟件設計主要包括CAN總線通信部分、串口通信部分、協(xié)議分析轉換過程以及協(xié)議適配器的配置應用程序。其中關鍵部分是協(xié)議分析轉換過程的實現(xiàn)。本課題研究的轉換適配器只實現(xiàn)Modbus協(xié)議中定義的部分功能。支持使用命令字節(jié),01H、02H、03H、04H、06H、0FH、10H功能碼。軟件設計思想如圖414所示,即在CAN適配器中微控制器的RAM中建立CAN數(shù)據區(qū)和Modbus數(shù)據區(qū),CAN通信數(shù)據分為輸入和輸出數(shù)據。CAN節(jié)點與適配器的通信數(shù)據都存儲在這個數(shù)據區(qū)中,通過CAN總線與CAN節(jié)點進行數(shù)據通信,Modbus通信數(shù)也分為輸入不同輸入和輸出數(shù)據,Modbus主站的寫出 (如05H、06H、0FH、10H功能)數(shù)據為Modbus輸入數(shù)據,與CAN的輸入數(shù)據對應。圖414 軟件設計思想由于CAN總線協(xié)議中只定義了物理層和數(shù)據鏈路層,沒有定義數(shù)據幀中數(shù)據的應用功能,而Modbus協(xié)議實現(xiàn)了應用層的定義,因此,適配器需要根據Modbus協(xié)議中的報文數(shù)據的含義對CAN總線報文數(shù)據場中的各數(shù)據實現(xiàn)相應的功能。 Modbus報文幀向CAN數(shù)據幀轉換的軟件設計Modbus報文的發(fā)送和接收都是通過微控制器的串行通信引腳進行通信的,無論是報文的接收還是發(fā)送都是采用中斷的方式進行的。采用中斷方式可以有效地降低微控制器的負荷,使微控制器的工作和程序的運行更有效率。微控制器的串口通信函數(shù)代碼如下:main() { sja1000()。 //SJA1000初始化 while(1) { uchar k。 read_0804()。 //讀AD轉換電壓值 wdcl_0804()。 //轉換電壓值 Max7221Display(amp。c[0])。 //顯示 DATA_BUF[0]=0xaa。 //ID高8位為10101010=0xaa DATA_BUF[1]=0xb4。 //ID低3位為101 數(shù)據幀 數(shù)據長度為4位 for(k=0。k=3。k++) //要發(fā)送的4位數(shù)據 { DATA_BUF[2+k]=c[k]。 // } DATA_WRITE(amp。DATA_BUF[0])。 //通過CAN總線向計算機發(fā)送數(shù)據 delay(100)。 //延時 } }/****adc0804******/void read_0804() //讀AD轉換電壓值{ intr_0804=1。 cs_0804=1。 wr_0804=1。 rd_0804=1。 intr_0804=0。 _nop_()。_nop_()。 cs_0804=0。 //0804片選有效 wr_0804=0。 //0804寫地址 _nop_()。_nop_()。 intr_0804=1。 rd_0804=0。 //0804讀 _nop_()。_nop_()。 temp=P0。 //讀AD轉換數(shù)據 cs_0804=1。 wr_0804=1。 rd_0804=1。 }void wdcl_0804(){ temp=(temp*2273)*10。 //提取一位小數(shù) c[0]=temp/1000。 //千位 c[1]=temp/100%10。 //百位 c[2]=temp/10%10。 //十位 c[3]=temp%10。 //個位}void delay(uint n) //延時程序{ uint i1,j1。 for (i1=0。i1n。i1++) for (j1=0。j11140。j1++)。}void WR7221(uchar addr,uchar Data) //MAX7221的寫子程序{ uchar i。 CS7221 = 0。 //片選有效 for (i=0。i8。i++) //寫8位地址 { CLK7221 = 0。 //時鐘低 DIN7221 = (addramp。(0x80i)) ? 1:0。 //先發(fā)高位 依次到低位 _nop_()。 _nop_()。 CLK7221 = 1。 //時鐘高 上升沿鎖數(shù)據 _nop_()。 _nop_()。 } for (i=0。i8。i++) //寫8位數(shù)據 { CLK7221 = 0。 //時鐘低 DIN7221 = (Dataamp。(0x80i)) ? 1:0。 //先發(fā)高位 依次到低位 _nop_()。 _nop_()。 CLK7221 = 1。 //時鐘高 上升沿鎖數(shù)據 _nop_()。 _nop_()。 } CS7221 = 1。 //片選無效}void Initial7221(void) //MAX7221初始化{ WR7221(0x0A,0x0A)。 //亮度地址0AH,0x00~0x0F,0x0F最亮 WR7221(0x0B,0x07)。 //掃描LED個數(shù)地址0BH,0x00~0x07,最多掃描8個數(shù)碼管 WR7221(0x0C,0x01)。 //工作模式地址0x0C. 0x00:關斷。0x01:正常 WR7221(0x09,0xFF)。 //編碼模式地址0x09. 0x00~0xFF:哪一位為1,哪一位就支持編碼}void Max7221Display(uchar *buffer) //MAX7221顯示子程序{ uchar i。 for (i=0。i8。i++) //MAX7221的8個數(shù)碼管顯示 { WR7221(i+1,*(buffer+i))。 //調MAX7221的寫子程序 }}void sja1000(){ do{。}while(CREATE_COMMUNATION()==1)。 //檢測CAN控制器的接口是否正常 do{。}while(ENTER_RETMODEL()==1)。 //進入復位工作模式 HW_INIT(0xaa,0x00,0xc9,0xc9,0xff,0x48)。 //CAN控制器的初始化 do{。}while(QUIT_RETMODEL()==1)。 //退出復位工作模式}/************************************************************************ *說明:該函數(shù)用于檢測CAN控制器的接口是否正常 * ************************************************************************/bit CREATE_COMMUNATION(void){ SJA_BCANAdr=REG_TEST。 //訪問測試寄存器 *SJA_BCANAdr =0xaa。 //寫入測試值 if(*SJA_BCANAdr == 0xaa) { return 0。 //讀測試正確 } else { return 1。 } } /************************************************************************ *說明: CAN控制器進入復位工作模式 * ************************************************************************/ bit ENTER_RETMODEL(void){ uchar TempData。 SJA_BCANAdr = REG_CONTROL。 //訪問地址指向控制寄存器 TempData= *SJA_BCANAdr。 //保存原始值 *SJA_BCANAdr=(TempData|0x01)。 //置位復位請求 if((*SJA_BCANAdramp。0x01) == 1) { return 0。 } else { return 1。 } }/************************************************************************ *說明: CAN控制器退出復位工作模式 * ************************************************************************/Modbus報文幀向CAN數(shù)據幀轉換的過程是從接收到Modbus報文幀開始的主要步驟如xia:(1)將從Modbus節(jié)點接收到的報文數(shù)據存放在Modbus數(shù)據緩沖區(qū)中。(2)計算該幀報文的CRC校驗碼,并與數(shù)據幀中的CRC校驗碼相比較。(3)如果兩個CRC校驗碼不同,則說明接收到的ModbuS報文幀存在錯誤。此時需要向發(fā)送Modbus報文幀的節(jié)點返回相應的回答報文,告訴Modbus節(jié)點原先發(fā)送的報文幀存在錯誤,可以考慮重新發(fā)送ModbuS報文幀。然后等待下一條Modbus報文幀。(4)如果兩個CRC校驗碼相同,則說明接收到的Modbus報文幀正確。此時需要向發(fā)送Modbus報文幀的節(jié)點返回相應的回答報文,告訴Modbus節(jié)點原先發(fā)送的報文幀被正確接收,可以繼續(xù)做其他的工作。(5)解析Modbus數(shù)據報文的地址域,根據定義的通信協(xié)議,確定此報文數(shù)據發(fā)送到哪個節(jié)點,即確定接收數(shù)據的CAN節(jié)點的ID。(6)解析Modbus數(shù)據報文的功能域,根據定義的通信協(xié)議,確定發(fā)送數(shù)據還是發(fā)送命令。(7)根據Modbus數(shù)據報文的解析,將相應的ID、以及數(shù)據或命令存入到CAN輸出數(shù)據區(qū)中。(8)然后通過CAN總線接口將相應的數(shù)據或命令發(fā)送到CAN總線網絡。如果沒有回答報文,則需要重新發(fā)送,若連續(xù)三次都沒接收到回答報文,則認為該節(jié)點設備出現(xiàn)通信故障。如果有回
點擊復制文檔內容
語文相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1