STM32如何使用PWM?

一:PWM介绍

PWM 是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简 称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应 用的控制方式,其应用领域包括测量,通信,功率控制与变换,电动机控制、伺 服控制、调光、开关电源,甚至某些音频放大器,因此学习 PWM 具有十分重要的 现实意义。

二:PWM输出配置步骤

STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器都可以产生 PWM 输出。

其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。

而通用定 时器也能同时产生多达 4 路的 PWM 输出,这些在定时器中断章节中已经介绍 过。

(1)使能定时器及端口时钟,并设置引脚复用器映射

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能 TIM3 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
最后还要记得将 PA7 管脚模式配置为复用推挽输出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //复用推挽输出

(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等

要使用定时器功能,必须对定时器内相关参数初始化,其库函数如下:voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseI nitStruct); 
这个在定时器中断章节就已经介绍// 第二步 初始化定时器参数包含自动重装值,分频系数,计数方式等
TIM_TimeBaseInitStruct.TIM_Period = per;                                                  // 自动从装载值设置
TIM_TimeBaseInitStruct.TIM_Prescaler = psc;                     // 预分频该设置
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;         // 时钟分频 不分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;     //向上模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);

(3)初始化 PWM 输出参数,包含 PWM 模式、输出极性、使能等

void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

主要用到的是 比较输出模式、 比较输出使能、 脉冲宽度、输出极性

(4)开启定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)第一个参数是用来选择定时器。 
第二个参数是用来使能或者失能定时器,也就是开启或者关闭定时器功能。同样可以选择 ENABLE 和 DISABLETIM_Cmd(TIM3,ENABLE); //开启定时

(5)修改 TIMx_CCRx 的值控制占空比

其实经过前面几个步骤的配置,PWM 已经开始输出了,
只是占空比和频率是 固定的,例如本章要实现呼吸灯效果,
那么就需要调节 TIM3 通道 2 的占空比, 
通过修改 TIM3_CCR2 值控制。调节占空比函数是:void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare1);

(6)使能 TIMx 在 CCRx 上的预装载寄存器

使能输出比较预装载库函数是: 
void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx,uint16_tTIM_OCPreload); 
第一个参数用于选择定时器,
第二个参数用于选择使能还是失能输出比较预 装载寄存器,
可选择为 TIM_OCPreload_Enable、TIM_OCPreload_Disable

(7)使能 TIMx 在 ARR 上的预装载寄存器允许位

使能 TIMx 在 ARR 上的预装载寄存器允许位库函数是:
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalStateNewState); 第一个参数用于选择定时器,第二个参数用于选择使能还是失能。将以上几步全部配置好后,我们就可以控制通用定时器相应的通道输出 PWM 波形了,这里要特别提醒下,虽然高级定时器和通用定时器类似,但是高级定时 器要想输出 PWM 波形,必须要设置一个 MOE 位(TIMx_BDTR 的第 15 位),以使 能主输出,否则不会输出 PWM。高级定时器特殊函数 库函数设置的函数为: 
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalStateNewState);

三:案例 PWM波控制LED:

#include "pwm.h"void TIM3_CH2_PWM_Init(u16 per,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStruct;// 第1步:(1)使能定时器及端口时钟,并设置引脚复用器映射RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // GPIOA 使能// GPIOA 初始化设置GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;  //选择你要设置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;         //复用的推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;          //设置传输速率GPIO_Init(GPIOA,&GPIO_InitStructure);            /* 初始化GPIO */GPIO_SetBits(GPIOA,GPIO_Pin_7);  // 第2步:(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);// 第3步(3)初始化 PWM 输出参数,包含 PWM 模式、输出极性、使能等TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM1模式TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;  // 使能TIM_OC2Init(TIM3,&TIM_OCInitStruct);// 第5步 (5)修改 TIMx_CCRx 的值控制占空比// 等使用的时候调用 void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare1);// 第6步(6)使能 TIMx 在 CCRx 上的预装载寄存器TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);// 第7步(7)使能 TIMx 在 ARR 上的预装载寄存器允许位TIM_ARRPreloadConfig(TIM3,ENABLE);// 第4步(4)开启定时器TIM_Cmd(TIM3,ENABLE);}控制main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "pwm.h"int main()
{u8 i=0;u16 j = 0;u8 fx = 0;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);LED_Init();TIM3_CH2_PWM_Init(500,72-1);//频率是 2Khwhile(1){        if(fx==0){j++;if(j>=300)fx=1;}else{j--;if(j==0)fx=0;}                TIM_SetCompare2(TIM3,j);i++;if(i%10==0)LED0=!LED0;delay_ms(10);}
}

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

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

相关文章

Layui 主窗口调用 iframe 弹出框模块,获取控件的相应值

var iframeWindow window[layui-layer-iframe index]; iframeWindow.layui.tree............(这里就可以操作tree里面的内容了)。var chrild layero.find(iframe).contents(); chrild.layui.tree (这样是调用不到的)。var child layer.getChildFrame(); child.layui.tree(这…

外置告警蜂鸣器使用小坑

告警蜂鸣器调试小坑 昨天调试新产品,由于IMO、MSC组织和IEC标准规定,不能使用带红色指示灯的蜂鸣器,于是更换了个不带灯。然而奇怪的现象出现了两次短响的程序在有的页面正常,有的页面就变成一声了。搞了一天,把各种寄…

解决 Windows 7 激活信息失败报错 0xC004F057

文章目录 步骤一:以管理员身份运行命令提示符步骤二:卸载当前密钥信息步骤三:清除产品密钥信息步骤四:重新启动 Windows Activation Technologies 服务步骤五:重启电脑 🎉解决 Windows 7 激活信息失败报错 …

字符串排序程序

字符串排序程序,对一个字符串中的数值进行从小到大的排序 例如排序前给定的字符串为" 20 78 9 -7 88 36 29" 排序后: -7 9 20 29 36 78 88 要求使用包装类对数值类型的字符串转换成整型进行排序。 public class StringSort {public static vo…

YOLOv5-理论部分

YOLOv5 作者: Ultralytics 论文源码: https://github.com/ultralytics/yolov5 Ultralytics:“超视觉技术” / “超视觉系统” 0. 引言 “YOLOv5 🚀 是世界上备受喜爱的视觉人工智能,代表了 Ultralytics 对未来视觉人工智能方法的开源研究&a…

Confluence 内容管理

1.创建页面 功能入口: Confluence →指定空间→创建 功能说明: (1)为保证页面风格统一,建议各类内容应统一选择对应模板创建 (2)页面应配置可查看用户,以及用户编辑、查看权限 …

《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)

文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念 责任链(Chain of Responsibility)是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上,而不需要关心链上含有哪些对象。请求…

Hadoop3教程(十五):MapReduce中的Combiner

文章目录 (103)Combiner概述什么是CombinerCombiner有什么用处Combiner有什么特点如何自定义Combiner (104)Combiner合并案例实操如何从日志里查看Combiner如果不存在Reduce阶段,会发生什么自定义Combiner的两种方式 参…

论文阅读:Point-to-Voxel Knowledge Distillation for LiDAR Semantic Segmentation

来源:CVPR 2022 链接:https://arxiv.org/pdf/2206.02099.pdf 0、Abstract 本文解决了将知识从大型教师模型提取到小型学生网络以进行 LiDAR 语义分割的问题。由于点云的固有挑战,即稀疏性、随机性和密度变化,直接采用以前的蒸馏…

正点原子嵌入式linux驱动开发——设备树下LED驱动

经过对设备树的学习以及驱动开发中常用的OF函数介绍,本篇笔记将之前的新字符设备驱动的LED,换成设备树形式。 设备树LED驱动原理 在之前的新字符设备驱动实验中,直接在驱动文件newchrled.c中定义有关寄存器物理地址,然后使用io_…

Groovy语法Gradle配置学习笔记

第一部分:Groovy语法 变量的类型和定义 Groovy所有类型都是对象类型: int x 10 println x.class double y 3.14 println y.classdef 定义变量: def str "dddd" println str.class字符串 字符串: // 单引号 双引号…

el-input: 把不符合正则校验的值动态清空,只保留符合的值

<el-input v-model"form.profit" placeholder"请输入授权专利新增利润" input"handleInput" clearable />/*** 不符合正则校验,清空*/const handleInput () > {if (form.value.profit) {if (!/^\d*\.?\d*$/.test(form.value.profit))…

基于STM32_DHT11单总线温湿度传感器驱动

基于STM32_DHT11单总线温湿度传感器驱动 文章目录 基于STM32_DHT11单总线温湿度传感器驱动前言一、DHT11&#xff1f;二、原理1.时序1.主机复位信号和 DHT11 响应信号2.信号‘0’的表示3.信号‘1’的表示4.整个数据信号收发流程 2.数据结构 三、驱动1 .h文件&#xff1a;2 .c文…

CSS 笔记/练习

CSS 概述 与 html 配合&#xff0c;实现内容与样式分离样式美化 标签中元素作用 class&#xff1a;class属性用于为元素指定一个或多个样式类。通过为元素添加class属性&#xff0c;可以将其与CSS样式表中的样式规则关联起来&#xff0c;从而改变元素的外观和行为。一个元素可…

网络工程师知识点7

111、IS-IS路由器的三种类型&#xff1f; Level-1路由器&#xff08;只能创建level-1的LSDB&#xff09; Level-2路由器&#xff08;只能创建level-2的LSDB&#xff09; Level-1-2路由器&#xff08;路由器默认的类型&#xff0c;能同时创建level-1和level-2的LSDB&#xff09;…

0基础学习VR全景平台篇第109篇:认识拼接软件PTGui Pro

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01;今天给大家讲解我们全景后期拼接软件PTgui pro&#xff0c;下面我们开始吧&#xff01; &#xff08;PTgui pro软件课程大纲&#xff09; 1.PTGui这个软件是什么 发明人 &#xf…

公司如何防止源代码外泄,保护开发部门代码安全呢?

在智能制造业中&#xff0c;研发人员的开发环境&#xff0c;大多数采用c#开发语言svn 或c#git进行软件系统的开发&#xff0c;但是c#语言如何来防泄密保护呢&#xff1f;德人合科技针对于制造类企业制定了安全稳定的源代码防泄密方案&#xff0c;不影响员工的正常工作&#xff…

【数字图像处理笔记】01-数字图像基础

01-数字图像基础 图像类型 黑白(二值)图像 只有黑白两种颜色的图像称为黑白图像或单色图像&#xff0c;图像的每个像素只能是黑或白&#xff0c;没有中间的过渡&#xff0c;故又称为二值图像。 二值图像的像素值只能为0或1&#xff0c;图像中的每个像素值用1位存储。图像矩阵中…

Eudic欧路词典 for Mac(可离线英语学习工具)

Eudic欧路词典是一款功能强大的英语学习工具&#xff0c;旨在为用户提供全面的词汇解释和例句。该软件整合了多个权威词典&#xff0c;包括牛津、柯林斯等&#xff0c;提供了全面准确的词汇解释和用法示例。同时&#xff0c;它还支持离线使用&#xff0c;用户可以在无网络连接的…

EasyExcel

EasyExcel 官方文档 EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) 优势 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出…