【STM32】PWM 输出 (标准库)

发布者:心语如画最新更新时间:2022-01-17 来源: eefocus关键字:STM32  PWM  输出  标准库 手机看文章 扫描二维码
随时随地手机看文章

一、PWM简介

PWM:脉冲宽度调制(Pulse width modulation,PWM)


脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。——百度百科


二、PWM输出模式

PWM 输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装 寄存器 ARR 的值决定,占空比由 比较寄存器 CCR 的值决定。


PWM 模式分为两种,PWM1和 PWM2。区别如下:

image.png

三、初始化结构体

1. TIM_TimeBaseInitTypeDef

 typedef struct {   

  uint16_t TIM_Prescaler;          // 预分频器   

uint16_t TIM_CounterMode;        // 计数模式   

uint32_t TIM_Period;             // 定时器周期   

  uint16_t TIM_ClockDivision;      // 时钟分频  

uint8_t TIM_RepetitionCounter;   // 重复计算器  

 } TIM_TimeBaseInitTypeDef; 

结构体具体介绍参见:【STM32】TIM—基本定时器


2. TIM_OCInitTypeDef

/** 

  * @brief  TIM Output Compare Init structure definition  

  */


typedef struct

{

  uint16_t TIM_OCMode;        /*!< Specifies the TIM mode.

                                   This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */


  uint16_t TIM_OutputState;   /*!< Specifies the TIM Output Compare state.

                                   This parameter can be a value of @ref TIM_Output_Compare_State */


  uint16_t TIM_OutputNState;  /*!< Specifies the TIM complementary Output Compare state.

                                   This parameter can be a value of @ref TIM_Output_Compare_N_State

                                   @note This parameter is valid only for TIM1 and TIM8. */


  uint32_t TIM_Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register. 

                                   This parameter can be a number between 0x0000 and 0xFFFF */


  uint16_t TIM_OCPolarity;    /*!< Specifies the output polarity.

                                   This parameter can be a value of @ref TIM_Output_Compare_Polarity */


  uint16_t TIM_OCNPolarity;   /*!< Specifies the complementary output polarity.

                                   This parameter can be a value of @ref TIM_Output_Compare_N_Polarity

                                   @note This parameter is valid only for TIM1 and TIM8. */


  uint16_t TIM_OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.

                                   This parameter can be a value of @ref TIM_Output_Compare_Idle_State

                                   @note This parameter is valid only for TIM1 and TIM8. */


  uint16_t TIM_OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.

                                   This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State

                                   @note This parameter is valid only for TIM1 and TIM8. */

} TIM_OCInitTypeDef;


(1) TIM_OCMode:比较输出模式选择,总共有八种,常用的为 PWM1/PWM2。它设定 CCMRx寄存器 OCxM[2:0]位的值。


(2) TIM_OutputState:比较输出使能,决定最终的输出比较信号 OCx是否通过外部引脚输出。它设定 TIMx_CCER寄存器 CCxE/CCxNE 位的值。


(3) TIM_OutputNState:比较互补输出使能,决定 OCx的互补信号 OCxN是否通过外部引脚输出。它设定 CCER寄存器 CCxNE 位的值。


(4) TIM_Pulse:比较输出脉冲宽度,实际设定比较寄存器 CCR的值,决定脉冲宽度。可设置范围为 0至 65535。


(5) TIM_OCPolarity:比较输出极性,可选 OCx为高电平有效或低电平有效。它决定着定时器通道有效电平。它设定 CCER寄存器的 CCxP位的值。


(6) TIM_OCNPolarity:比较互补输出极性,可选 OCxN 为高电平有效或低电平有效。它设定 TIMx_CCER寄存器的 CCxNP位的值。


(7) TIM_OCIdleState:空闲状态时通道输出电平设置,可选输出 1或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器通道输出高电平或低电平。它设定 CR2寄存器的 OISx位的值。


(8) TIM_OCNIdleState:空闲状态时互补通道输出电平设置,可选输出 1 或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器互补通道输出高电平或低电 平,设定值必须与 TIM_OCIdleState 相反。它设定是 CR2 寄存器的 OISxN 位的值。


四、PWM输出实验

编程思路

初始化 LED

初始化延时函数

开启定时器时钟

设置定时器周期和预分频器

初始化定时器

主函数中修改比较值和占空比

pwm.h

// =============================================

# @Time    : 2020-10-24

# @Author  : AXYZdong

# @CSDN    : https://blog.csdn.net/qq_43328313

# @FileName: pwm.h

# @Software: keil5 MDK

// =============================================


#ifndef _TIME_H

#define _TIME_H


#include "stm32f4xx.h"

void TIM3_PWM_Init(u32 ARR , u32 PSC);


#endif


pwm.c

// =============================================

# @Time    : 2020-10-24

# @Author  : AXYZdong

# @CSDN    : https://blog.csdn.net/qq_43328313

# @FileName: pwm.c

# @Software: keil5 MDK

// =============================================


#include "pwm.h"

#include "bsp_led.h"


extern void TIM3_PWM_Init(u32 ARR , u32 PSC);


void TIM3_PWM_Init(u32 ARR , u32 PSC)

{  

//此部分需手动修改IO口设置

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //TIM3时钟使能    

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟

GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); //GPIOA6复用为定时器3

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;           //GPIOFA

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉

GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA6

  

TIM_TimeBaseStructure.TIM_Prescaler=PSC;  //定时器分频

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式

TIM_TimeBaseStructure.TIM_Period=ARR;   //自动重装载值

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//初始化定时器3

//初始化TIM14 Channel1 PWM模式  

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低

TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1


TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器

 

    TIM_ARRPreloadConfig(TIM3,ENABLE);//ARPE使能 

TIM_Cmd(TIM3, ENABLE);  //使能TIM3   


main.c

// =============================================

# @Time    : 2020-10-24

# @Author  : AXYZdong

# @CSDN    : https://blog.csdn.net/qq_43328313

# @FileName: main.c

# @Software: keil5 MDK

// =============================================


#include "stm32f4xx.h"

#include "delay.h"

#include "pwm.h"

#include "bsp_led.h"


int main(void)

{

u16 ledpwmval=0;

u8 flag=1;

delay_init(168); //初始化延时函数

  LED_GPIO_Config();     //初始化LED

  TIM3_PWM_Init(100-1,84-1); //初始化定时器

while(1)

{

delay_ms(10);

if(flag)ledpwmval++;

else ledpwmval--;

if(ledpwmval==0)flag=1;

if(ledpwmval==40)flag=0;

TIM_SetCompare1(TIM3,ledpwmval); //修改比较值,修改占空比

  }

}


五、总结

PWM输出,观察到 LED 缓慢变亮又缓慢变暗的状态(呼吸灯)

通过对定时器初始化数据和比较值的修改,可以改变亮暗时间


【参考文献】


[1] 《零死角玩转 STM32—基于野火 F407[霸天虎]开发板 》

关键字:STM32  PWM  输出  标准库 引用地址:【STM32】PWM 输出 (标准库)

上一篇:【STM32】STM32F407 + DHT11
下一篇:【STM32】TIM---基本定时器

推荐阅读最新更新时间:2024-11-10 12:06

读写stm32的内置Flash(附代码)
最近尝试了一下对32的内置flash进行读写,众所周知,芯片的flash是用来存放代码指令和变量的,其中的数据即使掉电也不会丢失。而stm32的flash之大,对于初学者的小打小闹完全不用担心不够用的情况。 因此,在需要保存一些芯片掉电之后依旧需要保存的数据(数据量不是特别大)时,运用内置flash的空闲部分可以为我们省去一颗eeprom或外置flash的花销。 知识总结: 1.flash的写入之前需要先擦除,且擦除是直接擦除一页(2KBytes),整个流程为 (1)解锁flash(2)擦除一页或多页(3)写数据(4)锁定flash 2.flash正常写入一次是16bit 3.flash的地址从0x080000
[单片机]
读写<font color='red'>stm32</font>的内置Flash(附代码)
微控制器PWM外设及其目标负载的同步与防止相位延迟方案
大多数微控制器至少有一个脉冲宽度调制 (PWM) 外设,以方波形式生成多个波形。这些 PWM 输出可用于驱动同步负载,例如机械系统中的步进电机和电源转换器的功率MOSFET。对于这些负载,要使目标负载正常工作,PWM 波形必须精确同步,这一点非常重要。 如果 PWM 外设未经过仔细编程,它可能偶尔会在波形之间产生相位延迟,从而导致在波形边沿未正确对齐时失去同步。这些相位延迟将会降低负载的驱动效率,从而浪费功率并可能产生过多的热量。对于常见的 PWM 外设,可以启用或禁用某个 PWM,但同时会导致其他 PWM 输出发生相位延迟。 这对于小规格电池供电型物联网 (IoT) 应用而言尤其是个问题。在此类应用中,单个具有 16 或
[嵌入式]
微控制器<font color='red'>PWM</font>外设及其目标负载的同步与防止相位延迟方案
STM32利用定时器1控制LED闪烁
配置LED灯 //PC13 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); }
[单片机]
全新Switch:支持DLSS技术、4K输出
前不久,任天堂最新一代的Switch OLED版正式发售了,其在性能方面没有任何升级,并且号称升级了更好的OLED屏幕,其实让原本就是远古画质的720P屏幕直接变成了“马赛克”,引起不少吐槽。   玩家们也纷纷为任天堂感到羞耻,在PS5、XSX这些主机性能已经甩的Switch开火箭都追不上的程度下,任天堂居然还是这么优哉游哉。   不过,事实上任天堂也并非是没有任何准备,根据最新报道显示,下一代Switch正在紧锣密鼓的筹备中,相比当代产品将会拥有质的提升,其中最重要的就是将加入DLSS技术,并且能实现4K输出,玩家们也终于能享受到高清画质了。   但是,有个巨大的坏消息就是,任天堂可能依然会为新机配备刚刚登场过的7寸OLE
[手机便携]
我的STM32从菜鸟到牛人的学习步骤
1.首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解,请立即阅读STM32的文档,以获取最基本的知识点。如果你手上拥有ST官方主推的STM32神舟系列的板子,那么光盘都会配好这些文档,STM32的学习与ARM9的学习有一个很大的区别。ARM9的学习一般是需要购买书籍的。比如三星的S3C2440,官方的文档都是英文的,大部分工程师只能去看国内出版的书籍。英文好的同学,请不要以为你很牛,可以只看英文文档。毕竟你是中国人,你最熟悉的,理解最好的还是中文。看英文的速度还是比看中文慢一些,我们要的是最短的时间,而不是追求短时间内记住所有细节。当然,如果是一篇论文,建议看英文原版还是有好处
[单片机]
STM32开发笔记66: 移植看门狗驱动程序到STM32L053R8T6
单片机型号:STM32L053R8T6 在文章STM32开发笔记45:看门狗驱动程序的移植已经介绍了看门狗驱动程序的移植方法,其实现的是将STM32CubeMX中的驱动程序,移植到自己已有的工程中。本文将介绍将STM32F070F6P6上的看门狗驱动程序移植到STM32L053R8T6的方法,步骤如下: 1、在1_bsp层引入STM32官方的驱动程序stm32l0xx_hal_iwdg.c,并修改stm32l0xx_hal_conf.h中的内容,使能内部看门狗,相关程序如下,然后进行编译,形成bsp.lib #define HAL_MODULE_ENABLED /*#define HAL_ADC_MODULE_ENA
[单片机]
STM32PWM的原理与使用
1、PWM是什么? 就是脉冲宽度调制,简称脉宽调制。利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,就是对脉冲宽度的控制。 这里说的脉冲,就是我们产生的方波。方波就是N个这样的周期连续的产生。 一个周期内高电平持续的时间就是脉冲宽度(脉宽),而PWM(脉冲宽度调制)就是控制一个周期内的高电平的持续时间。 ---------------------------------------------------------------------------------------------------------------------------------------- 2、简单的P
[单片机]
<font color='red'>STM32</font>的<font color='red'>PWM</font>的原理与使用
输出电流可调的恒流源电路
输出电流可调的恒流源电路 图 输出电流可调的恒流源电路 用三端固定输出集成稳压器可以组成恒流源电路。此时集成稳压器本身工作于悬浮状态。图是一种恒流源电路实例,接在集成稳压器输出端和公共端之间的电阻R=R1+R2,决定了恒流源的输出电流IO,从图中可知,流过电阻R的电流IR=Uo1/R。(11) 为了取得较高的效率,应选取标称输出电压低的集成稳压器来组成恒流源,在图12中采用了CW7805。 若电阻R1为1个可变电阻器,就可以组成输出电流可调的恒流源,为防止可变电阻器调到零时造成集成稳压器输出端短路,在电路中串入小电阻R2。R2值的选择应保证在R1调到零时集成稳压器的输出电流小于其所允许的最大输出电流值,即R2≥Uo1/Io
[电源管理]
<font color='red'>输出</font>电流可调的恒流源电路

推荐帖子

keil汇编编程出错,解决不了
程序如下:ORG0000HLJMPSTARTORG0003HLJMPEXT0ORGTIM0START:MOVSP,#70HMOVTMOD,#00000001BMOVTH0,#H
w505024 51单片机
【得捷电子Follow me第2期】+开箱帖:期待的Adafruit ESP32-S3 TFT Feather到货啦....
给力的DigiKey得捷电子活动Followme,期待的第二期的开发板,拿到收到啦啦啦。。。。(1)核心板,小包装,大内容!必买器件(AdafruitESP32-S3TFTFeather)(2)可玩性强的周边传感器:A、光传感器,模拟输出B、STLIS3DHG-Sensor,I2C输出,使用便捷,可以做动作捕捉方面的应用C、考虑传感器的数据需要一个扩展存储,以及音频播放和
alanlan86 DigiKey得捷技术专区
【技术探讨】无线通信中如何排查电磁波干扰?
很多客户反映无线电通信中的电磁波干扰,看不见,摸不到,也无法呈现,有时会碰到这样的问题:同一组设备、在相同的环境中,有的时间段无线通信很好,有的时间段突然无线通信的信号质量严重下降,这个是怎么回事?由于目前市面上的无线电通信设备种类很多,WiFi,ZigBee,LoRa,对讲机,无线电台等等,电磁波环境是复杂和多样的,作为厂家我们是无法完全模拟用户的现场环境,用户是可以通过WiMi-net无线自组网管理平台软件(下载中心),去定位问题,再去解决这个问题。
chenjingjing RF/无线
cofdm 无线应急指挥调度系统
cofdm产品无线应急指挥调度系统cofdm无线应急指挥调度系统很高级啊。一边看看怎么用。(*^__^*)嘻嘻……
jiank008 安防电子
各位大哥帮帮忙....问些小问题~
这是一个七段数码管显示的程序(共阴极),有些地方不太明白,烦各位说一下#includereg51.h#includestdio.h#includemath.h#includeabsacc.h#defineDIGPORTXBYTE/*定义字位口*/#defineWORDPORTXBYTE/*定义字型口*/#definefosc11.0592/*晶振频率*/#definetime02000
zhaozonghui 嵌入式系统
有没有UPS相关的书
请救各位大神,有没有关于UPS相关的书,里面关于各个功率器件,变压器的选型的有没有UPS相关的书
qepdcri 开关电源学习小组
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved