文章目录

  • 一、PWM相关介绍
    • 1.PWM的含义
    • 2.PWM的基本原理
    • 3.PWM的优点及应用范围
    • 4.STM32上的PWM
    • 5.PWM相关寄存器
    • 6.PWM脉冲宽度调制
    • 7.PWM的频率
  • 二、实现呼吸灯效果
    • 1.STM32CubeMX工程创建
    • 2.程序编写
    • 3.程序编译及hex文件创建
    • 4.电路连接
    • 5.程序烧录
    • 6.运行结果
  • 三、总结
  • 四、参考链接

一、PWM相关介绍

1.PWM的含义

PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;它是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。

2.PWM的基本原理

PWM就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。

3.PWM的优点及应用范围

由于其控制简单、灵活和动态响应好等优点而成为电力电子技术应用最广泛的控制方式,其应用领域包括测量,通信, 功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。

4.STM32上的PWM

(1)PWM产生
STM32的定时器除了TIM6和7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出。
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。通用定时器产生PWM 的定时器框图如下:(其他定时器框图类似)

5.PWM相关寄存器

包含三个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。在TIMx_CCMRx寄存器中的OCxM位写入110(PWM模式1)或111(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。
(1)捕获/比较模式寄存器(TIMx_CCMRx)
下图为TIMx_CCMR1寄存器的各位描述:

这里需要使用的是模式设置位OCxM,总共有两种PWM模式,这两种PWM 模式的区别就是输出电平的极性相反。

110:PWM模式1。在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2。 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

(2)捕获/比较使能寄存器(TIMx_CCER)
下图为TIMx_CCER寄存器的各位描述:

该寄存器控制着各个输入输出通道的开关。这里只用到了CC2E位,该位是输入/捕获 2 输出使能位,要想PWM 从 I/O 口输出,这个位必须设置为 1。
(3)捕获/比较寄存器(TIMx_CCRx)
下图为TIMx_CCR1寄存器的各位描述:

在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果在OC1端口上产生输出信号。利用这点,我们通过修改这个寄存器的值实现控制 PWM 的输出脉宽。

6.PWM脉冲宽度调制

(1)使用脉冲占空比拟合不同波形的方式称为 PWM(脉冲宽度调制)控制技术——通过 对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。PWM 控制 的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本 相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。 例如:可以用一系列等幅不用一系列等幅不等宽的脉冲来代替一个正弦半波,如下图:

要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形,要生成 拟合的 PWM波形,通常使用计算法和调制法,本文中使用计算法:根据拟合波形的频率、幅值和半周期脉冲数,准确计算 PWM 波各脉冲宽度和
间隔,据此控制开关器件的通断,就可得到所需 PWM 波形。
(2)要改变PWM输出波形的宽度,就要改变比较寄存器 CCRx 的值,想要输出不通宽度来拟合正弦波,则需要CCRx的值呈现如下图的变化趋势,即要生成一张CCRx的数值
表,按周期变化将表中元素的值赋给CCRx。

7.PWM的频率

PWM的频率是指1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期。
单位:Hz
一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感(因人而异)。
频率太小的话看起来就会闪烁,那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯。
频率很高时,看不到闪烁,占空比越大,LED越亮(平均电压越大);频率很低时,可看到闪烁,占空比越大,LED越亮。
所以,在频率一定下,可以用不同占空比改变LED灯的亮度,使其达到一个呼吸灯的效果。

二、实现呼吸灯效果

1.STM32CubeMX工程创建

(1)打开STM32CubeMX主界面,点击“ACCESS TO MCU SELECTOR”,创建新项目

(2)在“Commerical Part Number”里面选择自己需要的芯片,点击信息栏中的具体芯片信息选中,再点击“Start Project”

(3)先点击System Core将其展开,再点击RCC,将HSE设置为Crystal/Ceramic Resonator

(4)点击SYS,将Debug设置为Serial Wire

(5)先点击Timers将其展开,再点击TIM3,勾选Internal Clock,将“Channel1”设置为PWM Generation CH1,然后点击“Parameter Settings”,按下图设置相关参数:

(6)点击TIM4,勾选Internal Clock,将“Channel1”设置为PWM Generation CH1,然后点击“Parameter Settings”,按下图设置相关参数:

(7)点击Clock Configuration勾选PLLCLK和HSE,将晶振频率设置为最大值72MHz

(8)点击Project Manager→Project,配置好自己的项目名和项目存放路径,然后将IDE设置为MDK-ARM

(9)点击Code Generate界面,选择生成初始化文件.c/.h,之后再点击GENERATE CODE即可成功创建工程

2.程序编写

(1)在点击GENERATE CODE之后弹出来的界面点击Open Project即可跳转到Keil5进行程序编写


(2)打开main.c文件
◉加入如下代码设置占空比:

uint16_t pwm=0;   //占空比


◉在main函数中加入如下代码开启TIM3和TIM4的PWM的通道1:

 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 

◉在while循环中添加如下代码:

while (pwm< 500){pwm++;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);             HAL_Delay(1);}while (pwm){pwm--;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  HAL_Delay(1);}HAL_Delay(200);

3.程序编译及hex文件创建

点击Rebuild编译程序,若没有错误即可成功创建hex文件

4.电路连接

USB转TTL STM32F103C8T6
GND GND
3v3 3v3
TXD A10
RXD A9

LED负极接STM32F103C8T6的A6管脚,正极接3.3v管脚。
STM32F103C8T6的B6管脚接自身的C13管脚。

5.程序烧录

置BOOT0为0,BOOT1为1
(1)打开mcuisp,选择串口为COM5,并选择生成的hex文件

(2)点击读器件信息,若显示一切正常则进行下一步

(3)点击开始编程,若显示一切正常则说明烧录成功

6.运行结果


可以观察到,外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),都实现了 LED呼吸灯的效果,说明实验成功!

三、总结

本实验使用TIM3和TIM4,驱动外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现了2个 LED呼吸灯的效果。在实验过程中,我遇到了STM32CubMX相关参数设置错误、电路连接错误等情况,导致达不到预期实验效果,但经过一遍遍地检查和调试,最终较好地完成了实验。通过本次实验,我了解了PWM的相关知识,明白了呼吸灯实现的原理,但对其相关知识理解还不够深入,所以今后遇到相关知识的应用,还需要深入学习。

四、参考链接

https://blog.csdn.net/qq_45237293/article/details/111997424
https://blog.csdn.net/zmhDD/article/details/111942507
https://blog.csdn.net/weixin_46406325/article/details/115320910

使用TIM3和TIM4,驱动外接LED和STM32上已焊接的LED,实现2个 LED呼吸灯的效果相关推荐

  1. STM32F103C8T6核心开发板下,通过TIM3和TIM4输出PWM波形实现2个 LED呼吸灯的效果

    使用TIM3和TIM4,分别输出一个PWM波形,驱动一个外接的LED灯以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果 文章目录 使用TIM3和TIM4 ...

  2. 嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果

    嵌入式学习--使用定时器输出PWM波形,实现 LED呼吸灯的效果 目录 嵌入式学习--使用定时器输出PWM波形,实现 LED呼吸灯的效果 1. 任务要求 2 PWM波介绍, 2.1 什么是PWM(Pu ...

  3. 嵌入式——使用定时器输出PWM波形,实现 LED呼吸灯的效果

    一.实验要求: 使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼 ...

  4. 输出一个PWM并实现 LED呼吸灯的效果

    前言 本篇博客使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸 ...

  5. 嵌入式学习--使用定时器输出PWM波形,实现LED呼吸灯的效果

    目录 1.任务要求 2.PWM介绍 关于PWM的定义 分频-计数时钟 计数器 定时器输出PWM的原理 定时器的初始化 3.配置STM32CubeMX 4.keil5的代码 5.运行结果 6.心得与体会 ...

  6. 使用STM32输出PWM波形LED呼吸灯的效果

    文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...

  7. 使用STM32输出PWM波形并驱动LED呼吸灯

    目录 前言 一.PWM 二.工程代码 1.用STM32CubeMx创建工程 创建新项目 配置RCC和SYS 配置定时器TIME3 配置定时器TIM4 配置时钟 生成项目 2.用Keil编写代码 3.硬 ...

  8. 在STM上用PWM波形实现2个 LED呼吸灯

    STM32最小核心板使用TIM3和TIM4,分别输出一个PWM波形实现2个 LED呼吸灯 文章目录 STM32最小核心板使用TIM3和TIM4,分别输出一个PWM波形实现2个 LED呼吸灯 1.PWM ...

  9. 利用PWM实现LED呼吸灯

    一.实验目的 本实验使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LE ...

最新文章

  1. winformDatagridview无法编辑的问题
  2. 【Tiny4412】烧写最小文件系统到EMMC
  3. 【译】x86程序员手册06 - 2.4指令格式
  4. 学习机器学习的项目_辅助项目在机器学习中的重要性
  5. AGG第三十一课 pattern_perspective样式透明
  6. oracle+技术面试,Oracle面试问题 技术篇
  7. PHP100个知识点之2 日期时间(一)
  8. [Leetcode] 70. Climbing Stairs Java
  9. LINUX没有SVN,怎么知道哪些文件修改了
  10. fastdfs 原理与过程
  11. 新西兰大学计算机,新西兰大学计算机排名
  12. 【基于Centos】驱动安装
  13. 深度学习在搜狗无线搜索广告中的应用
  14. dva 的一些特殊的写法
  15. linux安装 jenkins(清华大学镜像站)
  16. 黎曼积分求解可微曲线的弧线长度
  17. 深圳一AI公司人脸数据泄露,超256万用户敏感信息在“裸奔”!
  18. 【Android】RecyclerView的好伴侣:详解DiffUtil
  19. C++ Primer Plus(三)编程练习
  20. python实现模仿银行ATM机

热门文章

  1. 服务器 'server_1' 上的 MSDTC 不可用。
  2. 分析编程题c语言,二级C语言部分上机编程题详细分析
  3. ADC系列---噪声与误差(TI视频)
  4. 如何设计一个结构合理的java项目
  5. centos7 同步网络时间
  6. python 调用easydl接口
  7. 深入理解IGMP协议
  8. [VLDB 2021]ICS-GNN_ Lightweight Interactive Community Search via Graph Neural Network
  9. Java中求集合交集、并集、差集
  10. PyTorch图神经网络实践(五)链路预测