我的订单购物车(0)联系客服 帮助中心供应商合作 嘉立创产业服务群
领券中心备货找料立推专区爆款推荐TI订货PLUS会员BOM配单PCB/SMT工业品面板定制

用STM32做了个鼠标,回报率1000Hz!分析一下原理!

2024-12-10 16:17:31阅读量:1802

这是一个基于STM32制作的鼠标。

基于STM32制作的鼠标

 

标嘛,买一个就好了,为啥费劲做一个?

本人在做数字图像处理时,接触过一款adns3080光流传感器,能够近距离拍照生成黑白像素图像。

深入了解后,发现其原理竟然和鼠标使用的传感器原理一样!索性就自己尝试着做了一个鼠标!

本着要做就做最好的原则,还选择了当时最流行的鼠标传感器paw3395,希望能给同样想DIY鼠标的伙伴提供一些参考意义

本文主要分享——功能亮点、硬件实现、软件实现、成本说明、开源入口。

 

01
功能/亮点

鼠标的功能亮点

鼠标的功能亮点

02
硬件实现

硬件比较简单,本质就是stm32最小系统板 + PAW3395驱动电路 + 按键和滚轮电路+3D外壳的适配。

 

原理图

原理图

 

PCB图

PCB图

 

03
软件具体实现

软件具体实现

滚轮数据更新的原理?
本章主要解决:滚轮不灵敏or滚轮一直往上/下滚动的问题
在CubeMX中使用TIM2的编码器模式,默认配置如下:

滚动数据更新

想理解滚轮数据更新的原理,首先要搞清楚,在HID协议中,滚轮的各项数据:

  • 滚轮数据为0x80时,代表滚轮未移动

  • 0xff,为向上移动一个单位

  • 0x01,为向下移动一个单位

其他数值为向上或向下移动好几个单位,移动距离太大,我们把握不住,该怎么解决?

我是这么处理的:

只要判断滚轮移动就以一个单位处理,及0xff或0x01;

其他情况为滚轮未移动,及0x80。

但如果滚了一次后编码器就会长时间保持一个值造成重复判断,造成一直向上/下滚的情况,这就引出来一个新问题:什么时候将编码器的值清零?

很简单,判断完就清零,将判断出来的数值暂存在 wheel_num 中,通过上面刚自定义的报文发送函数 myMouse_update() 每1ms发送给电脑。

每1ms发送给电脑是最佳选择吗?

1ms要做的事情太多了,既要spi读鼠标位移值,又要发送HID报文给电脑,还要判断滚轮数据,容易时序紊乱。所以最终我测试出每5ms判断一次,会更合理,也符合实际使用,因此最终代码如下:

最终代码

  •  
  •  
  •  
  •  
  •  
  •  
  •  
//更新滚轮数据void Mouse_wheel_Updata(void){  if((int16_t)__HAL_TIM_GET_COUNTER(&htim2) > 0)// 返回16位数据,如果需要负值要强制数据类型转换    wheel_num = 0xFF;     else if((int16_t)__HAL_TIM_GET_COUNTER(&htim2) < 0)    wheel_num = 0x01;  else    wheel_num = 0x80;    //清除编码器计数  TIM2->CNT=0;  // x表示第几个定时器,例如TIM8->CNT=0;}

 

04
成本说明

鼠标成本:200元以内。

后期可以控制在:50元以内。

鼠标成本

 

 

05
开源网址

本项目已开源!

——想复刻想给作者点赞复制开源网址 前往原文。

开源网址:https://oshwhub.com/lidongze/shu-biao-zhong-ji-ban

广告图片