零基础STM32单片机编程入门(七)定时器PWM波输出实战含源码视频

文章目录

    • 一.概要
    • 二.PWM产生框架图
    • 三.CubeMX配置一个TIME输出1KHZ,占空比50%PWM波例程
      • 1.硬件准备
      • 2.创建工程
      • 3.测量波形结果
    • 四.CubeMX工程源代码下载
    • 五.讲解视频链接地址
    • 六.小结

一.概要

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用单片机数字输出(1或0)来对外部模拟电路进行控制的一种非常有效的技术。
在这里插入图片描述
PWM波主要应用场景:
电机控制
PWM信号可以用来控制直流电机的转速和位置,实现对电机的精确控制。在无刷直流电机(BLDC)和步进电机中,利用PWM调制可以充分发挥电子设备的精确度和能效。

LED灯光调光
PWM信号可用于调控LED灯的亮度。通过改变PWM信号的占空比(on-time和off-time的比值),可以实现对LED灯光的调光操作,达到节能和避免眩光的效果。

电源管理
采用PWM技术的开关稳压器(如降压转换器)在电源管理中具有广泛的应用。

音频放大器
在数字音频放大器中,PWM信号用于控制音频信号的放大和调制。

混合动力电动汽车(HEV)和电动汽车(EV)
PWM信号用于控制电池充放电和电动机的驱动管理,提高电池的使用性能和寿命。

伺服系统
在伺服系统中,PWM信号用于传输伺服电机的控制信号,实现对伺服电机的精确控制。

二.PWM产生框架图

定时器部分框图如下,其中PWM相关的主要是基本定时器和PWM输出控制部分,基本定时器主要控制PWM输出的频率,PWM控制部分主要控制PWM输出的占空比。

在这里插入图片描述
PWM输出控制部分信号流向
在这里插入图片描述
主要寄存器
1.TIMx_CCR1
捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

2.TIMx_CNT
计数器值与捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平 。

3.TIMx_ARR
自动重装载寄存器,计数器(TIMx_CNT)开始计数,直到计数器(TIMx_CNT)达到TIMx_ARR中存放的值后,重新回到0,依次循环 。

在PWM工作模式下,引入一个寄存器CCRx,这个寄存器用于控制PWM输出波的有效电平长度(占空比),假定定时器工作在向上计数 PWM模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。

工作过程如下图所示
在这里插入图片描述

三.CubeMX配置一个TIME输出1KHZ,占空比50%PWM波例程

1.硬件准备

STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。

在这里插入图片描述

2.创建工程

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述
配置TIM1,1ms定时器,TIM1内部时钟是72MHZ,72分频就是1MHZ,计数1000次归零,计数时间就是1ms,脉冲宽度是500us,根据上述配置,PWM波频率就是1KHZ,占空比就是50%。
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

增加代码
在这里插入图片描述

主要代码如下

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
	if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)//启动定时器通道1,PWM输出
  {
    /* PWM generation Error */
    while(1);
  }
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}


void MX_TIM1_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 71;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 999;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
  }
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  {
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
  }
  HAL_TIM_MspPostInit(&htim1);

}

3.测量波形结果

通过波形接收器测量PA8引脚
在这里插入图片描述

四.CubeMX工程源代码下载

链接:https://pan.baidu.com/s/1ZOkxY7d7Gz1jXCvHHzF6uA
提取码:bhf6
如果链接失效,可以联系博主给最新链接

程序下载下来之后解压就行

五.讲解视频链接地址

PWM输出实验

六.小结

脉冲宽度调制(PWM:Pulse Width Modulation)可以广泛应用于电机控制、灯光的亮度调节、功率控制等领域,所以在那些领域避免不了需要用到PWM输出技能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CAN总线(下)

位时序 为了灵活调整每个采样点的位置&#xff0c;使采样点对齐数据位中心附近&#xff0c;CAN总线对每一个数据位的时长进行了更细的划分&#xff0c; 分为同步段&#xff08;SS&#xff09;、传播时间段&#xff08;PTS&#xff09;、相位缓冲段1&#xff08;PBS1&#xff0…

扩散模型笔记

长参数“T”决定了生成全噪声图像所需的步长。在本文中&#xff0c;该参数被设置为1000&#xff0c;这可能显得很大。我们真的需要为数据集中的每个原始图像创建1000个噪声图像吗?马尔可夫链方面被证明有助于解决这个问题。由于我们只需要上一步的图像来预测下一步&#xff0c…

机器学习 | 随机梯度下降分类器

数据科学和机器学习工具包中用于各种分类任务的一个重要工具是随机梯度下降&#xff08;SGD&#xff09;分类器。通过探索其功能和在数据驱动决策中的关键作用&#xff0c;我们开始探索SGD分类器的复杂性。 SGD分类器是一种与SGD回归器有着密切联系的灵活分类技术。它的工作原…

最新性价比最高的SSL证书申请

申请SSL证书时&#xff0c;为了确保过程的顺利进行以及获得可靠的加密连接&#xff0c;有几个关键点需要注意。 申请新性价比最高SSL证书步骤 1、登录来此加密网站&#xff0c;输入域名&#xff0c;可以勾选泛域名和包含根域。 2、选择加密方式&#xff0c;一般选择默认就可以…

redhat7.x 升级openssh至openssh-9.8p1

1.环境准备&#xff1a; OS系统&#xff1a;redhat 7.4 2.备份配置文件&#xff1a; cp -rf /etc/ssh /etc/ssh.bak cp -rf /usr/bin/openssl /usr/bin/openssl.bak cp -rf /etc/pam.d /etc/pam.d.bak cp -rf /usr/lib/systemd/system /usr/lib/systemd/system.bak 3.安装…

【Java探索之旅】多态:重写、动静态绑定

文章目录 &#x1f4d1;前言一、重写1.1 概念1.2 方法重写的规则1.3 重写和重载的区别1.4 重写的设计原则 二、动静态绑定2.1 静态绑定&#xff1a;2.2 动态绑定&#xff1a; &#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;重写和动静态绑定是重要的…

5G频段简介

5G频段 5G网络一共有29个频段&#xff0c;主要被分为两个频谱范围&#xff0c;其中6GHz以下的频段共有26个&#xff08;统称为Sub6GHz&#xff09;&#xff0c;毫米波频段有3个。目前国内主要使用的是Sub6GHz&#xff0c;包括n1/n3/n28/n41/n77/n78/n79共7个频段。具体介绍如下…

Ubuntu 22.04.4 LTS 安装配置 MySQL Community Server 8.0.37 LTS

1 安装mysql-server sudo apt update sudo apt-get install mysql-server 2 启动mysql服务 sudo systemctl restart mysql.service sudo systemctl enable mysql.service #查看服务 sudo systemctl status mysql.service 3 修改mysql root密码 #默认密码为空 sudo mysql …

C# 如何获取属性的displayName的3种方式

文章目录 1. 使用特性直接访问2. 使用GetCustomAttribute()方法通过反射获取3. 使用LINQ查询总结和比较 在C#中&#xff0c;获取属性的displayName可以通过多种方式实现&#xff0c;包括使用特性、反射和LINQ。下面我将分别展示每种方法&#xff0c;并提供具体的示例代码。 1.…

MySQL第三天作业

一、在数据库中创建一个表student&#xff0c;用于存储学生信息 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT ); 1、向student表中添加一条新记录 记录中id字段的值为1&#xff0c;name字段的值为"monkey"…

哲讯SAP知识分享:SAP资产模块常用事务代码清单

在当今日益复杂的商业环境中&#xff0c;企业对于资产管理的需求日益增强。SAP作为全球领先的企业管理软件提供商&#xff0c;其资产模块&#xff08;AM&#xff09;以其高效、灵活的特性&#xff0c;为企业提供了全面的资产管理解决方案。本文将对SAP资产事务类型进行详细介绍…

阿贝云免费虚拟主机和免费云服务器评测

阿贝云是一家提供免费虚拟主机和免费云服务器的服务提供商&#xff0c;为用户提供高性能的云计算服务。阿贝云的免费虚拟主机拥有稳定的性能和强大的安全性&#xff0c;用户可以轻松搭建自己的网站并享受无限的流量和空间。免费云服务器则提供了更强大的计算能力和灵活的配置选…

Samtec汽车电子 | 汽车连接器如何在高要求、极端的环境中工作

【摘要/前言】 汽车电子&#xff0c;这些年来始终是极具流量的热门话题&#xff0c;目前不断发展的智能座驾、辅助驾驶等赛道都是对相关产业链需求的进一步刺激&#xff0c;这里蕴含着一片广阔的市场。 同样&#xff0c;广阔的市场里有着极高的准入门槛和事关安全的技术挑战。…

买的Google账号登录,修改辅助邮箱收不到验证码?可能是个简单的错误

这篇文章分享一个案例&#xff0c;购买了谷歌账号以后如何修改辅助邮箱&#xff0c;修改辅助邮箱的一些要点&#xff0c;以及常见的一个错误。 一、案例回放 这个朋友昨天在我的一个视频下面留言说买了谷歌账号以后&#xff0c;想修改辅助邮箱地址&#xff0c;但是输入了辅助…

基于模型预测控制的PMSM系统速度环控制理论推导及仿真搭建

模型预测控制&#xff08;Model Predictive Control, MPC&#xff09;是一种先进的控制策略&#xff0c;广泛应用于工业控制中。它可以看作是一种最优控制方法&#xff0c;利用对象的动态模型来预测其状态的未来行为&#xff0c;并根据每个采样时间点特定性能目标函数的优化来确…

单片机软件架构连载(3)-typedef

今天给大家讲typedef&#xff0c;这个关键字在实际产品开发中&#xff0c;也是海量应用。 技术涉及知识点比较多&#xff0c;有些并不常用&#xff0c;我们以贴近实际为原则&#xff0c;让大家把学习时间都花在重点上。 1.typedef的概念 typedef 是 C 语言中的一个关键字&…

java wait, notify, notifyAll三个方法

wait(), notify(), 和 notifyAll() 是 Java 中用于线程间通信和同步的方法&#xff0c;它们都是 Object 类中的方法&#xff0c;而非 Thread 类的方法。这些方法通常与 synchronized 关键字一起使用&#xff0c;用于实现线程之间的协作和互斥访问共享资源。 关于生产者-消…

Apache Seata配置管理原理解析

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata配置管理原理解析 说到Seata中的配置管理&#xff0c;大家可能会想到Seata中适配…

传统IO和NIO文件拷贝过程

参考&#xff1a;https://blog.csdn.net/weixin_57323780/article/details/130250582

几个小创新模型,KAN组合网络(LSTM、GRU、Transformer)回归预测,python预测全家桶再更新!...

截止到本期&#xff0c;一共发了9篇关于机器学习预测全家桶Python代码的文章。参考往期文章如下&#xff1a; 1.终于来了&#xff01;python机器学习预测全家桶 2.机器学习预测全家桶-Python&#xff0c;一次性搞定多/单特征输入&#xff0c;多/单步预测&#xff01;最强模板&a…