<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 自制鼠標!回報率1000Hz!

自制鼠標!回報率1000Hz!

作者: 時(shí)間:2024-12-06 來(lái)源:嘉立創(chuàng ) 收藏

這是一個(gè)基于制作的。

本文引用地址:http://dyxdggzs.com/article/202412/465287.htm

嘛,買(mǎi)一個(gè)就好了,為啥費勁做一個(gè)?

本人在做數字圖像處理時(shí),接觸過(guò)一款adns3080光流傳感器,能夠近距離拍照生成黑白像素圖像。

深入了解后,發(fā)現其原理竟然使用的傳感器原理一樣!索性就自己嘗試著(zhù)做了一個(gè)鼠標!

且本著(zhù)要做就做最好的原則,還選擇了當時(shí)最流行的鼠標傳感器paw3395,希望能給同樣想DIY鼠標的伙伴提供一些參考意義!

本文主要分享——功能亮點(diǎn)、硬件實(shí)現、軟件設計原理、成本說(shuō)明

功能/亮點(diǎn)

  • 鼠標回報率:實(shí)測950Hz,最大1000Hz,市面上場(chǎng)景鼠標回報率在500Hz左右(該數據為項目作者實(shí)測數據)

  • 主控:stm32f103c8t6

  • 光電傳感器:原相paw3395

  • 使用HID協(xié)議與電腦通訊

  • 目前以實(shí)現市面上鼠標所有基本功能,正常鼠標功能:光標移動(dòng)、左右鍵、中鍵、滾輪、DPI切換,DPI切換時(shí)LED閃爍3次

  • 拓展功能:兩個(gè)自定義按鍵(已預留接口),本例程未添加

  • 尼龍外殼:基于嘉立創(chuàng )3D打印

  • 電路:基于嘉立創(chuàng )EDA設計,尺寸支持免費打樣

硬件實(shí)現

硬件比較簡(jiǎn)單,本質(zhì)就是stm32最小系統板 + PAW3395驅動(dòng)電路 + 按鍵和滾輪電路+3D外殼的適配。

原理圖

PCB圖

軟件設計原理

  • 總體架構使用類(lèi)RTOS操作系統 的架構

  • PAW3395使用spi協(xié)議 驅動(dòng)

  • 使用CbueMX自動(dòng)生成初始HID協(xié)議

  • 自定義HID報文發(fā)送函數,聲明一個(gè)HID報文發(fā)送任務(wù),每1ms更新一次位移數據 并向電腦發(fā)送報文

滾輪數據更新的原理?

本章主要解決:滾輪不靈敏or滾輪一直往上/下滾動(dòng)的問(wèn)題

在CubeMX中使用TIM2的編碼器模式,默認配置如下:

想理解滾輪數據更新的原理,首先要搞清楚,在HID協(xié)議中,滾輪的各項數據:

  • 滾輪數據為0x80時(shí),代表滾輪未移動(dòng)

  • 0xff,為向上移動(dòng)一個(gè)單位

  • 0x01,為向下移動(dòng)一個(gè)單位

其他數值為向上或向下移動(dòng)好幾個(gè)單位,移動(dòng)距離太大,我們把握不住,該怎么解決?

我是這么處理的:

只要判斷滾輪移動(dòng)就以一個(gè)單位處理,及0xff或0x01;

其他情況為滾輪未移動(dòng),及0x80。

但如果滾了一次后編碼器就會(huì )長(cháng)時(shí)間保持一個(gè)值造成重復判斷,造成一直向上/下滾的情況,這就引出來(lái)一個(gè)新問(wèn)題:什么時(shí)候將編碼器的值清零?

很簡(jiǎn)單,判斷完就清零,將判斷出來(lái)的數值暫存在 wheel_num 中,通過(guò)上面剛自定義的報文發(fā)送函數 myMouse_update() 每1ms發(fā)送給電腦。

每1ms發(fā)送給電腦是最佳選擇嗎?

1ms要做的事情太多了,既要spi讀鼠標位移值,又要發(fā)送HID報文給電腦,還要判斷滾輪數據,容易時(shí)序紊亂。所以最終我測試出每5ms判斷一次,會(huì )更合理,也符合實(shí)際使用,因此最終代碼如下:

//更新滾輪數據void Mouse_wheel_Updata(void){  if((int16_t)__HAL_TIM_GET_COUNTER(&htim2) > 0)// 返回16位數據,如果需要負值要強制數據類(lèi)型轉換
    wheel_num = 0xFF;   
  else if((int16_t)__HAL_TIM_GET_COUNTER(&htim2) < 0)    wheel_num = 0x01;  else
    wheel_num = 0x80;  
  //清除編碼器計數
  TIM2->CNT=0;  // x表示第幾個(gè)定時(shí)器,例如TIM8->CNT=0;}

成本說(shuō)明

鼠標成本:200元以?xún)取?/p>

后期可以控制在:50元以?xún)取?/span>

開(kāi)源參考資料:
https://oshwhub.com/lidongze/shu-biao-zhong-ji-ban



關(guān)鍵詞: 鼠標 STM32 電路設計

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>