练习STM32动态更改PWM波频率和占空比

2019-08-21来源: eefocus关键字:STM32  动态更改  PWM波频率  占空比

STM32的PWM波动态调频和调占空比

以TIM3_CH1为例

(1)定时器工作原理

定时器的时基单元包含三个部分:①自动装载寄存器(TIMx_ARR),②预分频器寄存器 (TIMx_PSC),③计数器寄存器(TIMx_CNT)。设置自动装载值,预分频器根据所设置的分频系数(1-65536)对定时器所选择的时钟源进行分频,分频后的频率驱动计数器。计算器开始计数,当计数器达到自动装载值时,重新开始计数!

以秒表举例:时钟源是秒针,经过60分频后的频率变成分针,分针一分钟一分钟的增加,当分针数达到60时,又从零开始计数。在这个例子中,秒针是时钟源,第一个60就是预分频器设置的值,第二个60就是自动装载寄存器设置的值。

(2)PWM波工作原理

PWM波就是一串周期性的高低电平信号,不过高低电平持续时间可调。当以定时器为驱动时,定时器的计数频率就是PWM波的频率,然后根据TIMx_CCRx设置的值和定时器计数器当前的数值TIMx_CNT比较大小,根据比较结果输出高低电平。比较结果和高低电平之间的关系就是我们设置的PWM对齐方式。

同样以上文的秒表举例,如果我们设置为边沿对齐的向上计数模式,当我们设置的值为30时,分针数每次加一都和30比较,比30小则输出高电平,反之低电平。

(3)PWM波调频和调占空比的实现方式

1、调节占空比:只要根据设置的TIMx_ARR寄存器的值和所需要的占空比设置TIMx_CCRx寄存器的值即可。例如:TIMx_ARR的值为100,需要占空比为50%,则设置TIMx_CCRx的值为50即可。

2、调频:

①更改预分频器的值,改变计数器的频率

如下图:摘自STM32F1xx的中文参考手册


在这里插入图片描述

如图:

当预分频系数为1时,一个定时器时钟周期就是一个时钟源周期,在F8-FC之间,一个定时器周期,计数器加一。

当预分频系数为4时,一个定时器时钟周期就是4个时钟源周期,在00-01之间,一个定时器周期,即4个时钟源周期,计数器加一。

②计数器频率一定时,改变TIMx_ARR的值。计数器频率一定,计数到100之后从零开始肯定比计数到1000从零开始更快。

如下图:摘自STM32F1xx的中文参考手册

在这里插入图片描述

如图:设置了TIMx_ARR寄存器之后要通过设置TIMx_CR1寄存器的ARPE位使之生效

(4)PWM波调占空比和调频程序源码以及KEIL MDK5的仿真图

1、TIM3_CH1初始化程序


void TIM3_CH1_Init(u32 fcount)

{

TIM_TimeBaseInitTypeDef TIM3_CH1;

TIM_OCInitTypeDef TIM3_OC_PWM;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

TIM3_CH1.TIM_Period=fcount;  //自动重载值

TIM3_CH1.TIM_Prescaler=71;  //分频系数

TIM3_CH1.TIM_CounterMode=TIM_CounterMode_Up;

TIM3_CH1.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM3,&TIM3_CH1);

TIM3_OC_PWM.TIM_OCMode=TIM_OCMode_PWM1;

TIM3_OC_PWM.TIM_OutputState=TIM_OutputState_Enable;

TIM3_OC_PWM.TIM_OCPolarity=TIM_OCPolarity_Low;

TIM3_OC_PWM.TIM_Pulse=(fcount/2);//占空比为50%

TIM_OC1Init(TIM3,&TIM3_OC_PWM);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM3,ENABLE);

TIM_Cmd(TIM3,ENABLE);

}


2、调节占空比:

在STM32F103中有封装好的调节占空比的函数TIM_SetCompare1();直接调用即可。

TIM_SetCompare1()的函数介绍如下图

在这里插入图片描述

程序如下:


int main()

{

SystemInit();

led_init();

systick_init(72);

    TIM3_CH1_Init(100);

while(1)

{

u8 i;

for(i=10;i<=100;i+=10)

{

delay_us(5);

TIM_SetCompare1(TIM3,i);

}

    }

}


仿真结果如下图:

随着时间增加,PWM波的占空比在增大。

在这里插入图片描述

3、调节频率:

①通过更改预分频器的值,改变计数器的频率的方式改变PWM波的频率

在STM32F103中有封装好的调节预分频器的函数 TIM_PrescalerConfig();直接调用即可。

TIM_PrescalerConfig()的介绍以及参数形式如下图

在这里插入图片描述

程序如下:



int main()

{

SystemInit();

led_init();

systick_init(72);

  TIM3_CH1_Init(100);

while(1)

{

u8 i,j;

u32 fre=100,psc;

for(i=1;i<=6;i++)

{

psc=720000/fre;//更改后的分频系数

j=5*i;

TIM_Cmd(TIM3,DISABLE);

    delay_ms(j);

    TIM_PrescalerConfig(TIM3,psc-1,TIM_PSCReloadMode_Immediate);

TIM_Cmd(TIM3,ENABLE);

delay_ms(50);

fre=5*fre;

}

     }

}


仿真结果如下图:

PWM波的频率明显增加了,如果放大了看,频率正好是按照设置的5倍增加的

在这里插入图片描述

②通过改变TIMx_ARR的值,调节PWM波的频率

程序如下:


int main()

{

SystemInit();

led_init();

systick_init(72);

  TIM3_CH1_Init(100);

while(1)

{

delay_ms(500);

TIM_Cmd(TIM3,DISABLE);

TIM_ARRPreloadConfig(TIM3,DISABLE);

delay_ms(5);

TIM3->ARR=0x2710;//计数到10000在归零重新计数

TIM3->CCR1=0x1388;//保持占空比为50%

TIM_ARRPreloadConfig(TIM3,ENABLE);

TIM_Cmd(TIM3,ENABLE);

delay_ms(500);

    }

}


仿真结果如下:

在这里插入图片描述

关键字:STM32  动态更改  PWM波频率  占空比

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471907.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32的PWM的频率和占空比设定
下一篇:STM32 PWM占空比的计算及输出比较时CCR不同

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

秉火429笔记之一初识STM32

1. STM32概述STM32,ST为意法半导体,M是Microelectronics的缩写,32表示32位,简而言之,STM32即为ST公司开发的32位微控制器。2. STM32分类STM32包含多个系列,从内核分为Cortex-M0、M3、M4、M7,每个内核有大概分为主流、高性能和低功耗。3. STM32命名规则
发表于 2019-09-12
秉火429笔记之一初识STM32

基于STM32的简单电子书的实现

;,16,RED,WHITE,0);printf("res=%x",res);return 1;         }else{       fnShowString(10,120,"open ok",16,RED,WHITE,0);}        f_lseek(&f1,32*((H8-0xa0-1)*94+(L8-0xa0-1)));                 
发表于 2019-09-12

stm32 各头文件或C文件功能

stm32f10x_con.h配置文件:加载哪个外设、使能assert 对参数进行检查,如果使能了assert 需要在main文件中添加 _assert_faild 函数。 使能assert会增大编译出执行文件的大小,调试完后可以将assert 屏蔽。stm32f10x.h头文件中包含了stm32f10x_conf.h 。stm32f10x.h1、对所有的外设的地址进行映射,映射到存储区,即定义某外设结构体变量,因为结构体是连续存储的只要将外设的基地址强制转换为结构体类型的指针,那么该外设的寄存器就可以通过指针进行访问,以GPIO为例:定义外设的结构体,结构体变量都是volatile类型,告诉编译器不要进行优化,读取值从内存读取
发表于 2019-09-12

stm32通过spi连接esp8266的hspi 开发

刚刚做了stm32通过spi连接esp8266的开发,目前已经解决了遇到的大多数问题,基本可以交付使用了,写一篇文章留作记录,也可以给以后做这个的朋友做为参考。esp8266模块本身发布的时候默认里边烧写的是AT固件,虽然硬件上有spi的引脚,但是并不支持spi的通信,如果要支持spi的通信,自行修改编译esp8266的sdk,写自己需要的代码来实现。本身sdk中有相关的例程,根据例程的代码修改调试就可以实现相应的功能。使用spi的好处,第一 可以节省一个串口,因为stm的串口资源是比较有限的。另外spi的通讯速度要比串口快一些。这篇文章将包含如下的一些内容:1,stm32 spi的驱动如何开发?2,esp8266端的驱动如何开发
发表于 2019-09-12
stm32通过spi连接esp8266的hspi 开发

stm32的SPI设置步骤,SPI配置参数

用stm32的库进行深入SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。四根线MISO 主设备数据输入,从设备数据输出。MOSI 主设备数据输出,从设备数据输入。SCLK时钟信号,由主设备产生。CS从设备片选信号,由主设备控制。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节时钟极性CPOL对传输协议没有重大的影响,代表串行同步时钟的空闲状态下的电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升
发表于 2019-09-12

关于STM32f103 SPI时钟速度的问题

STM32f103 中APB1的最高频率是36MHz,APB2的最高频率是72MHz,而PCLK1和PCLK2一般也默认配置为其最高工作频率36M和72M。如下图(STM32F10xx_参考手册(第7版) 第46页)时钟树所示:SPI1时钟由APB2时钟分频而来,可以选择2、4、8、16、32、64、128、256这几个分频系数。而手册规定STM32的SPI时钟最快是18MHz。对于STM32F103的SPI1接口时钟,由72M的PCLK2分频得到,所以分配系数大于等于4(72M/4 = 18M)。对于STM32F103的SPI2/SPI3接口时钟,由36M的PCLK1分频得到,所以分配系数大于等于2(36M/2 = 18M
发表于 2019-09-12
关于STM32f103 SPI时钟速度的问题

小广播

何立民专栏

单片机及嵌入式宝典

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

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