STM32学习和实践笔记(23):PWM输出的配置

server/2024/11/15 5:27:45/

PWM可以看作是定时器功能中其中一个子功能,配置步骤与前面定时器的方式类似。相关库函数也同样在tim.c里。

3.PWM输出配置步骤

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

a)         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3定时器的端口时钟打开

所谓的引脚复用器映射,是指将原来默认设置在某个引脚上的功能,改到别的引脚上去实现。

比如,这里的通用定时器3的通道1,它的默认PWM输出引脚是PA6,通过使用重映像或映射,可以让它在PB4或PC6引脚上输出!

在接下来的PWM实验中,就是实现在PC6上输出PWM信号,来使接在PC6的LED灯,显示呼吸灯的效果。

所以就有下面这两条语句:

b)        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开PC端口的时钟

c)        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//通过这个函数来将通用定时器3的通道1的输出重映像到PC6。

上表中的部分重像与完全重映像,并没有什么特别的意思,仅仅是为了在库函数中,用这两个名字来代表两个值:10和11,用以传递形参来分别表明,到底是映射到PB4还是PC6而已。

有哪些功能可以在对应引脚上实现重映像?可选的参数在 stm32f10x_gpio.h 都已经列出来非常详细:

d)        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//将PC6配置为复用的推挽输出

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

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*

TIM_TimeBaseInitStruct);

3)初始化PWM输出参数,包含PWM模式、输出极性(含义见上一篇文),使能等

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef*

TIM_OCInitStruct); 

typedef struct

{

  uint16_t TIM_OCMode;        //比较输出模式(PWM一共有8种输出模式)

  uint16_t TIM_OutputState;   //比较输出使能

  uint16_t TIM_OutputNState;  //比较互补输出使能(这个在高级定时器中才用到)

  uint32_t TIM_Pulse;         //脉冲宽度(这个在高级定时器中才用到)

  uint16_t TIM_OCPolarity;    //输出极性

  uint16_t TIM_OCNPolarity;   //互补比较输出极性(这个在高级定时器中才用到)

  uint16_t TIM_OCIdleState;   //空闲状态下比较输出状态(这个在高级定时器中才用到)

  uint16_t TIM_OCNIdleState;  //空闲状态下比较输出状态(这个在高级定时器中才用到)

} TIM_OCInitTypeDef;        

如果我们要配置TIM3的CH1为PWM1模式,输出极性为低电平,并且使能

PWM输出,可以如下配置

TIM_OCInitTypeDef TIM_OCInitStructure;//先定一个结构体变量

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;

TIM_OC1Init(TIM3,&TIM_OCInitStructure); //输出比较通道1初始化                            

4)开启定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

TIM_Cmd(TIM3,ENABLE); //开启定时器

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

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1);

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

使能输出比较预装载库函数是

void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

第一个参数用于选择定时器,第二个参数用于选择使能还是失能输出比较预装载寄存器,可选择为TIM_OCPreload_Enable、TIM_OCPreload_Disable。

7)使能 TIMxARR 上的预装载寄存器允许位

使能 TIMxARR 上的预装载寄存器允许位库函数是

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

第一个参数用于选择定时器,第二个参数用于选择使能还是失能 

以上是通用定时器的设置,如果是高级定时器要想输出PWM波形,还须要设置一个 MOE 位(TIMx_BDTR 的第 15 位),以使能主输出,否则不会输出 PWM。库函数设置的函数为

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);                 


http://www.ppmy.cn/server/33978.html

相关文章

windows驱动开发-PNP设备的启动/停止/删除

和PNP相关的IRP非常多,遗憾的是,它们并非都是必需的,所以这里仅仅给出一些常规实现功能的相关讲解,在那之前我们先看一下所有相关的IRP: 注意不会关注基于FDO的子总线的情况,这个最可能得应用是指的是UDE,但…

neo4j导出导入数据库

neo4j导出导入数据库 脚本 # -*- encoding: utf-8 -*- """File : neo4j_import.pyTime : 2023/09/04 22:31:38Author : mkid Version : 1.0Note : neo4j数据导入导出脚本 """from py2neo import Graph, Node, Relationshi…

程序员搞副业时,用到的一些工具

使用「兔小巢」处理用户反馈 市面上管理用户反馈的产品很多,不过大部分都是收费的;这里我们介绍下自己在用的、腾讯出品的免费工具「兔小巢」。 这个产品最大的用户就是腾讯自己,原来叫「吐个槽」,最近才升级并更名为「兔小巢」。…

史上最全产品经理书单

Tips:我根据行业传颂度、可读性、豆瓣评分、大牛推荐等几个维度,将书分为必看、推荐看、可看此A/B/C三类。A、B类推荐购买,C类可依据个人喜好酌情购买。 1.产品经理经典必读类 《用户体验要素:以用户为中心的产品设计》 A类&…

Transformer和TensorFlow的区别

Transformer和TensorFlow是两个不同层面的概念,Transformer是一种深度学习模型架构,而TensorFlow是一个开源的机器学习框架,可以用来实现包括Transformer在内的各种深度学习模型。 Transformer Transformer模型最初是在2017年的论文《Atten…

LeetCode刷题笔记第190题:颠倒二进制位

LeetCode刷题笔记第190题&#xff1a;颠倒二进制位 题目: 颠倒输入的二进制数 想法&#xff1a; 通过位运算来实现&#xff0c;以下通过代码逐步说明 class Solution:def reverseBits(self, n: int) -> int:result 0for i in range(32):result (result << 1) |…

基于迁移学习的语义句子分类器(微调一个预训练模型的案例,即迁移学习)

一、任务&#xff1a;基于迁移学习的语义句子分类器 项目介绍&#xff1a;本任务的目的是利用预训练好的模型来微调自己的微软研究释义语料库数据集&#xff0c;实现文本分类的任务&#xff0c;具体是判断两个句子的意思是否相同。在微调阶段&#xff0c;我们将整个模型的参数…

Mac 安装John the Ripper 破解rar(zip)压缩文件

注&#xff1a;仅以此篇记录我满足好奇心所逝去的十几个小时。&#xff08;自娱自乐&#xff09; 1、首先利用 brewhome 包管理工具 安装john the ripper &#xff1a; brew install john-jumbo 如果没有安装brewhome 利用如下命令安装&#xff1a; /bin/zsh -c "$(c…