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

STM32F103用CubeMX实现ADC欠采样:用800Hz采样率捕获1kHz正弦波(附工程源码)

STM32F103实战用CubeMX配置ADC欠采样捕获1kHz正弦波在嵌入式系统开发中ADC采样是获取模拟信号的关键技术。传统采样理论告诉我们采样频率必须至少是信号最高频率的两倍奈奎斯特采样定理但欠采样技术却打破了这一常规认知。本文将手把手教你如何在STM32F103平台上通过CubeMX配置TIM触发ADC实现用800Hz采样率捕获1kHz正弦波信号的完整过程。1. 硬件准备与环境搭建1.1 所需硬件清单STM32F103C8T6最小系统板Blue Pill开发板USB转TTL串口模块用于VOFA数据可视化信号发生器或能输出1kHz正弦波的任何设备示波器可选用于验证信号质量杜邦线若干1.2 软件工具准备STM32CubeMX版本6.5.0或更高Keil MDK-ARM或STM32CubeIDEVOFA串口数据可视化工具串口调试助手如Putty提示VOFA是一款功能强大的串口数据可视化工具支持多种协议和显示方式特别适合嵌入式开发中的实时数据展示。2. CubeMX工程配置详解2.1 时钟树配置STM32F103的ADC时钟最大为14MHz我们需要合理配置系统时钟选择外部高速时钟HSE设置系统时钟为72MHzAPB2总线时钟设为72MHzADC挂载在此总线上ADC预分频设为6得到12MHz的ADC时钟// 时钟树关键配置CubeMX自动生成 RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL RCC_PLL_MUL9;2.2 ADC配置步骤启用ADC1选择通道如通道0配置为Regular Conversion模式设置数据对齐为右对齐扫描模式禁用单通道连续转换模式禁用由TIM触发DMA设置启用DMA连续请求循环模式// ADC初始化结构体关键参数 hadc1.Instance ADC1; hadc1.Init.ScanConvMode DISABLE; hadc1.Init.ContinuousConvMode DISABLE; hadc1.Init.ExternalTrigConv ADC_EXTERNALTRIGCONV_T3_TRGO; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion 1;2.3 定时器TIM3配置定时器用于精确控制ADC采样间隔关键参数计算目标采样率800Hz定时器时钟72MHz分频计算72MHz / (1000 * 90) 800Hz具体配置选择TIM3时钟源选择内部时钟Prescaler(PSC)设为1000-1Counter Period(ARR)设为90-1触发输出(TRGO)选择更新事件// TIM3初始化结构体 htim3.Instance TIM3; htim3.Init.Prescaler 999; htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 89; htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1;2.4 DMA配置DMA用于高效传输ADC数据避免CPU干预添加DMA通道ADC1模式选择循环模式数据宽度半字ADC为12位内存地址递增外设到内存传输// DMA配置结构体 hdma_adc1.Instance DMA1_Channel1; hdma_adc1.Init.Direction DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc DMA_PINC_DISABLE; hdma_adc1.Init.MemInc DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.Mode DMA_CIRCULAR;3. 欠采样原理深入解析3.1 传统采样与欠采样对比采样类型采样率要求适用场景优点缺点传统采样≥2倍信号频率低频信号实现简单高频信号需要极高采样率欠采样可低于信号频率高频信号降低硬件要求需要精确同步3.2 欠采样数学原理欠采样本质上是利用了信号的周期性。对于1kHz正弦波信号周期1ms采样间隔1.25ms800Hz采样率相位增量360° × (1.25ms/1ms) 450° 90°模360°这样每次采样点相当于在信号周期上移动90°四个采样点就能完整重构一个周期。3.3 实际应用中的限制信号稳定性被测信号必须严格周期稳定时钟精度定时器触发必须精确相位同步采样起始点影响重构效果噪声影响高频噪声可能导致混叠注意欠采样不适用于非周期信号或宽带信号仅适用于单一频率或窄带信号。4. 代码实现与调试技巧4.1 主程序关键代码#define ADC_BUF_LEN 256 uint16_t adcBuffer[ADC_BUF_LEN]; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_TIM3_Init(); HAL_TIM_Base_Start(htim3); HAL_ADC_Start_DMA(hadc1, (uint32_t*)adcBuffer, ADC_BUF_LEN); while (1) { // 数据通过DMA自动传输主循环可处理其他任务 } }4.2 VOFA数据可视化配置串口参数115200bps, 8N1协议选择Float模式添加波形显示控件设置X轴时间范围为4ms显示4个周期# VOFA数据格式示例Python模拟 import serial import math import time ser serial.Serial(COM3, 115200) for i in range(1000): t i * 0.00125 # 800Hz采样率 phase (t % 0.001) / 0.001 * 2 * math.pi # 1kHz信号相位 value math.sin(phase) * 1000 2048 # 模拟ADC值 ser.write(struct.pack(f, float(value))) time.sleep(0.00125)4.3 常见问题排查无数据输出检查DMA是否启用验证TIM是否触发ADC确认串口连接正确波形失真检查信号发生器输出是否纯净验证采样时钟精度调整VOFA显示参数数据跳变确保ADC参考电压稳定检查电路接地适当添加硬件滤波5. 工程优化与扩展应用5.1 性能优化建议内存优化合理设置DMA缓冲区大小使用双缓冲技术减少处理延迟精度提升添加硬件抗混叠滤波器使用ADC过采样技术提高分辨率校准ADC参考电压实时性改进利用ADC中断处理关键数据优化DMA传输策略5.2 扩展应用场景电力监测工频信号分析音频处理特定频率成分提取无线通信窄带信号解调传感器接口谐振式传感器读取5.3 进阶实验建议尝试捕获更高频率信号如10kHz实现多通道交替采样添加数字滤波算法改善信号质量探索等效采样率与信号频率的关系在实际项目中我发现TIM触发ADC的同步精度对欠采样效果影响极大。当需要捕获更高频率信号时可以考虑使用硬件触发信号替代定时器或者使用STM32的更高级型号如F4系列提供更高精度的时钟源。

相关文章:

STM32F103用CubeMX实现ADC欠采样:用800Hz采样率捕获1kHz正弦波(附工程源码)

STM32F103实战:用CubeMX配置ADC欠采样捕获1kHz正弦波 在嵌入式系统开发中,ADC采样是获取模拟信号的关键技术。传统采样理论告诉我们,采样频率必须至少是信号最高频率的两倍(奈奎斯特采样定理),但欠采样技术…...

5个你必须知道的UserAgent-Switcher实战技巧:轻松伪装你的浏览器身份

5个你必须知道的UserAgent-Switcher实战技巧:轻松伪装你的浏览器身份 【免费下载链接】UserAgent-Switcher A User-Agent spoofer browser extension that is highly configurable 项目地址: https://gitcode.com/gh_mirrors/us/UserAgent-Switcher 你是否曾…...

你的通信数据可靠吗?用STM32F103的硬件CRC模块给串口数据加个“保险”

STM32硬件CRC校验:为串口通信打造数据防护盾 在工业自动化、物联网设备通信等场景中,哪怕一个比特的错误都可能导致系统崩溃。去年我们团队就遇到过这样的案例:某生产线上的传感器数据因为电磁干扰发生位翻转,由于缺乏有效的校验机…...

蔚蓝档案自动化脚本:从手动肝游到智能托管的技术革命

蔚蓝档案自动化脚本:从手动肝游到智能托管的技术革命 【免费下载链接】blue_archive_auto_script 支持按轴凹总力战, 无缝制造三解, 用于实现蔚蓝档案自动化的程序( Steam已适配 ) 项目地址: https://gitcode.com/gh_mirrors/bl/blue_archive_auto_script 每…...

保姆级教程:在Ubuntu 20.04上为ARM开发板交叉编译GStreamer 1.14.0(含所有依赖库)

ARM嵌入式开发实战:Ubuntu 20.04下GStreamer 1.14.0全依赖链交叉编译指南 当我们需要在资源受限的ARM开发板上实现高效多媒体处理时,GStreamer往往是首选框架。但将其成功移植到嵌入式平台,需要穿越复杂的依赖迷宫。本文将手把手带你完成从零…...

终极指南:ExplorerPatcher一键解决Windows 10开始菜单关闭延迟问题

终极指南:ExplorerPatcher一键解决Windows 10开始菜单关闭延迟问题 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 你是否曾经遇到…...

Phi-4-mini-flash-reasoning零基础上手:无需代码的推理任务执行流程

Phi-4-mini-flash-reasoning零基础上手:无需代码的推理任务执行流程 1. 认识Phi-4-mini-flash-reasoning Phi-4-mini-flash-reasoning是一款专为文本推理任务优化的轻量级AI模型,特别适合需要逐步分析和逻辑推导的场景。不同于常见的聊天机器人&#x…...

终极指南:用Easy-Scraper在3分钟内掌握Rust网页数据提取

终极指南:用Easy-Scraper在3分钟内掌握Rust网页数据提取 【免费下载链接】easy-scraper Easy scraping library 项目地址: https://gitcode.com/gh_mirrors/ea/easy-scraper 想象一下,你正在构建一个新闻聚合应用,需要从几十个不同的网…...

BililiveRecorder终极指南:快速掌握B站直播录制完整方案

BililiveRecorder终极指南:快速掌握B站直播录制完整方案 【免费下载链接】BililiveRecorder 录播姬 | mikufans 生放送录制 项目地址: https://gitcode.com/gh_mirrors/bi/BililiveRecorder BililiveRecorder是一款专门为B站直播设计的开源录播工具&#xff…...

当UEBA遇上零信任:实战中如何用行为分析加固你的身份安全防线?

当UEBA遇上零信任:实战中如何用行为分析加固你的身份安全防线? 想象一下,某天凌晨三点,你的财务总监账号突然从境外IP登录,批量下载了所有客户合同。传统安全系统可能只会记录这次登录,而零信任架构下的UEB…...

AI时代开发者角色重构与能力升级

1. 职业变革中的开发者角色重构最近三年,我亲眼见证了一个运维团队从15人缩减到3人的全过程——不是被裁员,而是因为自动化工具接管了80%的日常运维工作。这让我开始思考:当AI开始自动生成代码、调试程序甚至设计架构时,开发者这个…...

MobaXterm文件传输失败?可能是Ubuntu的SSH安全设置搞的鬼(解决方案+避坑指南)

MobaXterm文件传输失败的深度排查与Ubuntu SSH安全配置优化指南 当你兴致勃勃地用MobaXterm连接Ubuntu服务器准备大展拳脚时,突然发现文件传输功能罢工了——这种场景对于开发者和运维人员来说再熟悉不过。本文将带你深入剖析问题根源,并提供一套完整的…...

终极指南:如何用BilibiliCommentScraper批量获取B站完整评论数据?[特殊字符]

终极指南:如何用BilibiliCommentScraper批量获取B站完整评论数据?🚀 【免费下载链接】BilibiliCommentScraper B站视频评论爬虫 Bilibili完整爬取评论数据,包括一级评论、二级评论、昵称、用户ID、发布时间、点赞数 项目地址: h…...

如何让AMD显卡也能运行CUDA应用:ZLUDA的跨平台兼容解决方案

如何让AMD显卡也能运行CUDA应用:ZLUDA的跨平台兼容解决方案 【免费下载链接】ZLUDA CUDA on AMD GPUs 项目地址: https://gitcode.com/gh_mirrors/zlu/ZLUDA 你是否曾经因为手头的AMD显卡无法运行心仪的CUDA应用而感到沮丧?在GPU计算的世界里&…...

别再复制粘贴了!用STM32CubeMX LL库玩转按键、LED和蜂鸣器,这才是高效开发

STM32CubeMX LL库实战:解锁寄存器级高效开发的5个关键策略 当你第一次在STM32项目中使用HAL库时,可能会被它的易用性所吸引——简单的API调用就能完成复杂的外设配置。但当你深入项目开发,特别是对性能有严格要求时,HAL库的抽象层…...

格拉吉布(Glasdegib)适合哪些AML患者?适应症与适用人群

急性髓系白血病(AML)是一种起源于造血干细胞的恶性克隆性疾病,其特点是骨髓与外周血中原始和幼稚髓性细胞异常增生,病情进展迅速,尤其是对于老年或体质虚弱的患者,治疗选择极为有限。格拉吉布(G…...

现代化Windows游戏工具箱架构解析:Snap.Hutao核心原理与生产环境部署指南

现代化Windows游戏工具箱架构解析:Snap.Hutao核心原理与生产环境部署指南 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Tr…...

保姆级教程:用QMT的xtdata模块把A股分钟级数据下载到本地(附完整代码)

量化交易实战:QMT本地分钟级数据全流程指南 在量化交易领域,数据如同燃料,而本地化存储则是确保引擎稳定运转的关键。对于刚接触QMT平台的开发者来说,如何高效获取并管理A股分钟级数据往往成为第一个需要攻克的难题。本文将彻底解…...

Lychee Rerank MM实战案例:短视频平台封面图+文案Query匹配视频描述重排

Lychee Rerank MM实战案例:短视频平台封面图文案Query匹配视频描述重排 你是不是也遇到过这种情况?在短视频平台刷到一个视频,封面图很吸引人,标题文案也写得不错,但点进去一看,视频内容和封面、标题完全不…...

Postman最新版汉化教程:一键替换语言包实现中文界面(Windows/Mac通用)

Postman最新版汉化实战:从资源提取到安全替换的全流程指南 每次打开Postman时面对满屏英文菜单的茫然感,我太熟悉了——三年前接手第一个API项目时,我花了整整两周才记住各个功能的位置。现在,只需20分钟的系统性操作就能让界面变…...

手把手教你:如何将屏厂给的MIPI初始化代码转换成RK3588的DTS配置(附完整转换示例)

从屏厂初始化代码到RK3588 DTS配置的完整转换指南 调试RK3588平台的MIPI屏幕时,最关键的环节之一就是正确配置屏幕的初始化时序。屏厂通常会提供各种格式的初始化代码,而开发者需要将这些代码转换为RK3588 DTS中标准的panel-init-sequence格式。这个过程…...

FPGA实现UDP/IP协议栈,为什么我建议你从校验和与ARP缓存设计开始?

FPGA实现UDP/IP协议栈:从校验和与ARP缓存设计的核心陷阱突破 在FPGA上实现完整的UDP/IP协议栈时,许多开发者往往陷入一个误区——过早关注协议格式解析而忽视底层关键模块的健壮性设计。本文将聚焦两个最容易被低估却决定系统稳定性的核心组件&#xff1…...

别再死记硬背编译原理了!用Java手搓一个DFA字符串识别器(附完整源码)

用Java实现DFA字符串识别器:从理论到实战的编译原理实践 编译原理作为计算机科学的核心课程之一,常常让学习者感到抽象难懂。特别是有限自动机(DFA)这类概念,如果仅停留在理论层面,很难真正掌握其精髓。本文…...

从‘Hello World’到‘Hello AI’:用ESP32和TensorFlow Lite做个会呼吸的灯(附完整代码)

从‘Hello World’到‘Hello AI’:用ESP32和TensorFlow Lite打造智能呼吸灯实战指南 1. 为什么嵌入式开发者需要尝试TinyML? 记得第一次点亮LED时的兴奋吗?那种"Hello World"级别的成就感,正是推动我们不断探索技术的原…...

生成式AI伦理测试:偏见检测——软件测试从业者的专业视角与实战指南

随着生成式人工智能在内容创作、代码生成、测试用例设计等领域的深度应用,其潜在的伦理风险,尤其是偏见问题,已成为软件测试从业者必须正视的核心挑战。偏见并非简单的功能缺陷,而是深植于数据、算法及交互过程中的系统性不公平现…...

点亮你的OAK-D-Pro:手把手教你用Python API控制点阵光与红外补光灯

点亮你的OAK-D-Pro:手把手教你用Python API控制点阵光与红外补光灯 当你在昏暗或无纹理环境中使用OAK-D-Pro进行深度感知时,是否遇到过深度图质量下降的问题?这款设备的秘密武器——可编程控制的点阵光和红外补光灯,正是为解决这类…...

告别Errno 5!手把手教你用Rufus制作NTFS格式Ubuntu 22.04安装U盘(解决输入/输出错误)

彻底解决Ubuntu安装中的Errno 5错误:NTFS格式U盘制作全指南 当你在Windows电脑上尝试安装Ubuntu双系统时,是否遇到过这样的场景:试用模式一切正常,但正式安装时却突然弹出"[Errno 5] Input/output error"的错误提示&am…...

从PRACH前导码规划到5G NR:聊聊ZC序列那些“坑”与网络优化实战经验

从PRACH前导码规划到5G NR:聊聊ZC序列那些“坑”与网络优化实战经验 在4G/5G网络优化中,PRACH前导码规划就像给小区分配独特的"门牌号"——如果设计不当,用户设备连敲门都找不到正确的入口。我曾亲眼见过某省会城市CBD区域因ZC序列…...

别再傻傻分不清:Linux里的TTY、PTS和PTY到底啥关系?一个SSH登录就讲明白

从SSH登录解密Linux终端:TTY、PTS与PTY的协作之谜 当你通过SSH连接到Linux服务器,输入who命令看到pts/0时,是否好奇过这个标识背后的技术逻辑?终端窗口左上角显示的tty1与远程会话中的pts/0究竟有何不同?这些看似简单的…...

Rust的#[derive(PartialEq, Eq)]派生宏与等价关系在自定义类型中的一致性

Rust语言中的类型系统以其严谨性著称,而#[derive(PartialEq, Eq)]派生宏则为自定义类型的等价关系提供了优雅的实现方式。等价关系是数学中的基本概念,要求满足自反性、对称性和传递性。在编程中,正确实现这些性质对于数据比较、集合操作等场…...