PWM在STM32中使用指南

什么是PWM?

PWM(脉冲宽度调制)是一种常用来控制模拟电路的技术,通过修改脉冲的宽度(即在固定周期内的高电平持续时间)来调控输出信号的平均电压。 一个PWM信号主要包括两个部分:一个是占空比,它决定了信号高电平状态的时间比例;另一个是频率,它决定了PWM周期的长短。占空比可以通过改变周期内的“ON”时间来调整,如果ON时间长,占空比就高,输出的平均电压就大,反之则小。 以下是对PWM主要特性的详细解释:

  1. 频率:频率是指PWM信号完整周期的重复次数,通常以赫兹(Hz)为单位。PWM信号的频率是决定脉冲重复出现的速度,对于不同的应用,如电机控制或LED调光,所需的PWM频率可以从几赫兹到数十千赫兹不等。
  2. 占空比:这是衡量周期内高电平时间占总周期时间比例的量度。占空比的变化会影响到电机的速度、LED的亮度或电压调节器输出的电压等。以百分比表示,占空比也决定了电源向负载传递的功率量。
  3. 脉宽:指的是在一个PWM周期内,信号保持高电平的时间长度。改变脉宽,在不变频率的情况下,就可以改变占空比和平均电压。

PWM的优点包括能量损耗小、控制简单和成本低廉。已经广泛应用在各种需要模拟结果的数字控制环境中,如调速风扇、调光灯具、伺服电机控制以及各种电子调制器中。 在STM32以及其他微控制器中,PWM通常是通过配置内部定时器,定期翻转GPIO的电平状态实现的。定时器的精确计数能力可以用来定义PWM信号的周期和占空比,从而生成非常精确的PWM波形。

PWM的工作原理:

  1. 占空比调整:PWM信号的占空比是指信号高电平时间与一个周期总时间的比例。通过改变占空比,可以改变传递给负载的平均功率。占空比增加,传递的平均电压和功率也会增加,占空比减少则两者降低。
  2. 控制功率输出:通过将占空比从0%(始终关闭)调节到100%(始终开启),PWM信号可以有效模拟出可变模拟信号的行为。在0%占空比时,不提供任何功率,而在100%时提供最大功率。
  3. 能量效率:与通过电阻调节功率的方法相比,PWM实现了功率调节而不会造成显著的能量损耗。当开关(晶体管)关闭时,没有电流流过,当开关打开时,电压降很小。因此,开关中的功率损失最小。
  4. 模拟控制中的应用:例如,在电机速度控制中,改变占空比可以调节电机两端的平均电压,从而改变其转速。在LED调光中,改变占空比可以改变LED的平均电流,从而调整其亮度。

PWM的模拟效果是由于机械或电子系统的惯性——它们响应的是一段时间内传递的平均功率,而不是瞬时功率。对于响应速度快的系统,可能需要一个滤波器(通常是一个简单的电阻-电容低通滤波器)来将PWM信号平滑为稳定的模拟电压。

常用电路:

PWM信号在许多类型的电路中都很常见,尤其是那些需要能量效率和/或精确控制的应用。下面是一些典型的使用PWM信号的电路例子:

  1. 电机控制电路:在直流电机控制中,PWM信号用来调整电机的转速。通过改变PWM的占空比,可以无级调节电机的速度。
  2. LED调光电路:在LED照明系统中,PWM可用于调节LED的亮度,因为LED的亮度与流经它的平均电流成比例。
  3. 电源管理电路:在开关电源和电压调节器中,PWM技术用于控制电源的输出电压和电流,提高能源转换的效率。
  4. 音频放大器:类D音频放大器中,PWM信号用于创建音频信号。这些放大器利用PWM的占空比来重新构造模拟音频信号。
  5. 加热控制:在温度控制系统中,比如电子烟具或者热水壶,PWM用于控制加热元件,从而精确控制温度。
  6. 充电电路:在一些电池充电器中,PWM可用来调整充电功率,以保证电池的最优充电。
  7. 通信系统:PWM信号可以用来携带信息,在某些类型的数字通信系统中进行数据传输。

这些只是一些实例,事实上在现代电子中,许多需要精确控制输出和优化能耗的地方都可能用到PWM信号。

在电机控制电路中调整转速?

在电机控制电路中,PWM信号调整转速的原理相对直观。这里是一个详细的解释:

  1. 调整PWM占空比:首先,通过变化PWM信号的占空比,我们可以改变电机两端的平均电压。占空比是信号高电平状态的时间与总周期时间的比值。占空比越大,电机两端的平均电压就越高;占空比越小,平均电压就越低。
  2. 电机转速变化:电机的转速取决于其两端的电压。当电机两端的平均电压增加时,由于电机看到了更大的驱动电压,其转速会增加;反之,电压减小时转速会减慢。
  3. 系统惯性的平滑作用:电机和其驱动的负载通常具有一定的质量和惯性。它们对于转速的改变不会立即响应,而是趋向于平滑这些变化,因此在驱动时不会感受到PWM的脉冲本身,而只会感受到平均电压的影响。
  4. 额外滤波器:在一些应用中,可能需要使用一个简单的电容或LC滤波器来平滑电压,从而提供更平稳的电机驱动,尤其是在电机反应灵敏的场合。

总结来说,通过调整PWM信号的占空比,我们可以控制施加在电机上的平均电压,进而调整电机的转速。简单地,增加PWM的占空比(信号更多的时间为高电平),电机转速加快;减少占空比(高电平时间缩短),电机转速减慢。这种方法相对于模拟调速更为高效,因为在PWM调速过程中能量损失更小。

在STM32中如何使用?

作为微控制器的基本功能之一,脉冲宽度调制(PWM)在STM32的开发中扮演着重要角色。本文旨在为初学者提供一个简洁明了的指南,介绍如何使用STM32的定时器(TIM)来实现PWM功能。 首先,理解PWM的工作原理至关重要。PWM是一种通过调制波形的占空比来控制功率输出的技术。占空比是指在一个周期内,信号为高(或ON)状态的时间与总周期时间的比例。在STM32中实现PWM,主要是配置定时器的输出比较模式。 以下是实现STM32 TIM PWM功能的步骤概览:

  1. 定时器时钟源配置:首先需要给定时器配置时钟源,这通常涉及到复位和时钟控制(RCC)模块的设置。
  2. TIM PWM模式设置:在定时器的控制寄存器中,配置PWM模式。此设置包括选择PWM模式1或模式2,并配置预加载寄存器。
  3. TIM输出比较通道配置:配置定时器与输出通道相关的参数,比如输出比较寄存器的值,这决定了PWM的占空比。
  4. 定时器基本配置:设置定时器的计数模式,上溢时间,预分频器和自动重装载值。
  5. 中断与事件管理:如果需要,配置中断和事件,这样一旦PWM周期完成,微控制器可以对此做出响应。
  6. 启动TIM计数:最后,使能定时器开始计数,并启动PWM输出。

下面提供一段简化的STM32 C语言代码示例,用于初始化TIM的PWM模式:

#include "stm32f10x.h"
void TIM_PWM_Init(void) {// 1. 时钟源使能:RCC设置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 假定使用TIM3RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 假定PWM输出到GPIOA// 2. GPIO初始化:设置相关的PWM引脚为复用推挽输出GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // 假定使用PA6GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA// 3. TIM时间基准配置TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 19999; // 自动重装载值,设定PWM周期TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频器,这里的设置决定了计时精度TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// 4. TIM PWM模式配置TIM_OCInitTypeDef  TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 选择PWM模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 比较输出使能TIM_OCInitStructure.TIM_Pulse = 999; // 指定脉冲的宽度,即PWM占空比TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性:高TIM_OC1Init(TIM3, &TIM_OCInitStructure); // 初始化定时器3的通道1TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 使能预装载寄存器// 5. 使能TIM的CCR1在溢出时产生中断 (如果需要的话)TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);// 6. 使能TIM3TIM_Cmd(TIM3, ENABLE);// 7. 使能TIM3重载寄存器ARR    TIM_ARRPreloadConfig(TIM3, ENABLE);
}

如何设置PWM信号的占空比和频率?

要设置PWM信号的占空比和频率,您需要配置相关的定时器寄存器(主要是自动重装载寄存器(ARR)和捕获比较寄存器(CCR))来调整PWM周期和高电平持续的时间。以下是配置步骤:

  1. 设置PWM周期(决定频率): PWM信号的频率由定时器的周期(周期 = 递增计数的次数)决定,通常通过以下公式计算:
    • ARR (Auto-reload register)决定了计数器溢出的值(即周期的最大值)。
    • PSC (Prescaler value)是时钟预分频值;如果不使用预分频,则设置为0。

通过调整ARR的值或时钟预分频器(PSC)的值来设置PWM信号的频率。

  1. 设置PWM占空比: 占空比(Duty Cycle)是决定PWM高电平输出的时间,它是通过CCR(捕获/比较寄存器)来设置的。占空比通过以下公式计算:
    • CCR 值决定了每个周期中输出变为高电平的时间。

通过调整CCR的值来设置PWM信号的占空比。 这里有一个简单的示例:

// 假设定时器及GPIO已经进行过初始化和配置
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
uint16_t PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; // 24MHz
// 定时器基础初始化
TIM_TimeBaseStructure.TIM_Period = 8399; // ARR: 周期为8400-1
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; // PSC
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// PWM通道初始化
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 4199; // CCR: 占空比为50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// 初始化TIM3的Channel2
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3在ARR上的预装载寄存器
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 使能预装载寄存器
// 使能定时器3
TIM_Cmd(TIM3, ENABLE);

在这个例子中,假设系统时钟为24MHz,ARR为8399,预分频器为0,这样就会得到频率为( \frac{24MHz}{8400} = 2.857kHz )的PWM信号。同时,CCR值设置为4199,占空比为50%。 确保在微控制器的实际编程时,对于有关寄存器的设置都需要根据实际的硬件参数和需求进行检查和调整。在调试PWM时,可能需要使用示波器来验证输出的信号是否与期望的设置相匹配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四甲基罗丹明-叠氮,5(6)-TAMRA N3,常用的生物标记试剂

您好,欢迎来到新研之家 文章关键词:四甲基罗丹明-叠氮,Tetramethylrhodamine, TMR,5(6)-TAMRA-azide,5(6)-TAMRA N3 一、基本信息 产品简介:5 (6) - TAMRA azide, also known as tetramethylrhodamine a…

智慧安防/视频监控汇聚平台EasyCVR如何通过接口调用获取设备录像回看的流地址?

视频云存储/视频融合/安防监控EasyCVR视频汇聚系统可兼容各品牌的IPC、NVR、移动单兵、智能手持终端、移动执法仪、无人机、布控球等设备的接入,支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如&am…

全流程点云机器学习(二)使用PaddlePaddle进行PointNet的机器学习训练和评估

前言 这不是高支模项目需要嘛,他们用传统算法切那个横杆竖杆流程复杂耗时很长,所以想能不能用机器学习完成这些工作,所以我就来整这个工作了。 基于上文的数据集切分 ,现在来对切分好的数据来进行正式的训练。 本系列文章所用的…

使用 Next.js 连接 mysql 数据库

前言 本文主要为大家介绍,如何使用 Next 框架实现一个简单的后端接口,并且从数据库中请求数据返回给前端。 实现 创建api/getData文件夹 项目创建完成后在 app 文件下新建api文件夹,在 api 文件夹下新建 getData 文件夹,在 ge…

IOT-Reaserch安装ghidra以及IDEA和ghidra的配置

Linux research 5.4.0-91-generic #102~18.04.1-Ubuntu SMP Thu Nov 11 14:46:36 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux java --version IOT自带的java是符合要求的,不需要额外下载 iotresearch:~/install-file$ java --version openjdk 11.0.13 2021-10-19 …

数字新纪元:探索Web3对社会的影响

在当今数字化时代,技术的进步已经成为社会发展的驱动力之一。而随着区块链技术的快速发展,我们正处在一个即将到来的数字新纪元——Web3时代。这一新时代不仅仅是技术的迭代升级,更是对传统社会模式的颠覆和重构。本文将深入探讨Web3对社会的…

深入理解指针(c语言)

目录 一、使用指针访问数组二、数组名的理解1、数组首元素的地址2、整个数组 三、一维数组传参的本质四、冒泡排序五、二级指针六、指针数组 一、使用指针访问数组 可以使用指针来访问数组元素。例如,可以声明一个指针变量并将其指向数组的第一个元素,然…

Github代码仓库SSH配置流程

作者: Herman Ye Auromix 测试环境: Ubuntu20.04 更新日期: 2024/02/21 注1: Auromix 是一个机器人爱好者开源组织。 注2: 由于笔者水平有限,以下内容可能存在事实性错误。 相关背景 在为Github代码仓库配…

Unity Shader ASE基础效果思路与代码(一):遮罩、硬边溶解、光边溶解、UV扰动

Unity Shader ASE基础效果思路与代码(一):遮罩、硬边溶解、光边溶解、UV扰动 文章目录 Unity Shader ASE基础效果思路与代码(一):遮罩、硬边溶解、光边溶解、UV扰动遮罩效果硬边溶解光边溶解UV扰动 遮罩效果 效果展示: 思路与代码&#xff1…

消息队列-RabbitMQ:死信队列

十五、死信队列 1、死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 que…

用idea debug时,怎么在某个map对象中再加个key value

实现方式 在用idea 进行 debug时,我们经常喜欢对某行代码打断点,然后对某个对象重新设置值,以快速地实现我们预期想覆盖的场景。通常的方式是用鼠标右键点击某个对象,然后选择Set value进行设置值,但是如果想在map中添…

bugku3

xxx二手交易市场 进去是这样讴歌乱进的页面 查看了一下源代码也没什么 先随便注册一个账号 然后登录 随便看了看,发现可以修改头像 上传文件 随便上传了一个图片 发现他对图片进行了base64加密 解密后得到是 data:image/jpeg;base64 这里重新修改类型为php&a…

【buuctf--我有一只马里奥】

这是一道关于 ntfs 流查看的题目运行 exe 后会出来一个 1.txt 文件 在 exe 和 1.txt 文件目录下打开终端,输入 notepad 1.txt:flag.txt就可以看到答案了。 这么做的原因见BUUCTF misc 专题(53)[SWPU2019]我有一只马里奥_ntfs flag.txt 马里…

OpenAI新推出的Sora是什么?如何注册使用?

2024年2月16号,OpenAI全新发布文本视频模型Sora,可以通过指令生成特定的视频内容,这对于内容营销、广告宣传、教育教学等行业都将来带来巨大的机遇与挑战。 相信许多人跟小编一样,对此新兴产品跃跃欲试,那么应该如何注…

柔顺控制笔记

参资料: 【1】https://zhuanlan.zhihu.com/p/620918453 【2】https://blog.csdn.net/a735148617/article/details/108564836 【3】https://zhuanlan.zhihu.com/p/126338809 【4】机器人与环境间力_位置控制技术研究与应用_李正义 【5】水下机械臂建模及柔顺控制方法…

Javascript中var和let之间的区别

文章目录 一.变量提升(声)二.let和var的区别 区别: 1、var有变量提升,而let没有; 2、let不允许在相同的作用域下重复声明,而var允许; 3、let没有暂时性死区问题; 4、let创建的全局变量没有给window设置对应…

不同种类遥感图像汇总 !!

文章目录 前言 1、可见光遥感图像 2、全色遥感图像 3、多光谱遥感图像 4、高光谱遥感图像 5、红外遥感图像 6、激光雷达图像 7、合成孔径雷达遥感图像 前言 遥感技术是从远距离感知目标反射或自身辐射的电磁波、可见光、红外线,对目标进行探测和识别的技术。遥感卫…

【JAVA高级面试题】运用锁机制实现一个自定义的阻塞队列

文章目录 前言实战演示写在最后 前言 前几天看见一个高级Java面试题,我觉得很有代表意义。既考察了面试者的基本锁机制运用,也了解了阻塞队列的产生实现原理。先分享出来,以供鉴赏。 面试题:实现一个自定义的阻塞队列&#xff0c…

React 事件处理 ( this问题 参数传递 ref)

React事件的命名采用小驼峰方式(cameCase),而不是小写 使用JSX语法时你需要传入一个函数作为事件处理函数,而不是一个字符串 你不能通过返回false 的方式阻止默认行为。你必须显示式的使用preventDefault 1 this 需要谨慎对待JSX回调函数中的…

Linux的Ubuntu的APT使用

Linux的Ubuntu的APT使用 apt 介绍 apt 是 Advanced Packaging Tool 的简称,是一款安装包管理工具。在 Ubuntu 下,我们可以使用 apt 命令进行软件包的安装、删除、清理等,类似于 Windows 中的软件管理工具。 Ubuntu 软件操作的相关命令 su…