【STM32嵌入式系统设计与开发拓展】——13_PWM脉宽

news2024/9/9 6:15:12

目录

  • 1、什么是PWM?用来做什么的?
    • PWM(Pulse Width Modulation)脉冲宽度调制
    • 常见用到 PWM 的情况:
  • 2、什么是输出比较?
    • 输出比较模式![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/42434920ca0940b1b10832155a4da3a5.png)
  • 3、数字信号和模拟信号?
    • 数字信号
    • 模拟信号
  • 4、了解PWM方波
    • PWM基本结构
    • 参数计算
  • 4、源码参考


1、什么是PWM?用来做什么的?

PWM(Pulse Width Modulation)脉冲宽度调制

在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
PWM参数:
频率 = 1 / TS 占空比 = TON / TS 分辨率 = 占空比变化步距
在这里插入图片描述

常见用到 PWM 的情况:

电机调速控制:例如直流电机、步进电机等,通过调整 PWM 信号的占空比来改变电机的平均电压,从而实现电机转速的调节。
LED 亮度调节:不同的占空比使 LED 获得不同的平均电流,进而改变其亮度。
电源管理:在开关电源中,利用 PWM 控制功率开关管的导通和关断时间,实现稳定的输出电压调节。
音频信号生成:在一些简单的音频设备中,PWM 可用于生成近似的音频波形。
温度控制:例如在加热或冷却系统中,控制加热元件或制冷设备的工作时间比例。


2、什么是输出比较?

在这里插入图片描述
在这里插入图片描述
输出比较(OC)是通过比较计数器(CNT)和捕获/比较寄存器(CCR)的值的关系,对输出电平进行操作,以输出特定频率和占空比的 PWM 波形。捕获/比较寄存器在输入捕获和输出比较中共用。每个高级定时器和通用定时器都有 4 个输出比较通道,高级定时器的前 3 个通道还有死区生成和互补输出功能。在输出比较中,电路会对比 CNT 和 CCR 的值,CNT 自增,CCR 是给定值,根据 CNT 与 CCR 的大小关系(大于、小于、等于),输出相应的置 1 或置 0 电平。
在这里插入图片描述

输出比较模式在这里插入图片描述


3、数字信号和模拟信号?

数字信号

以离散的数值(通常是 0 和 1)在离散时间点上表示信息的信号,具有抗干扰强、易存储处理和精度高等优点。
在这里插入图片描述
常用:串口通信、IIC、PWM等

模拟信号

模拟信号是在时间和幅度上连续变化、能精确反映物理量实际变化,但易受干扰和产生失真的信号
在这里插入图片描述
常用:ADC(模拟信号转数字信号读取电压值)
DAC(x)一些如stm32f103c8t6没有数模转换功能,无法直接输出一个模拟信号
PWM 使用数据信号,尽可能的模拟模拟信号


4、了解PWM方波

PWM基本结构

在这里插入图片描述

参数计算

在这里插入图片描述
通过调节占空比,可模拟模拟量控制电压变换
在这里插入图片描述


4、源码参考

#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include ".\pwm\pwm.h"

/*********************************************************************
 @Function  : PWM初始化
 @Parameter : arr:自动重装值。
              psc:时钟预分频数
 @Return    : N/A
 @Read      :Tout=((arr+1)*(psc+1))/Ft us,Ft=定时器工作频率,单位:Mhz
**********************************************************************/
void PwmInit(uint16_t arr,uint16_t psc)
{
	  /* 配置结构体变量 */
    GPIO_InitTypeDef GPIO_InitStructure;                                      // 定义GPIO初始化结构体变量
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                           // 定义定时器基本配置结构体变量
    TIM_OCInitTypeDef  TIM_OCInitStructure;	                                  // 定义定时器输出比较模式配置结构体变量

    /* 时钟使能 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);                      // 使能TIM2时钟	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); // 使能GPIOA时钟和复用功能时钟  
	
    /* 引脚配置 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 // TIM2_CH2->PA1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                           // 复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                                    // 初始化GPIOA
	
    /* TIM配置 */ 
    TIM_TimeBaseStructure.TIM_Period = arr;                                   // 自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler = psc;                                // 预分频值 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;               // TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                           // 根据配置的结构体初始化TIM2	
		
    /* PWM配置 */ 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                         // TIM脉冲宽度调制模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;             // 比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                 // TIM输出比较极性高
    TIM_OC2Init(TIM2, &TIM_OCInitStructure);                                  // 初始化TIM2的通道2
		
    /* 使能TIM3 CCR2 */ 
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);                         // 使能TIM2的通道2的预装载
		
    /* 使能TIM3 */ 
    TIM_Cmd(TIM2, ENABLE); // 使能TIM2
}

#include "bord.h"
#include ".\sys\sys.h"
/*********************************************************************
 @Function  : 程序入口
 @Parameter : N/A
 @Return    : N/A
**********************************************************************/
int main(void)
{ 
	uint16_t led0pwmval=0;
	uint8_t dir=1;	
	delay_init(); //启动滴答定时器
  usart1_init(9600); //USART1初始化
	SystemTinerInit(1000-1,3600-1); //系统时间初始化 定时100ms
	LED_Init();                     //板载LED初始化
	ExpLEDInit();                   //开发板LED初始化
  PwmInit(1899, 0);               //不分频。PWM频率=72000000/900=80Khz 

	printf("初始化成功!\r\n");

	
	while(1)
	{	 				
    if(dir)                       // 如果 dir 为真,则递增 led0pwmval;否则递减
        led0pwmval++;
    else                          //否则递减
        led0pwmval--;
    if(led0pwmval > 1000)          // 如果 led0pwmval 大于 300,则将 dir 置为 0,改变递增方向
        dir = 0;
    if(led0pwmval == 0)           // 如果 led0pwmval 等于 0,则将 dir 置为 1,改变递减方向
        dir = 1;
		delay_ms(2);
		
		/* 设置定时器 TIM2 的比较值,控制 PWM 信号的占空比 */
		TIM_SetCompare2(TIM2, led0pwmval);  
	}	
}

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

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

相关文章

vue el-input 输入框下拉显示匹配数据

1、效果图: 2、需求&实现: 输入条件 下面匹配查询到的数据有多少个 需要调用后端接口展示,后端查询到之后返回条数 前端展示 3、具体代码实现: html: 图片需要自己根据实际情况增加 // 查询 重置 筛选 本文章…

【git】git常用命令提交规范

Git 是程序员工作中不可或缺的版本控制工具,以下是一些优化后的常用 Git 命令列表,旨在帮助你更高效地使用 Git 进行版本控制。 基础操作 拉取代码 git clone xxx.git创建分支 git branch dev切换分支 git checkout dev # 或者 git switch dev创建并切换…

Python酷库之旅-第三方库Pandas(056)

目录 一、用法精讲 211、pandas.Series.truncate方法 211-1、语法 211-2、参数 211-3、功能 211-4、返回值 211-5、说明 211-6、用法 211-6-1、数据准备 211-6-2、代码示例 211-6-3、结果输出 212、pandas.Series.where方法 212-1、语法 212-2、参数 212-3、功能…

论报文加密加签场景下如何高效的进行渗透测试

前言 最新的测试中,经常遇到HTTP报文加密/加签传输的情况,这导致想要查看和修改明文报文很不方便。 之前应对这种情况我们有几种常见的办法解决,比如使用burpy插件、在Burp上下游使用mitmproxy进行代理等,但这些使用起来不太方便…

LSTM详解总结

LSTM(Long Short-Term Memory)是一种用于处理和预测时间序列数据的递归神经网络(RNN)的改进版本。其设计初衷是为了解决普通RNN在长序列训练中出现的梯度消失和梯度爆炸问题。以下是对LSTM的详细解释,包括原理、公式、…

面向非结构化数据的知迟抽取

文章目录 实体抽取关系抽取事件抽取大量的数据以非结构化数据(即自由文本)的形式存在,如新闻报道、科技文献和政府文件等,面向文本数据的知识抽取一直是广受关注的问题。在前文介绍的知识抽取领域的评测竞赛中,评测数据大多属于非结构化文本数据。本节将对这一类知识抽取技…

Prometheus-部署

Prometheus-部署 Server端安装配置部署Node Exporters监控系统指标监控MySQL数据库监控nginx安装grafana Server端安装配置 1、上传安装包,并解压 cd /opt/ tar xf prometheus-2.30.3.linux-amd64.tar.gz mv prometheus-2.30.3.linux-amd64 /usr/local/prometheus…

【音频识别】十大数据集合集,宝藏合集,不容错过!

本文将为您介绍10个经典、热门的数据集,希望对您在选择适合的数据集时有所帮助。 1 RenderMe-360 发布方: 上海人工智能实验室 发布时间: 2023-05-24 简介: RenFace是一个大规模多视角人脸高清视频数据集,包含多样的…

2024年最强网络安全学习路线,详细到直接上清华的教材!

关键词:网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊,学习网络安全方向通常会有哪些问题前排提示:文末有CSDN官方认证Python入门资料包 ! 1、打基础时间太长 学基础花费很长时间,光语…

Redis内存管理

文章目录 Redis内存管理删除策略淘汰策略LRU算法 Redis内存管理 长期把Redis做缓存用,总有一天Redis内存总会满的。有没有思考过这个问题,Redis内存满了会怎么样?在redis.conf中把Redis内存设置为1个字节,做一个测试:…

【随机链表的复制】python刷题记录

R3-哈希表 参考k神题解 哈希表法: """ # Definition for a Node. class Node:def __init__(self, x: int, next: Node None, random: Node None):self.val int(x)self.next nextself.random random """class Solution:def copy…

“打破常规:评估八股文对工作的真正影响“

“八股文”在实际工作中是助力、阻力还是空谈? 作为现在各类大中小企业面试程序员时的必问内容,“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢?有IT人士不禁发出疑问:程序员面试考什…

基于深度学习的结肠炎严重度诊断

基于深度学习的结肠炎严重度诊断 本文所涉及所有资源均在传知代码平台可获取 文章目录 基于深度学习的结肠炎严重度诊断1.概述1.1 数据集展示1.2 Resnet50介绍1.2.1结构与特点1.2.2关键优势1.2.3总结 2.创新点3.结果可视化展示结果展示4.核心逻辑5.部署及使用方式5.1 环境配置5…

彻底搞清楚SSR同构渲染的首屏

作为.NET技术栈的全干工程师,Blazor、Vue/Nuxt.js和React/Next.js都会接触到。它们(准确的说是Blazor、Nuxt和Next),都实现了SSR同构渲染。要了解同构渲染,需要从服务端渲染开始。 传统的服务端渲染 如下图所示&…

开放式耳机什么牌子的好?看这6大品牌就够了

移动互联网时代,听歌、追剧、网课、短视频……这几年全球青年人对于耳机和耳朵的依赖程度,可谓前所未有的提升。但选择一款好的耳机,也不是一件容易的事,入耳式耳机戴久了耳道会疼,还可能引起一系列不必要的炎症&#…

【C语言】C语言期末突击/考研--数据的类型

目录 一、编程环境的搭建 二、数据的类型、数据的输入输出 2.1.数据类型 2.2.常量 2.3.变量 2.4.整型数据 2.4.1.符号常量 2.4.2.整型变量 2.5.浮点型数据 2.5.1.浮点型常量 2.5.2.浮点型变量 2.6.字符型数据 2.6.1字符型常量 2.6.2.字符数据在内存中的存储形式及…

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/3(含分析过程)

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/3(含分析过程) 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/3(含分析过程) 一、简单介绍 二、机器学习 1、为什么使用机器学习&a…

react antd upload custom request处理多个文件上传

react antd upload custom request处理多个文件上传的问题 背景:第一次请求需要请求后端返回aws 一个link,再往link push文件,再调用另一个接口告诉后端已经上传成功,拿到返回值。 再把返回值传给业务api... 多文件上传一直是循环…

字体表绘制的理解

下载字体到项目根目录下,我们通过一些在写预览本地字体的网站,简单看一下 通过图片不难看出阴书与原文的对应关系,接下来通过程序去完成这一过程,通过 fonttools 处理 ttf,然后获取字体和文字对应的 xml 文件 下面简单…

分布式SQL查询引擎之ByConity

ByConity 是字节跳动面向现代数据栈的一款开源数仓系统,应用了大量数据库成熟技术,如列存引擎,MPP 执行,智能查询优化,向量化执行,Codegen,indexing,数据压缩,适合用于 O…