日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于DWM1000的UWB测距调试(一)

發布時間:2023/12/31 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于DWM1000的UWB测距调试(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

太虧了,調試這玩意兒不寫點啥記錄下來簡直虧成翔啊,原本DWM1000的官方例程就是基于STM32的,網上更是清一色的用32來控制DWM1000,本菜雞要用的微控制器是KEA128,不是STM32,光是移植問題就足夠原地爆炸了,何況之后還有雙向收發測距…不說了,進入正題。
首先,經過一段時間的浸淫,總算對官方的例程有所了解,還被自愿地學了一波32(寶寶心里苦啊)硬件方面隊友是根據datasheet的接線圖畫的原理圖,這里把兩張圖都貼出來,連接上應該是沒問題的:


接下來就是代碼了,這里先貼出main函數的前一部分:

以上是STM32例程的初始化部分。第一句,peripherals_init(); STM32系統初始化,不用移植;第二句,lcd_display_str(APP_NAME); LCD顯示字符串,不用移植;第三句,reset_DW1000(); DW1000復位函數,進去一看,是STM32的GPIO引腳配置:

簡單來說就是先把DW1000的復位引腳設置為推挽輸出然后拉低,再把它設置成模擬輸入,延時2ms,那么,對應的KEA128程序如下:

回到main函數的第四句,spi_set_rate_low(); SPI配置為低速模式,為啥呢?有注釋:

為了讓DW1000初始化,必須將它的時鐘暫時設置為晶振頻率,初始化之后就可以將SPI配置成高速模式以獲得更好的性能。是了,spi_set_rate_low(); 到 spi_set_rate_high(); 干的就是這個。接下來的問題是,對32來說SPI速度是多少才算是低速?

大概就是二分頻四分頻之類的,網上有人提到過:

而例程中STM32使用SPI2來控制LCD,用來和DW1000通信的是SPI1:

以72MHz來算,那么SPI1接口時鐘32分頻就是 72M / 32 = 2.25M,本菜雞直接配置成3MHz,然后DW1000初始化部分去掉LCD的部分,剩下的直接Copy:

還差最后一步,底層函數重寫。STM32和KEA128的SPI底層函數是不同的,要想順利完成移植,底層移植才是真正的核心。重要,而且極易猝死…接下來又是愉快的挖STM32底層環節,個人解讀SPI寫函數如下:


SPI讀也是類似的,唯一不同的就是兩個for循環體:

因為KEA128只有一個SPI0通道,這個UWB測距本身也因為要做成模塊的原因而只有DW1000一個從設備,所以KEA128為默認主機,SPI的片選CS硬件拉低,再去掉保留中斷狀態這一環節,移植到KEA128這邊的時候就變成了下面這樣:


好,移植暫時告一段落,現在測試KEA128和PC能否正常通信:
首先將之前的spi_init()函數與后面的DW1000初始化注釋,然后UART0初始化,接收中斷使能:

編寫接收中斷函數,收到信號后回復字符‘K’表示應答:

測試情況如下:

KEA128正常工作,且與PC間通信正常。接下來測試KEA128與DW1000間能否正常通信:

哦嚯,果然還是猝死了orz…
正常正常,一次就成功那就不是菜雞了,接下來開始找原因。直接將dwt_readdevid()放到while(1)中,利用邏輯分析儀讀取SPI四個引腳的狀態:

附上官方給出的dwt_readdevid()函數說明:

再對比一下數據手冊里的相關說明:

從收發格式上看MOSI線是沒啥問題的,但是手冊里還有一個簡單的模型:

所以這個CSn是怎么回事啊喂!!??
之前使用的是KEA128自帶的SPI模塊,此次移植也是直接用KEA的庫,底層函數這邊沒太注意,現在這節奏,不得不再去挖一波KEA的底層QAQ
先看看spi的初始化函數,然后在下面這一塊發現了CSn之外的問題:

SPIN[spin]->C1 = (0| (pcs << SPI_C1_SSOE_SHIFT) //配合C2_MODFEN位選擇片選引腳的功能| SPI_C1_SPE_MASK //SPI 系統使能| SPI_C1_MSTR_MASK //SPI 模塊配置為SPI 主機//| SPI_C1_SPIE_MASK //SPRF 或MODF 為1 時請求硬件中斷//| SPI_C1_SPTIE_MASK //SPTEF 為1 時,請求硬件中斷。//| SPI_C1_CPOL_MASK //0:高電平有效SPI 時鐘(空閑時為低電平) 1:低電平有效SPI 時鐘(空閑時為高電平)| SPI_C1_CPHA_MASK //0:SPSCK 上的第一個邊沿出現在數據傳輸的第一個周期的中間 1:SPSCK 上的第一個邊沿出現在數據傳輸的第一個周期的開始//| SPI_C1_LSBFE_MASK //1:SPI 串行數據傳輸從最低有效位開始); SPIN[spin]->C2 = pcs << SPI_C2_MODFEN_SHIFT; //配合C1_SSOE位選擇片選引腳的功能 SPIN[spin]->BR = SPI_BR_SPR(spr) | SPI_BR_SPPR(sppr); //設置波特率參數

CPHA位被置1了…底層啊orz…默默地把它注釋掉,再看邏輯分析儀:

不是全部為FF了,DWM1000和KEA能進行通信了,但是后四次的數據傳輸讀到的值全是7F,還是不對,得先讓CSn的變化和官方給出的示意圖相同才知道到底是啥情況。
目前的片選很煩,每傳完一個字節就自己拉高,設備ID有32位四個字節啊,這樣根本沒辦法正常傳輸嘛,行,不要這個片選了,直接用gpio控制,簡單粗暴。修改SPI初始化函數如下:

spi_init(spi0,NOT_PCS,MASTER,2.25*1000*1000);gpio_init(B0,GPO,1);

直接把片選腳單獨拉出來控制,這樣的話之前的兩個底層函數的首尾就都需要分別加上gpio_set(B0,0);和gpio_set(B0,1);來表示片選信號。
修改完畢后,也不看波形了,直接利用uart把讀到ID的發回來:

和庫里的設備ID對上了,ojbk,至此DWM1000初始化成功,后續開始Double-sidedTwo-way Ranging的移植。

總結

以上是生活随笔為你收集整理的基于DWM1000的UWB测距调试(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。