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

从传感器到屏幕:手把手教你用STM32的ADC读取电位器,并用OLED实时显示电压值

从传感器到屏幕手把手教你用STM32的ADC读取电位器并用OLED实时显示电压值在嵌入式开发中模拟信号的采集与处理是一个基础但极其重要的技能。想象一下当你旋转一个电位器屏幕上的数字随之实时变化这种直观的反馈不仅能带来成就感更是理解ADC模数转换器工作原理的最佳方式。本文将带你一步步实现这个迷你电压表项目从硬件连接到软件编程完整呈现STM32的ADC模块如何将模拟世界的连续变化转化为数字世界的精确数值。1. 项目概述与硬件准备这个项目的核心目标是通过STM32的ADC模块读取电位器的电压值并将结果实时显示在OLED屏幕上。整个过程涉及三个关键环节模拟信号采集ADC、数据处理电压换算和结果展示OLED显示。对于初学者来说这不仅是一个实践ADC的好机会还能学习到外设驱动和实时数据处理的技巧。所需硬件清单STM32开发板如STM32F103C8T6最小系统板10kΩ电位器0.96寸OLED屏幕I2C接口杜邦线若干USB转TTL模块用于程序下载和调试硬件连接非常简单电位器两端分别接3.3V和GND中间引脚接STM32的ADC输入通道如PA1OLED的SCL接PB6SDA接PB7I2C1默认引脚确保所有设备共地提示如果使用不同型号的STM32请查阅数据手册确认ADC和I2C的引脚定义避免硬件冲突。2. STM32 ADC模块配置ADC是将模拟信号转换为数字信号的关键外设。STM32的ADC具有12位分辨率意味着它能将0-3.3V的输入电压量化为0-4095的数字值。这种转换不是瞬间完成的而是遵循特定的时序和配置。2.1 ADC初始化步骤以下是使用标准外设库配置ADC的典型流程// ADC初始化结构体配置 ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; // 1. 使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 2. 配置ADC通用设置 ADC_CommonInitStructure.ADC_Mode ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler ADC_Prescaler_Div4; ADC_CommonInitStructure.ADC_DMAAccessMode ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(ADC_CommonInitStructure); // 3. 配置ADC特定设置 ADC_InitStructure.ADC_Resolution ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode DISABLE; // 单通道不使用扫描模式 ADC_InitStructure.ADC_ContinuousConvMode ENABLE; // 连续转换模式 ADC_InitStructure.ADC_ExternalTrigConvEdge ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion 1; ADC_Init(ADC1, ADC_InitStructure); // 4. 配置ADC通道 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_15Cycles); // 5. 使能ADC ADC_Cmd(ADC1, ENABLE); // 6. 执行ADC校准 ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1));2.2 关键参数解析参数选项说明分辨率12位/10位/8位/6位12位提供最高精度(4096级)采样时间1.5/7.5/13.5/28.5/41.5/55.5/71.5/239.5周期较长时间提高精度但降低速度转换模式单次/连续连续模式适合实时监测触发方式软件/硬件触发本项目使用软件触发注意ADC时钟不能超过14MHz否则会导致精度下降。系统时钟为72MHz时分频系数应设为6(72/612MHz)。3. 电位器电压读取与计算配置好ADC后我们需要编写代码来启动转换并获取结果。由于ADC输出的是原始数字值还需要通过公式将其转换为实际的电压值。3.1 读取ADC值的函数实现uint16_t Read_ADC_Value(uint8_t channel) { // 设置转换通道 ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_15Cycles); // 启动软件触发转换 ADC_SoftwareStartConv(ADC1); // 等待转换完成 while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); // 返回转换结果 return ADC_GetConversionValue(ADC1); }3.2 电压值计算公式ADC转换结果与实际电压的关系可以用以下公式表示Vactual (ADC_Value × Vref) / 4095其中Vactual是实际电压值(单位伏特)ADC_Value是ADC读取的原始值(0-4095)Vref是参考电压(通常为3.3V)在代码中实现float Convert_To_Voltage(uint16_t adc_value) { return (adc_value * 3.3f) / 4095.0f; }提示为了提高显示稳定性可以添加简单的软件滤波算法如移动平均或中值滤波。4. OLED显示驱动与界面设计OLED屏幕以其高对比度和低功耗特性成为嵌入式项目中常用的显示设备。我们将使用I2C接口驱动OLED显示实时电压值。4.1 OLED初始化首先需要初始化I2C外设和OLED屏幕void OLED_Init(void) { I2C_Configuration(); // 配置I2C接口 // OLED初始化命令序列 OLED_Write_Command(0xAE); // 关闭显示 OLED_Write_Command(0xD5); // 设置时钟分频 OLED_Write_Command(0x80); OLED_Write_Command(0xA8); // 设置多路复用率 OLED_Write_Command(0x3F); // ... 更多初始化命令 OLED_Write_Command(0xAF); // 开启显示 OLED_Clear(); // 清屏 }4.2 电压值显示实现创建一个函数来更新屏幕上的电压值void Display_Voltage(float voltage) { char buffer[16]; // 清空显示区域 OLED_Set_Pos(0, 0); OLED_Show_String(Voltage:); // 格式化电压值字符串 sprintf(buffer, %.2f V, voltage); // 在指定位置显示 OLED_Set_Pos(2, 0); OLED_Show_String(buffer); // 添加简单的进度条效果 uint8_t length (uint8_t)(voltage * 30 / 3.3); OLED_Draw_Line(4, 0, 4, length); }5. 系统整合与优化将各个模块组合起来形成完整的应用程序。主程序的主要逻辑包括初始化、ADC读取、电压计算和显示更新。5.1 主程序框架int main(void) { // 硬件初始化 System_Init(); ADC_Init(); OLED_Init(); // 显示初始界面 OLED_Show_String(0, 0, STM32 Voltage Meter); OLED_Show_String(2, 0, Voltage: 0.00 V); while(1) { // 读取ADC值 uint16_t adc_value Read_ADC_Value(ADC_Channel_1); // 转换为电压值 float voltage Convert_To_Voltage(adc_value); // 更新显示 Display_Voltage(voltage); // 适当延时控制刷新率 Delay_ms(100); } }5.2 性能优化技巧采样速率控制根据需求调整采样间隔避免不必要的处理显示刷新优化仅更新变化的部分减少全屏刷新频率低功耗考虑在电池供电应用中可以间歇性采样和显示校准功能添加校准程序补偿电位器和ADC的误差// 简单的移动平均滤波实现 #define FILTER_SIZE 5 float voltage_filter[FILTER_SIZE]; uint8_t filter_index 0; float Filter_Voltage(float new_value) { voltage_filter[filter_index] new_value; filter_index (filter_index 1) % FILTER_SIZE; float sum 0; for(int i 0; i FILTER_SIZE; i) { sum voltage_filter[i]; } return sum / FILTER_SIZE; }6. 项目扩展与进阶应用这个基础项目可以扩展出许多有趣的应用方向以下是几个可能的扩展思路6.1 功能扩展建议多通道采集同时监测多个电位器或传感器数据记录添加SD卡模块记录电压变化历史无线传输通过蓝牙或WiFi将数据发送到手机或电脑阈值报警设置电压阈值触发LED或蜂鸣器报警6.2 进阶学习路径深入理解ADC原理采样定理、量化误差、信噪比探索不同传感器温度、光强、压力等模拟传感器学习高级滤波算法卡尔曼滤波、FIR/IIR数字滤波研究DMA传输提高ADC采样效率减少CPU开销// 使用DMA进行多通道ADC采集的示例代码 void ADC_DMA_Init(void) { DMA_InitTypeDef DMA_InitStructure; // 配置DMA DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)ADC1-DR; DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)adc_values; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize ADC_CHANNEL_COUNT; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode DMA_Mode_Circular; DMA_InitStructure.DMA_Priority DMA_Priority_High; DMA_InitStructure.DMA_M2M DMA_M2M_Disable; DMA_Init(DMA1_Channel1, DMA_InitStructure); // 使能DMA DMA_Cmd(DMA1_Channel1, ENABLE); // 配置ADC使用DMA ADC_DMACmd(ADC1, ENABLE); }在实际项目中我发现电位器的机械抖动会导致电压值轻微波动。通过实验比较采用移动平均滤波配合适当的采样间隔约100ms能在响应速度和稳定性之间取得良好平衡。对于需要更高精度的应用可以考虑使用精密多圈电位器或增加硬件滤波电路。

相关文章:

从传感器到屏幕:手把手教你用STM32的ADC读取电位器,并用OLED实时显示电压值

从传感器到屏幕:手把手教你用STM32的ADC读取电位器,并用OLED实时显示电压值 在嵌入式开发中,模拟信号的采集与处理是一个基础但极其重要的技能。想象一下,当你旋转一个电位器,屏幕上的数字随之实时变化,这种…...

明日方舟资源宝库:2000+高清素材如何改变你的创作游戏规则?

明日方舟资源宝库:2000高清素材如何改变你的创作游戏规则? 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 你是否曾为寻找高质量的游戏素材而苦恼?是…...

VSCode 2026多人编辑避坑清单:92%团队踩中的4个权限陷阱、3种光标同步失效根因及微软官方补丁编号(KB2026-RC4)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode 2026实时协作多人编辑方法概览 VSCode 2026 内置了原生增强的 Live Share 协议栈与 WebRTC 3.0 网络层&#xff0c;支持低延迟&#xff08;<120ms 端到端&#xff09;、端到端加密的多人协同…...

w3x2lni架构解析:魔兽地图格式转换的技术实现与性能优化

w3x2lni架构解析&#xff1a;魔兽地图格式转换的技术实现与性能优化 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni w3x2lni作为魔兽争霸III地图格式转换的核心工具&#xff0c;通过创新的Lni、Obj、Slk三格式转换…...

别再瞎改注册表了!Windows远程桌面60帧优化实测(Win10/Win11对比,含避坑清单)

Windows远程桌面60帧优化实战&#xff1a;从注册表陷阱到科学配置 远程桌面作为生产力工具的核心价值&#xff0c;在于能否提供接近本地的操作体验。当你在局域网环境中拖动窗口仍感到明显迟滞&#xff0c;或是观看培训视频时出现音画不同步&#xff0c;问题的根源往往在于未被…...

VSCode 2026远程开发响应延迟突增?你可能正触发微软刚修复的#11842竞态缺陷——3行配置紧急规避方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode 2026远程开发响应延迟突增现象确认 近期多个企业级远程开发团队反馈&#xff0c;升级至 VSCode 2026.1&#xff08;含 Remote-SSH v0.108 和 Dev Container v0.342&#xff09;后&#xff0c;编…...

3步彻底解决魔兽地图版本兼容性问题:w3x2lni专业指南

3步彻底解决魔兽地图版本兼容性问题&#xff1a;w3x2lni专业指南 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 你是否曾因魔兽争霸III版本更新而让精心制作的地图无法运行&#xff1f;w3x2lni正是解决这一痛点的…...

Unpaywall:3分钟解锁付费学术论文的终极免费工具

Unpaywall&#xff1a;3分钟解锁付费学术论文的终极免费工具 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors/un/unpaywall-extension …...

Taotoken多模型聚合平台为嵌入式系统提供稳定可靠的大模型调用方案

Taotoken多模型聚合平台为嵌入式系统提供稳定可靠的大模型调用方案 1. 嵌入式场景下的模型调用挑战 嵌入式系统与物联网设备在接入大模型服务时面临独特的工程挑战。这类设备通常运行在资源受限的环境中&#xff0c;网络连接可能不稳定&#xff0c;且难以频繁更新软件以适应A…...

Transformer模型模式崩溃问题分析与优化实践

1. 项目背景与问题定义最近在调试一个基于Transformer架构的生成式模型时&#xff0c;遇到了一个有趣的现象&#xff1a;当模型生成长文本时&#xff0c;会反复输出某些固定短语组合。比如每次生成故事结局都是"从此过上了幸福生活"&#xff0c;生成产品描述总会包含…...

便携无忧:PDF专业签章工具绿色单文件优势解析

在选择软件时&#xff0c;软件的安装方式也是一个重要的考虑因素。 有些软件需要复杂的安装过程&#xff0c;还会在系统里留下很多文件。 而PDF专业签章工具是绿色单文件版&#xff0c;不需要安装&#xff0c;下载就能用。 今天我们就来详细了解一下绿色单文件的优势。 首先是…...

从ChatGPT到CowAgent:AI Agent框架的部署与实战指南

1. 项目概述&#xff1a;从聊天机器人到超级AI助理的蜕变 如果你和我一样&#xff0c;在2023年左右就开始折腾各种大模型应用&#xff0c;那你大概率听说过或者用过 chatgpt-on-wechat 这个项目。它曾经是很多开发者将GPT能力接入微信、飞书等国内IM平台的首选方案。但如果你…...

LeaguePrank:英雄联盟玩家的终极个性化展示工具,3分钟打造专属游戏身份

LeaguePrank&#xff1a;英雄联盟玩家的终极个性化展示工具&#xff0c;3分钟打造专属游戏身份 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想让你的英雄联盟游戏界面与众不同吗&#xff1f;LeaguePrank为你提供了一套安全…...

Docker 27默认桥接网络已失效?2024年最新CVE-2024-27896漏洞应对方案,72小时内必须完成的5项配置

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Docker 27 网络隔离安全增强教程 Docker 27 引入了基于 eBPF 的细粒度网络策略引擎与默认启用的 --networknone 安全模式&#xff0c;显著强化容器间网络隔离能力。新版本要求显式声明网络连接&#xf…...

长沙心理医院指南:真实案例分享与暖心建议

行业痛点分析当前长沙心理健康服务面临多重技术与资源挑战。据《2023年湖南精神卫生服务白皮书》数据显示&#xff0c;长沙市每10万人口仅有2.3名执业心理医师&#xff0c;远低于国家推荐标准&#xff08;5名/10万&#xff09;。同时&#xff0c;64%的患者因“病耻感”或“认知…...

手机摄像头图像数据是怎么‘坐地铁’的?用MIPI D-PHY的VC(虚拟通道)和Lane管理打个比方

手机摄像头图像数据是怎么‘坐地铁’的&#xff1f;用MIPI D-PHY的VC&#xff08;虚拟通道&#xff09;和Lane管理打个比方 想象一下早高峰的地铁站&#xff1a;不同线路的列车在有限轨道上穿梭&#xff0c;乘客通过换乘通道有序分流。手机摄像头的数据传输也是如此——多个传感…...

Wecom酱完整指南:如何通过企业微信向微信推送消息

Wecom酱完整指南&#xff1a;如何通过企业微信向微信推送消息 【免费下载链接】wecomchan 微信推送服务Server酱的开源替代。通过企业微信向微信推送消息的配置文档、直推函数和可自行搭建的在线服务代码。 项目地址: https://gitcode.com/gh_mirrors/we/wecomchan Wec…...

从雷击到芯片:用Python仿真电磁波在导线中的传播(附代码)

从雷击到芯片&#xff1a;用Python仿真电磁波在导线中的传播&#xff08;附代码&#xff09; 电磁波在导线中的传播现象&#xff0c;既是高压输电线路防雷设计的核心问题&#xff0c;也是现代芯片设计中信号完整性分析的基础。当工程师面对雷击导致的过电压问题时&#xff0c;或…...

快速验证想法:用快马平台十分钟搭建阿里云盘文件管理原型

最近在做一个个人项目时&#xff0c;需要快速验证一个与云存储集成的想法。阿里云盘作为国内主流的云存储服务&#xff0c;提供了完善的开放API&#xff0c;正好能满足我的需求。不过从零开始搭建整个验证环境太费时间&#xff0c;于是尝试用InsCode(快马)平台来快速搭建原型&a…...

如何彻底清理Mac应用残留文件:Pearcleaner免费工具终极指南

如何彻底清理Mac应用残留文件&#xff1a;Pearcleaner免费工具终极指南 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经在Mac上删除应用后&#x…...

Altium Designer自定义快捷键设置全攻略:像高手一样一键切换布线层

Altium Designer自定义快捷键设置全攻略&#xff1a;像高手一样一键切换布线层 在PCB设计领域&#xff0c;效率提升往往隐藏在细节之中。当大多数用户还在用小键盘加减号或组合键切换布线层时&#xff0c;真正的设计高手早已通过自定义快捷键将这一操作优化到极致。想象一下&am…...

孩子感统/语言/专注力差?别瞎猜!持证测评师一对一,北思则帮你精准找到‘卡壳点’,训练不盲目~

“给孩子贴‘调皮’标签前&#xff0c;先做专业测评——持证测评师一对一&#xff0c;才能精准定位感统、语言、专注力的真正卡点”——很多家长凭“孩子不爱说话”“坐不住”就判断问题&#xff0c;却不知背后可能是感统失调、语言逻辑弱等不同成因。行业数据显示&#xff0c;…...

科研党必备:用Yalmip+Gurobi为你的MATLAB装上优化求解“最强引擎”

科研效率革命&#xff1a;YalmipGurobi在MATLAB中的高阶优化实践 第一次接触Yalmip时&#xff0c;我正在实验室熬夜调试一个电力系统优化模型。MATLAB自带的求解器已经运行了三个小时&#xff0c;进度条依然纹丝不动。隔壁工位的博士师兄走过来&#xff0c;轻描淡写地说&#x…...

LangBot:企业级智能对话机器人构建平台实战指南

1. 项目概述&#xff1a;从零到一&#xff0c;构建企业级智能对话机器人如果你正在为 Slack、Discord 或者企业微信里的客服问题头疼&#xff0c;或者想给团队内部搞一个能查文档、能跑流程的智能助手&#xff0c;但又不想从零开始造轮子&#xff0c;那你来对地方了。LangBot 这…...

嵌入式系统PRCM模块:电源、复位与时钟管理核心技术

1. PRCM基础编程模型解析&#xff1a;嵌入式系统的电源管理核心在嵌入式系统设计中&#xff0c;电源、复位和时钟管理&#xff08;PRCM&#xff09;模块堪称设备稳定运行的"中枢神经系统"。这个看似简单的模块实际上承担着三大关键职能&#xff1a;确保设备上电时的有…...

别再死记硬背了!用这5个真实实验场景,帮你彻底搞懂华为VRP命令

华为VRP命令实战&#xff1a;5个真实场景带你从入门到精通 刚接触华为VRP系统的工程师常陷入一个误区——把命令手册当圣经逐条背诵。我曾见过一位学员在模拟器上反复输入display version&#xff0c;却在实际组网时连最基本的OSPF邻居都建立不起来。真正高效的网络技能提升&am…...

AMD锐龙笔记本降压超频避坑指南:从PBO设置到Prime95烤机,一次讲清所有细节

AMD锐龙笔记本降压超频实战手册&#xff1a;原理剖析与精准调校 在性能与功耗的平衡木上&#xff0c;AMD锐龙移动处理器用户常面临两难选择——要么忍受高温降频带来的性能损失&#xff0c;要么接受风扇狂转的噪音困扰。而降压超频&#xff08;Undervolting&#xff09;这项源自…...

VSCode AI编程助手FlexPilot:从智能代码生成到实战配置全解析

1. 项目概述&#xff1a;一个AI驱动的VSCode智能编程伴侣如果你和我一样&#xff0c;每天大部分时间都泡在Visual Studio Code里&#xff0c;那你肯定也经历过这样的时刻&#xff1a;面对一个复杂的重构任务&#xff0c;或者一个陌生的API&#xff0c;需要频繁地在浏览器、文档…...

为什么92%的开发者在VSCode 2026中插件失败?——大模型上下文管理、Token流控与状态持久化三大致命陷阱揭秘

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode 2026大模型插件开发全景概览 随着大语言模型&#xff08;LLM&#xff09;能力持续下沉至开发者工具链&#xff0c;VSCode 在 2026 版本中正式将 LLM 原生支持纳入核心扩展平台——通过 vscode-…...

告别卡顿!手把手教你用SuperMap iDesktop优化BIM模型(附厂房/楼宇实战参数)

工业级BIM模型性能优化实战&#xff1a;从Revit到SuperMap的高效处理指南 当你在深夜加班时&#xff0c;突然发现导入SuperMap的厂房BIM模型在场景中卡成幻灯片——这种崩溃感我太熟悉了。去年处理某汽车工厂项目时&#xff0c;一个包含20万构件的Revit模型让顶配显卡的帧率直接…...