STM32F4之PWM设计

发布者:SerendipityGlow最新更新时间:2021-06-15 来源: eefocus关键字:STM32F4  PWM 手机看文章 扫描二维码
随时随地手机看文章

一,何为PWM?


PWM的全称为:Pulse Width Modulation,简称脉宽调制


百度来的:脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。


而简单的来说就是,我们可以使用处理器输出自己想要的占空比的矩形波,去达到控制模拟电路等目的。


二,STM32中拥有PWM


在STM32F407的芯片手册中有描述:12个16位的定时器,2个32位的定时器,每个定时器可以由4个通道去产生PWM

三,STM32中的PWM的原理

先说PWM的关键指标:周期,以及占空比


1.PWM周期:就是通过配置定时器的溢出时间(即图中ARR的值),当计数器(CNT寄存器)计数的值与ARR的值相等时,计数归零,重新计数


2.PWM占空比:设置CRRx的值,作为比较值,CNT计数值与CRR做对比,因此衍生出PWM的模式,


如:在PWM模式1,当计数器CNT电平为有效电平,否则为无效电平

上图就是设置输出通道极性为低,CRRx为150,ARR为500  可以看到当小于150时表现出来的为低电平,否则就是为高电平。


四.PWM的配置流程如下


1.使能GPIO时钟,配置一个GPIO结构体变量(该GPIO上可以复用为定时器的输出),并进行初始化


2.将GPIO的引脚复用为TIM的输出


3.使能定时器时钟,配置一个TIM结构体变量,主要关注设置Arr的值,并进行初始化


4.配置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;

 主要注意一下几样:


TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //PWM的输出模式

TIM_OCInitStructure.TIM_OutputState=ENABLE;     //使能

TIM_OCInitStructure.TIM_Pulse=250; //脉冲,即与CNT比较的数值

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;    //输出极性,与PWM模式配合,产生最后的输出

TIM_OC1Init(TIM14,&TIM_OCInitStructure);

因此最后还要再调用两个函数


TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);      

TIM_ARRPreloadConfig(TIM14,ENABLE);             

最后实现PWM的初始化代码如下:


/**

  * @brief   the TIM14 used to produce a PWM

  * @param  arr: TIM重装载计数值

  * @param  psc: 分频系数

  * @param  pluse:初始化占空比设置

  *           TIM_SetCompare1() ¸该函数可以动态改变占空比的值

  * @retval None

  */

void INIT_PWM(int arr,int psc,int pluse)

{

//使能GPIOF的外设时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

//声明一个GPIO结构体变量

GPIO_InitTypeDef GPIO_InitStructure;

//定义一个GPIO结构体变量

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;           // LED所在的IO口,定时器14     

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; //上拉

//初始化GPIOF

GPIO_Init(GPIOF,&GPIO_InitStructure);

/将GPIO复用至TIM14

GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);

//使能定时器14的外设时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);

//声明一个定时器结构体变量

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

 

TIM_TimeBaseInitStructure.TIM_Period=499;     //Tout=(ARR+1)(PSC+1)/Tclk   (499+1)(83+1)/(84M)=500*(1us)=500us

TIM_TimeBaseInitStructure.TIM_Prescaler=83;

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

//³õʼ»¯¶¨Ê±Æ÷14

TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStructure);

//PWMÉèÖÃ

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //PWM1模式

TIM_OCInitStructure.TIM_OutputState=ENABLE;     //使能至输出引脚

TIM_OCInitStructure.TIM_Pulse=250; //加载值CCR中的值

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //输出的极性

TIM_OC1Init(TIM14,&TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);       //比较其重装载

TIM_ARRPreloadConfig(TIM14,ENABLE);             //使能定时器的重装载

//使能定时器14

TIM_Cmd(TIM14,ENABLE);

}


最后若要想动态的改变占空比,就要在主函数中调用以下函数来设置:


TIM_SetCompare1(TIM14,pwmval);

关键字:STM32F4  PWM 引用地址:STM32F4之PWM设计

上一篇:从STM32F4的库函数分析如何实现点亮一个LED(代码存放位置)
下一篇:STM32F4之定时器

推荐阅读最新更新时间:2024-11-12 18:31

STM32F407-串口通信基本原理
1.处理器与外部设备通信的两种方式: 并行通信 -传输原理:数据各个位同时传输。 -优点:速度快 -缺点:占用引脚资源多 串行通信 -传输原理:数据按位顺序传输。 -优点:占用引脚资源少 -缺点:速度相对较慢 2.串行通信 按照数据传送方向,分为: 单工: 数据传输只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信; 全双工: 允许数据同时在两个方向上传输,因此,全双工通信是两个 单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 3.串行通信的通
[单片机]
<font color='red'>STM32F4</font>07-串口通信基本原理
stm32F4做浮点计算的问题
各位大神,我现在移植一套程序到stm32F4上,之前是在PC机上跑的,考虑到这款芯片有FPU所以选的这款,在DEBUG的时候发现很多问题,除了设置FPU外,发现一些很简单的运算也会出问题,不知道有没有遇到同样问题的人,经常会跳到HardFault_Handler这个函数中去,有没有人知道这怎么解决的? 之前是因为FPU设置没有开启,所以遇到浮点运算就会崩溃,一些简单的浮点赋值语句就会崩溃,但是现在开启了,但是现在一些简单的计算还是会崩溃,有没有人遇到过这种情况的? 今天也在找这个问题,看到这个还是12年的帖子,帖子中还没有解决问题的方法。我把我找到的分享一下: 这是ST的库的问题,在systeminit的函数里,加上以
[单片机]
stm32f407之DAC(操作寄存器)
DAC Stm32f4内嵌的DAC是12位数字输入,电压输出的数模转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。 主要特点: 2个DAC转换器:每个转换器对应1个输出通道 8位或者12位单调输出 12位模式下数据左对齐或者右对齐 同步更新功能 噪声波形生成 三角波形生成 双DAC通道同时或者分别转换
[单片机]
stm32的pwm学习总结
由于这次参加电脑鼠的芯片是stm32系列的,再加上时间上比较紧,所以在做模块时我们基本上是边学边做。遇到了不少的困难,但还是感觉学到了不少的东西,想拿出来分享分享。。好了,废话少说,转入正题。 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 STM32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出!这里我们
[单片机]
浅谈LED型固态照明中模拟亮度调节与PWM亮度调节的运用
诸如智能手机或者便携式GPS导航系统背光照明等应用中,必须使用LED亮度调节,目的是让用户在强太阳光和夜晚弱光条件下都能看清楚屏幕。使用手电筒时,用户认为较长的电池使用时间更加重要,而非提供最强的光线照明。我们可以在这些应用中使用模拟亮度调节或者脉宽调制(PWM)亮度调节方法。模拟设计通过使用一种创新方法来建立起一个参考电压,从而获得比PWM型设计更高的效率。 模拟和PWM亮度调节方法都对LED驱动电流进行控制,而该电流同光线输出成正比关系。模拟亮度调节结构简单,控制功耗最低,并且一般比PWM亮度调节方法要高效,原因是低驱动电流时LED正向电压更低。 但是,模拟亮度调节要求通过一个单独的电压基准生成模拟电压(可能会对某个方波输入信
[电源管理]
浅谈LED型固态照明中模拟亮度调节与<font color='red'>PWM</font>亮度调节的运用
STM32F4xx位带操作
简介:本文给大家分享了STM32F4xx位带操作。 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF) 5)+(bitnum 2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //F4XXIO 口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014 #define GPI
[单片机]
STM32F407——多功能跑马灯
1、完成多功能跑马灯项目。。 2、预习中断。。 #正点视频第2讲开发板入门,第3讲stm32学习方法,第4讲NVIC中断优先级管理,第28讲外部中断实验-EXTI。。 ##多功能跑马灯 #include sys.h #include delay.h #include usart.h #include led.h #include beep.h #include key.h //ALIENTEK 探索者STM32F407开发板 实验3 //按键输入实验-库函数版本 //技术支持:www.openedv.com //淘宝店铺:http://eboard.taobao.com //广州市星翼电子科技有限公
[单片机]
stc12c2052ad pwm程序
#include reg52.h sfr CCON =0xD8; //PCA control register sfr CMOD =0xD9; sfr CL =0xe9; sfr CH =0xF9; sfr CCAP0L=0xea; sfr CCAP1L=0xeb; sfr CCAP0H=0xfa; sfr CCAP1H=0xfb; sfr CCAPM0=0xda; sfr CCAPM1=0xdb; sbit CR=0xde; //位寻址 void main(void) { CMOD=0x02; //使用系统时钟,时钟输入源频率fosc/2。PWM频率=fosc/2/256 /*************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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