当前位置: 首页 > article >正文

STM32F103ZE标准库SPI驱动PMW3901光流模块:从硬件连接到数据读取的保姆级教程

STM32F103ZE标准库SPI驱动PMW3901光流模块实战指南第一次接触STM32和光流模块时面对密密麻麻的引脚和寄存器配置确实容易让人望而生畏。但别担心这篇教程会带你从零开始一步步完成硬件连接、SPI配置、寄存器初始化到最终数据读取的全过程。我们使用的硬件很简单一块STM32F103ZE最小系统板和一个PMW3901光流模块通过SPI接口实现通信。1. 硬件连接与SPI基础PMW3901模块上通常会标注SPI通信引脚我们需要将其与STM32正确连接。这个模块采用4线SPI接口包含以下信号线MOSI(Master Out Slave In)主设备输出从设备输入MISO(Master In Slave Out)主设备输入从设备输出SCK(Serial Clock)时钟信号CS(Chip Select)片选信号具体连接方式如下表所示PMW3901引脚STM32F103ZE引脚功能说明MOSIPA7主出从入MISOPA6主入从出SCKPA5时钟信号CSPA12片选信号注意连接时务必确认引脚对应关系错误的连接可能导致通信失败甚至硬件损坏。2. SPI外设初始化配置在STM32标准库中配置SPI外设需要关注几个关键参数void SPI_PMW_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能SPI1和GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置SPI引脚 GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_7; // SCK和MOSI GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; // MISO GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); // 配置CS引脚为普通输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GPIOA, GPIO_InitStructure); // SPI参数配置 SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL SPI_CPOL_High; // 模式3 SPI_InitStructure.SPI_CPHA SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial 7; SPI_Init(SPI1, SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); }PMW3901支持SPI模式0和模式3这里我们选择模式3CPOL1CPHA1。波特率预分频设置为4在72MHz系统时钟下SPI时钟频率为18MHz。3. PMW3901初始化与寄存器配置PMW3901上电后需要进行一系列寄存器配置才能正常工作。首先我们需要验证SPI通信是否正常uint8_t PMW3901_Check(void) { SPI_PMW_CS_LOW(); delay_ms(1); SPI_PMW_SendByte(0x3A, 0x5A); // 唤醒命令 delay_ms(10); uint8_t id SPI_PMW_ReadByte(0x00); // 读取产品ID uint8_t verify SPI_PMW_ReadByte(0x5F); // 读取验证寄存器 SPI_PMW_CS_HIGH(); if(verify 0xB6) { return 1; // 通信正常 } return 0; // 通信失败 }如果0x5F寄存器返回值为0xB6说明SPI通信正常。接下来是完整的寄存器初始化序列void PMW3901_InitRegisters(void) { // 寄存器初始化序列 SPI_PMW_SendByte(0x7F, 0x00); SPI_PMW_SendByte(0x61, 0xAD); SPI_PMW_SendByte(0x7F, 0x03); // ... 省略其他寄存器配置 SPI_PMW_SendByte(0x40, 0x80); // 最后一条配置 delay_ms(100); }提示完整的寄存器初始化序列较长建议参考数据手册并保存为数组常量避免代码冗长。4. 数据读取与处理PMW3901通过特定寄存器提供运动数据X轴和Y轴的位移数据分别存储在以下寄存器中0x03: X轴位移低字节0x04: X轴位移高字节0x05: Y轴位移低字节0x06: Y轴位移高字节读取运动数据的函数实现void PMW3901_ReadMotion(int16_t *deltaX, int16_t *deltaY) { // 先读取0x02寄存器触发数据更新 SPI_PMW_ReadByte(0x02); // 读取X轴位移(高8位和低8位组合) uint8_t xh SPI_PMW_ReadByte(0x04); uint8_t xl SPI_PMW_ReadByte(0x03); *deltaX (int16_t)((xh 8) | xl); // 读取Y轴位移 uint8_t yh SPI_PMW_ReadByte(0x06); uint8_t yl SPI_PMW_ReadByte(0x05); *deltaY (int16_t)((yh 8) | yl); // 数据处理 if(*deltaX -32640 *deltaX -30000) { *deltaX 32640; } if(*deltaY -32640 *deltaY -30000) { *deltaY 32640; } }5. 调试技巧与常见问题在实际开发中可能会遇到各种问题。以下是一些实用的调试技巧SPI通信验证使用逻辑分析仪或示波器检查SPI信号在Keil Debug模式下观察变量值确保0x5F寄存器返回0xB6常见问题排查检查硬件连接是否正确确认SPI模式设置与PMW3901匹配确保CS信号在通信期间保持低电平检查电源稳定性模块需要稳定的3.3V供电性能优化建议根据应用场景调整数据采样率添加软件滤波处理环境干扰优化SPI时钟速度平衡性能与稳定性// 示例简单的移动平均滤波 #define FILTER_SIZE 5 int16_t filterBufferX[FILTER_SIZE] {0}; int16_t filterBufferY[FILTER_SIZE] {0}; uint8_t filterIndex 0; void FilterMotionData(int16_t *x, int16_t *y) { filterBufferX[filterIndex] *x; filterBufferY[filterIndex] *y; filterIndex (filterIndex 1) % FILTER_SIZE; int32_t sumX 0, sumY 0; for(uint8_t i 0; i FILTER_SIZE; i) { sumX filterBufferX[i]; sumY filterBufferY[i]; } *x sumX / FILTER_SIZE; *y sumY / FILTER_SIZE; }通过以上步骤你应该能够成功驱动PMW3901光流模块并获取运动数据。实际应用中模块对环境光比较敏感建议在相对稳定的光照条件下使用或者增加适当的光学滤光片。

相关文章:

STM32F103ZE标准库SPI驱动PMW3901光流模块:从硬件连接到数据读取的保姆级教程

STM32F103ZE标准库SPI驱动PMW3901光流模块实战指南 第一次接触STM32和光流模块时,面对密密麻麻的引脚和寄存器配置,确实容易让人望而生畏。但别担心,这篇教程会带你从零开始,一步步完成硬件连接、SPI配置、寄存器初始化到最终数据…...

GEOvsSEO|做GEO的我,说实话不吹不黑

经常被问:GEO到底是什么?和SEO到底有啥区别? 一句话说清楚:SEO是让你被搜索引擎(百度、谷歌这些)搜到,而GEO,是让你被AI(豆包、deepseek、文心一言这些)选中&…...

Spring Boot项目在IDEA里调试,如何优雅地管理多套环境配置(开发/测试/生产)?

Spring Boot多环境配置管理的终极实践指南 当你在IDEA中调试Spring Boot项目时,是否经常为不同环境的配置切换而烦恼?开发环境用8080端口,测试环境用8081,生产环境又是另一套数据库连接?每次手动修改application.prope…...

鸣潮工具箱:3步解锁120FPS与抽卡数据分析的终极指南

鸣潮工具箱:3步解锁120FPS与抽卡数据分析的终极指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》玩家设计的开源工具箱,通过智能配置管理、画质优化…...

macOS日历智能助手:基于OpenClaw与幂等设计的对话式日程管理

1. 项目概述:一个让日程管理融入对话的智能助手如果你和我一样,每天在即时通讯软件(比如 Telegram、飞书、Discord)和日历应用之间反复横跳,只为把聊天里提到的一个会议、一个灵感或一张截图变成日历上的一个事件&…...

Cloud-Claw:基于Go与插件化架构的多云资源统一管理工具实践

1. 项目概述:一个轻量级云资源抓取与管理的利器最近在整理个人云上资产时,发现了一个挺有意思的开源项目,叫cloud-claw。这名字起得挺形象,“云爪”,一听就知道是跟云资源抓取和管理相关的工具。作为一个经常在多云环境…...

别再报错‘PowerSI executable not found’了!手把手教你搞定Cadence 2017.4与Sigrity 2019的完整安装与联调

彻底解决Cadence与Sigrity联调报错:从安装到仿真的全流程指南 每次打开Allegro Sigrity SI准备大展拳脚时,突然跳出的"PowerSI executable not found"报错对话框,就像一盆冷水浇灭了所有热情。这个看似简单的路径配置问题&#xff…...

Allegro 17.4 铺铜避坑指南:从动态铜皮参数到孤岛删除,一次讲清所有细节

Allegro 17.4 铺铜避坑指南:从动态铜皮参数到孤岛删除,一次讲清所有细节 刚接触Allegro进行PCB设计的硬件工程师,往往会在铺铜环节遇到各种"坑"。从动态铜皮参数设置不当导致的DRC错误,到孤岛铜皮处理不及时引发的生产隐…...

3分钟搞定Obsidian笔记内B站视频播放:终极解决方案

3分钟搞定Obsidian笔记内B站视频播放:终极解决方案 【免费下载链接】mx-bili-plugin 项目地址: https://gitcode.com/gh_mirrors/mx/mx-bili-plugin 还在为Obsidian笔记中无法直接播放B站视频而烦恼吗?Media Extended B站插件为你提供了一套完整…...

VGG19模型实战:用Python和TensorFlow从零搭建图像分类器(附完整代码)

VGG19模型实战:用Python和TensorFlow从零搭建图像分类器(附完整代码) 在计算机视觉领域,卷积神经网络(CNN)已经成为图像分类任务的标准解决方案。牛津大学视觉几何组(Visual Geometry Group&…...

CF冰火遗迹挂机避坑指南:为什么你的脚本总掉线?管理员权限和WeGame窗口是关键

CF冰火遗迹脚本稳定运行实战手册:从权限管理到图像识别的深度优化 1. 为什么你的CF脚本总在关键时刻掉链子? 深夜两点,你第15次检查脚本运行日志,发现它又在进入房间前一刻停止了响应。这不是个例——90%的CF自动化脚本失效案例都…...

5分钟上手:如何用M9A自动化你的《重返未来:1999》日常

5分钟上手:如何用M9A自动化你的《重返未来:1999》日常 【免费下载链接】M9A 重返未来:1999 小助手 | Assistant For Reverse: 1999 项目地址: https://gitcode.com/gh_mirrors/m9/M9A 厌倦了每天重复的游戏日常操作?想让《…...

D2R Pixel Bot终极指南:5步实现暗黑破坏神2重制版全自动运行

D2R Pixel Bot终极指南:5步实现暗黑破坏神2重制版全自动运行 【免费下载链接】botty D2R Pixel Bot 项目地址: https://gitcode.com/gh_mirrors/bo/botty D2R Pixel Bot是一款专门为《暗黑破坏神2重制版》设计的智能自动化工具,通过先进的图像识别…...

5分钟快速上手:用Chinese-ERJ LaTeX模板轻松搞定《经济研究》期刊论文格式

5分钟快速上手:用Chinese-ERJ LaTeX模板轻松搞定《经济研究》期刊论文格式 【免费下载链接】Chinese-ERJ 《经济研究》杂志 LaTeX 论文模板 - LaTeX Template for Economic Research Journal 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-ERJ 还在为…...

Anime4K:3分钟掌握实时动漫视频高清化的终极方案

Anime4K:3分钟掌握实时动漫视频高清化的终极方案 【免费下载链接】Anime4K A High-Quality Real Time Upscaler for Anime Video 项目地址: https://gitcode.com/gh_mirrors/an/Anime4K 当你在4K大屏幕上重温经典动漫时,是否曾因模糊的画面和失真…...

如何高效下载B站视频:BilibiliDown终极使用指南

如何高效下载B站视频:BilibiliDown终极使用指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bili…...

Win11Debloat:Windows 11终极去广告与系统优化工具,3步告别臃肿

Win11Debloat:Windows 11终极去广告与系统优化工具,3步告别臃肿 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes…...

五分钟搞定VRoidStudio中文界面:免费汉化插件终极指南

五分钟搞定VRoidStudio中文界面:免费汉化插件终极指南 【免费下载链接】VRoidChinese VRoidStudio汉化插件 项目地址: https://gitcode.com/gh_mirrors/vr/VRoidChinese 你是否在使用VRoidStudio时被满屏的英文界面困扰?作为一款功能强大的3D角色…...

终极免费微信聊天记录导出完整指南:永久保存你的数字记忆

终极免费微信聊天记录导出完整指南:永久保存你的数字记忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或误操作而丢失珍贵的…...

Nginx+php配置文件及原理解析

采用nginxPHP作为webserver的架构模式,在现如今运用相当广泛。然而第一步需要实现的是如何让nginx正确的调用php。由于nginx调用php并不是如同调用一个静态文件那么直接简单,是需要动态执行php脚本。所以涉及到了对nginx.conf文件的配置。这一步对新手而…...

如何为Nintendo Switch安装游戏?Awoo Installer的三种高效方案详解

如何为Nintendo Switch安装游戏?Awoo Installer的三种高效方案详解 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer Awoo Installer是一…...

5个英雄联盟玩家必知的效率工具:League Akari完全指南

5个英雄联盟玩家必知的效率工具:League Akari完全指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是一个文章写手&#xff0…...

别光看界面了!Gazebo 11 新手必知的 5 个隐藏操作技巧(附鼠标手势详解)

Gazebo 11 隐藏操作手册:5个让仿真效率翻倍的实用技巧 第一次打开Gazebo时,那个布满按钮的界面确实让人望而生畏——左侧是层层叠叠的面板,顶部工具栏密密麻麻排列着二十多个图标,更别提那些隐藏在菜单深处的功能。但真正的高手从…...

AI-Shoujo HF Patch终极指南:一键解锁完整游戏体验的完整教程

AI-Shoujo HF Patch终极指南:一键解锁完整游戏体验的完整教程 【免费下载链接】AI-HF_Patch Automatically translate, uncensor and update AI-Shoujo! 项目地址: https://gitcode.com/gh_mirrors/ai/AI-HF_Patch AI-Shoujo HF Patch是一款专为AI-Shoujo游戏…...

Python自动化办公:用华为云OBS SDK实现文件自动备份与同步(附完整代码)

Python自动化办公:用华为云OBS SDK实现文件自动备份与同步 每天下班前手动备份项目文档,在不同设备间反复传输最新版本,这些重复性工作消耗了开发者大量时间。华为云对象存储服务(OBS)配合Python SDK,能将这…...

5分钟拯救100GB硬盘空间:智能游戏缓存清理全攻略

5分钟拯救100GB硬盘空间:智能游戏缓存清理全攻略 【免费下载链接】SteamCleaner :us: A PC utility for restoring disk space from various game clients like Origin, Steam, Uplay, Battle.net, GoG and Nexon :us: 项目地址: https://gitcode.com/gh_mirrors/…...

保姆级教程:用C# WPF + NModbus4 + thinger.DataConvertLib搞定PLC数据读写(附避坑指南)

工业级C# WPF Modbus通信实战:从PLC数据采集到界面绑定全解析 在工业自动化领域,Modbus协议因其简单可靠的特点,成为PLC与上位机通信的事实标准。对于.NET开发者而言,如何快速构建稳定高效的Modbus通信应用是进入工业软件开发的关…...

别急着重装!Pacman 报‘invalid or corrupted package’错误的深层原因与一键修复脚本

深入解析Pacman报invalid or corrupted package错误:从原理到自动化修复 当你长时间未更新Arch Linux系统后执行pacman -Syu,突然看到鲜红的错误提示"invalid or corrupted package"时,那种感觉就像准备开车出门却发现钥匙生锈了—…...

零基础极速上手:手把手教你用AI生成一个完整网站

零基础极速上手:手把手教你用AI生成一个完整网站“我完全不懂代码,连域名是什么都搞不清楚,真的能自己做个网站吗?”答案是:能。而且最快今天就能上线。本文将为你拆解一套通用的、可复制的零代码建站操作步骤。你可以…...

Sunshine游戏串流服务器:打造你的家庭游戏云平台

Sunshine游戏串流服务器:打造你的家庭游戏云平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款开源自托管的游戏串流服务器,专为Moonlight…...