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

STM32开发板上生成PWM正弦波

在STM32开发板上生成正弦波通常需要结合定时器(TIM)、数模转换器(DAC)或脉宽调制(PWM)以及时钟系统的配置。以下是分步指南:


方法1:使用DAC + 定时器(推荐)

步骤1:配置时钟系统
  1. 使用STM32CubeMX或直接配置寄存器,确保系统时钟(SYSCLK)足够高(例如72MHz)。
  2. 配置定时器的时钟源(如APB1或APB2总线时钟)。
    • 例如,若使用APB1定时器(TIM6/TIM7),时钟频率为72MHz。
步骤2:生成正弦波数据表
  1. 计算一个正弦周期内的采样点,例如200个点。
    #define SIN_SAMPLES 200
    uint32_t sin_table[SIN_SAMPLES];
    for (int i = 0; i < SIN_SAMPLES; i++) {sin_table[i] = (uint32_t)(2048 * (1 + sin(2 * M_PI * i / SIN_SAMPLES))); // 12-bit DAC范围:0-4095
    }
    
步骤3:配置DAC
  1. 启用DAC通道(例如DAC1通道1)。
  2. 配置DAC为定时器触发模式:
    HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sin_table, SIN_SAMPLES, DAC_ALIGN_12B_R);
    
步骤4:配置定时器
  1. 设置定时器为触发DAC的更新事件:
    • 定时器频率 = 正弦波频率 × 采样点数。
    • 例如,生成1kHz正弦波,采样200点,定时器频率需为200kHz。
    htim6.Instance = TIM6;
    htim6.Init.Prescaler = 72 - 1;      // 72MHz / 72 = 1MHz
    htim6.Init.Period = 5 - 1;          // 1MHz / 5 = 200kHz
    HAL_TIM_Base_Init(&htim6);
    HAL_TIM_Base_Start(&htim6);
    
步骤5:启动DAC和定时器
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sin_table, SIN_SAMPLES, DAC_ALIGN_12B_R);

方法2:使用PWM + 低通滤波器

步骤1:配置PWM定时器
  1. 设置定时器为PWM模式(例如TIM1或TIM3)。
  2. 调整PWM频率(载波频率建议在20kHz以上以简化滤波):
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 72 - 1;     // 72MHz / 72 = 1MHz
    htim3.Init.Period = 50 - 1;        // 1MHz / 50 = 20kHz
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
    
步骤2:生成正弦波占空比表
#define SIN_SAMPLES 200
uint16_t pwm_table[SIN_SAMPLES];
for (int i = 0; i < SIN_SAMPLES; i++) {pwm_table[i] = (uint16_t)(25 * (1 + sin(2 * M_PI * i / SIN_SAMPLES))); // 占空比0-50(对应0-100%)
}
步骤3:动态更新PWM占空比

使用定时器中断或DMA更新占空比:

// 在定时器中断中更新CCR
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {static uint8_t idx = 0;__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm_table[idx]);idx = (idx + 1) % SIN_SAMPLES;
}
步骤4:添加低通滤波器

在PWM输出引脚后连接RC低通滤波器(截止频率略高于目标正弦波频率)。


关键公式

  • 正弦波频率计算

    • DAC方法:正弦波频率 = 定时器触发频率 / 采样点数
    • PWM方法:正弦波频率 = 定时器更新频率 / 采样点数
  • 定时器频率计算

    • 定时器频率 = 输入时钟 / (Prescaler + 1) / (Period + 1)

注意事项

  1. 确保时钟树配置正确(使用STM32CubeMX可视化配置)。
  2. DMA可大幅降低CPU负载,推荐使用。
  3. 调整采样点数和滤波电路以优化波形质量。

通过上述步骤,即可在STM32开发板上输出高质量的正弦波。


STM32正弦波生成原理硬核总结


1. 核心原理
  • 数字信号离散化:将连续正弦波按奈奎斯特定理采样离散化,采样频率需≥2倍信号频率(实际工程中通常取5~10倍)。
  • 信号重建机制
    • DAC法:通过数模转换器直接输出量化后的电压值,实现信号重建。
    • PWM法:利用占空比的等效面积原理(Voltage-Second Balance),通过低通滤波器提取基波分量。

2. 硬件模块深度解析
(1) DAC模块
  • 工作模式
    • 单次触发:CPU手动更新数据(低效)
    • DMA循环模式:定时器触发DAC,DMA自动搬运波形表(零CPU开销)
    • 双缓冲模式:交替更新波形表,避免输出毛刺
  • 关键参数
    • 转换时间:STM32F4 DAC转换时间最低可达1μs(对应1MSPS)
    • 量化误差:12位DAC理论信噪比SNR=74dB(SNR=6.02N+1.76)
(2) PWM模块
  • 调制机制
    • 定时器CNT与CCRx比较产生可变占空比方波
    • 占空比分辨率:Resolution = log2(TIM_CLK / PWM_Freq)
    • 例如:72MHz时钟,20kHz PWM → 12位分辨率
  • 频谱特性
    • 输出频谱 = 基波 + 载波频率谐波
    • 滤波器需抑制载波频率(如20kHz)及其边带
(3) 时钟系统
  • 关键路径
    HSE → PLL → SYSCLK → APBx Prescaler → TIMx_CLK
    
  • 时钟精度影响
    • 频率误差:Δf = ±0.25%(工业级晶振典型值)
    • 长期稳定性:需考虑温漂(±50ppm/℃)

3. 数学建模
(1) 采样定理实现
  • 设目标频率f_signal,采样点数N,则:
    • 定时器触发频率:f_trigger = N * f_signal
    • 重建信号带宽:f_max = f_trigger / 2(受限于DAC/PWM响应)
(2) 波形量化误差
  • 量化台阶:ΔV = V_ref / (2^N - 1)
  • 总谐波失真(THD):
    THD ≈ 20*log10(ΔV/(2√2))  // 假设理想正弦波
    
    12位DAC理论THD≈-72dB
(3) PWM等效电压
  • 输出电压:V_avg = (CCRx / ARR) * V_dd
  • 纹波电压:V_ripple = (V_dd * T_pwm) / (8RC)(一阶RC滤波)

4. 关键设计参数
参数DAC法公式PWM法公式
定时器周期ARR = (TIM_CLK / f_trigger) - 1ARR = (TIM_CLK / f_pwm) - 1
最大信号频率f_max = TIM_CLK / (2*N)f_max = 1/(2πRC)(滤波器限制)
功耗优化点关闭未用模拟电路优化死区时间降低开关损耗

5. 误差源分析
误差类型DAC法影响PWM法影响
时钟抖动导致采样时间不确定性(孔径抖动)引起占空比调制误差
量化噪声白噪声基底,-74dB(12bit)台阶式失真,需dithering改善
非线性误差INL/DNL影响波形保真度死区时间导致谐波畸变
滤波器相位延迟无(直接输出)引入群延迟,影响实时性

6. 高阶优化技术
  • 过采样与插值
    • 4×过采样可将有效位数提升1bit
    • 使用Cubic插值算法平滑波形
  • Σ-Δ调制
    • 将PWM升级为1位Σ-Δ流,通过噪声整形降低带内噪声
  • 动态波形更新
    • 双缓冲DMA实现波形表无缝切换
    • 实时计算波形(如使用CORDIC算法)

7. 实测验证要点
  1. 频谱分析
    • 使用FFT观察THD(Total Harmonic Distortion)
    • DAC法典型THD<1%,PWM法THD≈3-5%(受滤波器影响)
  2. 瞬态响应测试
    • 阶跃响应测试重建滤波器性能
  3. 长期稳定性
    • 持续运行24小时监测频率漂移

设计选择决策树

是否需要高压/大电流输出?
├── 是 → 选择PWM+功率驱动电路
└── 否 → ├── 要求高波形质量? │   ├── 是 → 选择DAC+抗混叠滤波器│   └── 否 → 选择PWM+简易RC滤波└── 需要多通道同步?├── 是 → 使用TIM主从模式同步多个DAC└── 否 → 独立通道实现

通过上述硬核原理分析,开发者可深入理解STM32正弦波生成的本质矛盾(速度vs精度),并根据应用场景选择最优实现方案。

相关文章:

STM32开发板上生成PWM正弦波

在STM32开发板上生成正弦波通常需要结合定时器&#xff08;TIM&#xff09;、数模转换器&#xff08;DAC&#xff09;或脉宽调制&#xff08;PWM&#xff09;以及时钟系统的配置。以下是分步指南&#xff1a; 方法1&#xff1a;使用DAC 定时器&#xff08;推荐&#xff09; 步…...

量子计算与人工智能融合的未来趋势

最近研学过程中发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。 在当今科技飞速发展…...

关于登录鉴权session、cookie和token

一、cookie是用来解决什么问题的&#xff1f; 假如现有业务需求&#xff1a;当浏览器发起一个url请求之后&#xff0c;在一个会话周期内&#xff0c;服务端需要判断这个用户是否第一次发起请求&#xff0c;第一次请求展示的页面跟第N次请求需要响应的页面不同的。现在我们大部分…...

206. 反转链表 92. 反转链表 II 25. K 个一组翻转链表

leetcode Hot 100系列 文章目录 一、翻转链表二、反转链表 II三、K 个一组翻转链表总结 一、翻转链表 建立pre为空&#xff0c;建立cur为head&#xff0c;开始循环&#xff1a;先保存cur的next的值&#xff0c;再将cur的next置为pre&#xff0c;将pre前进到cur的位置&#xf…...

实时内核稳定性 - scheduling while atomic

scheduling while atomic问题 根因:未成对使用获取cpu_id的函数[ 291.881071][ 0] [XW]: type=0x00000003 cpuid=4 time=1725877230 subj...

离线语音识别 ( 小语种国家都支持)可定制词组

1产品介绍 离线语音模组采用神经网络算法&#xff0c;支持语音识别、自学习等功能。运用此模组将 AI 技 术赋能产品&#xff0c;升级改造出语音操控的智能硬件 ( 例如风扇、台灯、空调、马桶、按摩椅、运 动相机、行车记录仪等 ) 。支持全球多种语言识别&#xff0c;如中文…...

网络华为HCIA+HCIP 策略路由,双点双向

目录 路由策略&#xff0c;策略路由 策略路由优势 策略路由分类 接口策略路由 双点双向 双点双向路由引入特点: 联系 路由回灌和环路问题 路由策略&#xff0c;策略路由 路由策略:是对路由条目进行控制&#xff0c;通过控制路由条目影响报文的转发路径&#xff0c;即路…...

【面试篇】JVM

文章目录 一、JVM 内存结构1. 请详细描述 JVM 的内存结构&#xff0c;各个区域的作用是什么&#xff1f;2. 堆内存是如何划分的&#xff1f;新生代和老年代的比例是多少&#xff1f;3. Eden 区和 Survivor 区的作用是什么&#xff1f;它们之间是如何协作的&#xff1f;4. 方法区…...

【TI MSPM0】ADC DAC学习

一、样例展示 通过ADC0触发单次采样&#xff0c;如果采样结果大于0.5倍的VDD&#xff0c;就点亮LED 否则熄灭LED 编译加载运行这个历程&#xff0c;提供一个电压到A0_2引脚上,电压范围在0-VCC之间同时观察LED1.在上电后&#xff0c;默认将ADC配置到正确的引脚模式&#xff0c;…...

Cesium系列:从入门到实践,打造属于你的3D地球应用

一、Cesium简介 CesiumJS 是一个开源的 JavaScript 库&#xff0c;它能够帮助开发者创建出具有卓越性能、高精度、出色视觉质量和易用性的世界级 3D 地球仪和地图。无论是在航空航天领域&#xff0c;用于模拟飞行路径和展示卫星数据&#xff1b;还是在智能城市中&#xff0c;用…...

笔记1——数据通信网络基础

一、概述 数据通信网络&#xff1a;由路由器、交换机、防火墙、无线设备以终端构成的网络 功能&#xff1a;实现数据互通 二、网络设备 交换机&#xff1a; 特点&#xff1a;距离终端用户最近的设备 作用&#xff1a;终端接入、二层交换机 广播域:交换机连接的终端构成一个广播…...

Linux系统程序设计:从入门到高级Day01

知识点1 【系统调用】 系统调用的概述 系统调用&#xff1a;内核 提供给 用户 可以 操作内核 的一组函数接口 关系&#xff1a;用户 借助 系统调用 操作内核 进程的空间分为&#xff1a;内核空间 和 用户空间 用户一般都是在用户空间操作的&#xff0c;但是有的时候用户需要…...

openEuler24.03 LTS下安装HBase集群

前提条件 安装好Hadoop完全分布式集群&#xff0c;可参考&#xff1a;openEuler24.03 LTS下安装Hadoop3完全分布式 安装好ZooKeeper集群&#xff0c;可参考&#xff1a;openEuler24.03 LTS下安装ZooKeeper集群 HBase集群规划 node2node3node4MasterBackup MasterRegionServ…...

关于testng.xml无法找到类的问题

问题&#xff1a;testng.xml添加测试类的时候飘红 解决办法&#xff1a; 1.试图通过自动生成testng.xml插件去解决&#xff0c;感觉也不是这个问题&#xff0c;没有尝试&#xff1b; 2.以为是创建包的方式不对&#xff0c;重新删除后新建--还是找不到 想新建类的时候发现从m…...

数据结构:探秘AVL树

本节重点 理解AVL树的概念掌握AVL树正确的插入方法利用_parent指针正确更新平衡因子掌握并理解四种旋转方式&#xff1a;左单旋&#xff0c;右单旋&#xff0c;左右双旋&#xff0c;右左双旋 一、AVL树的概念 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&…...

Linux 入门:基础开发工具(上)vim,gcc/g++,make/makefile

目录 一.软件包管理器 一&#xff09;.软件包 二&#xff09;.安装软件 三&#xff09;.删除软件 二.编辑器vim 一&#xff09;.vim的基本介绍 1.正常/普通/命令模式(Normal mode) 2.插入模式(Insert mode) 3.底行模式(last line mode) 二&#xff09;.vim的基本操作 …...

计算机科学基础设施之数学:科研工具、资源与环境详介

李升伟 整理 数学科研涉及广泛的工具、资源和环境&#xff0c;涵盖从理论分析到数值模拟、从数据获取到论文发表的各个环节。以下是对数学科研中常用工具、资源和环境的详细介绍&#xff1a; 一、数学科研工具 1. 文献检索与管理工具 Google Scholar&#xff1a;全球最大的…...

Turtle事件处理(键盘与鼠标交互)

Turtle 提供了 事件驱动编程,允许我们使用 键盘 和 鼠标 控制 Turtle,从而实现交互式绘图。例如,我们可以让 Turtle 响应 按键、鼠标点击 和 拖动 事件,使其根据用户的输入进行移动、旋转或绘制图形。 1. 事件机制概述 Turtle 的事件处理主要依赖 turtle.Screen() 提供的 …...

5、无线通信基站的FPGA实现架构

基站&#xff08;Base Station&#xff0c;BS&#xff09;&#xff0c;也称为公用移动通信基站&#xff0c;是无线电台站的一种形式&#xff0c;具体则指在一定的无线电覆盖区中&#xff0c;通过移动通信交换中心&#xff0c;与移动电话终端之间的信息传递的无线电收发信电台。…...

关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析,包括语法、功能、锁机制、使用场景及示例代码

以下是关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析&#xff0c;包括语法、功能、锁机制、使用场景及示例代码&#xff1a; 1. UPDATE 语句 功能 直接修改数据&#xff1a;立即更新表中的数据&#xff0c;并提交修改。无显式锁&#xff1a;虽然会自动加锁&#xff…...

Linux2 CD LL hostnamectl type mkdir dudo

查看主机名信息 设置静态主机名 同时配置静态、瞬时主机名 下载Vmware tools https://blog.csdn.net/qq_34638161/article/details/102779721 mkdir创建目录 问题&#xff1a;为什么在root目录下 看不到 /var /usr那些文件夹...

Docker容器部署Java项目的自动化脚本(Shell编写)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Docker容器部署Java项目的自动化脚本&#x…...

计组(蒋)期末不挂科纲要

2025.03.27&#xff1a;计算机组成原理期末不挂科速成纲要 计组期末不挂科速成纲要 第1章 概论第2章 数据的机器层次表示习题练习 第3章 指令系统习题练习 第4章 数值的机器运算习题练习 第5章 存储系统和结构习题练习 第6章 中央处理器习题练习 第7章 总线 第1章 概论 冯诺依曼…...

STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出

目录 前言 输出时的GPIO控制部分 标准库是如何操作寄存器完成GPIO驱动的初始化的&#xff1f; 问题1&#xff1a;如何掌握GPIO的编程细节——跟寄存器如何打交道 问题2&#xff1a;哪些寄存器&#xff0c;去哪里找呢&#xff1f; 问题三&#xff0c;寄存器的含义&#xff…...

UniApp集成极光推送详细教程

最近项目要集成推送服务&#xff0c;选型极光推送&#xff0c;记录一下开发过程。 1、极光官网注册登录 1.1选择极光推送产品&#xff0c;新建应用 1.2在下一步中选择Android/IOS的消息推送服务 1.3产品设置中输入应用包名&#xff08;一经输入后不可更改&#xff0c;一定要正…...

探索Doris:日志分析的新宠,是否能取代老牌ES?

在大数据时代&#xff0c;日志存储与分析对于企业的运营和决策起着至关重要的作用。Elasticsearch&#xff08;简称 ES&#xff09;作为一款广泛应用的开源分布式搜索和分析引擎&#xff0c;长期以来在日志管理领域占据着举足轻重的地位。然而&#xff0c;随着技术的不断发展&a…...

HCIA/HCIP基础知识笔记汇总

HCIA/HCIP基础知识笔记汇总 ICT产业链&#xff1a; 上游&#xff1a;芯片制造、元器件生产、光纤光缆制造 中游&#xff1a;硬件组装、软件开发、网络建设维护 下游&#xff1a;电信服务、互联网服务、终端产品 VLAN端口类型&#xff1a; access &#xff1a;…...

AI战略群与星际之门:软银AI投资版图计划深度解析

一、星际之门:万亿美元级 AI 基础设施革命 1.1 项目背景与战略定位 在 AI 技术迅猛发展的今天,算力已成为推动其前进的核心动力。软银联合 OpenAI、甲骨文、英伟达、微软、arm推出的 “星际之门”(Stargate)计划,无疑是 AI 领域的一颗重磅炸弹。作为 AI 领域史上最大单笔…...

系统思考与时间管理

时间管理的真正秘诀&#xff1a;主动浪费时间&#xff1f; 巴菲特的私人飞机驾驶员觉得自己不够成功&#xff0c;于是向巴菲特请教应该怎么做。巴菲特让他列出了自己人生中最想实现的25个目标&#xff0c;并按重要程度排序&#xff0c;接着安排时间专注做前五件最重要的事情。…...

mac air m系列arm架构芯片安装虚拟机 UTM+debian 浏览器firefox和chrome

成果展示&#xff1a;debian虚拟机&#xff0c;你值得拥有&#xff01; 预期结果 1、mac的m系列芯片&#xff0c;arm 架构且内存小&#xff0c;安装虚拟机。 考虑到mac m系列芯片8g内存&#xff0c;arm架构想安装一个轻量的虚拟机&#xff0c;偶然之间发现了debian&#xff0c…...