完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本文将介绍通过STM32的定时器输出PWM,如果对定时器不太熟悉的同学可以看下之前的文章《STM32基础定时器详解》,关于定时器的基础功能不再详解。
1、PWM介绍 PWM定义:脉冲宽度调制(PulseWidthModulation,PWM)简称脉宽调制。通俗讲,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。 占空比定义:占空比就是高电平所占整个周期的时间,如下图所示: 第一个PWM波,周期为10ms,高电平的时间为4ms,所以占空比为40%,同理第二个PWM波为60%,第三个为80%。 PWM的频率: PWM的频率的整个周期的倒数,所以说上图PWM的周期为1/0.01,也就是100HZ。改变PWM的频率是通过改变整个的周期实现的。所以通过改变高低电平总共的时间、改变高电平占总周期的比例就可以实现任意频率、任意占空比的PWM波。 PWM的用途和优点:电机调速、功率调制、PID调节、通信等等,配置简单、抗干扰能力强,从处理器到被控系统信号都是数字形式的,无需进行数模转换。并且让信号保持为数字形式可将噪声影响降到最小,噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响,这是PWM用于通信的主要原因。 2、STM32的管脚复用 STM32没有专门的PWM引脚,所以使用IO口的复用模式。首先确认PWM功能的输出管脚,使用定时器9。从下面的框图中得知,timer9只有两个输出通道,所以timer9只能输出两路PWM。 在STM32F207数据手册中的Alternatefunction mapping图片中,timer9的两个通道分别可以复用为PA2,PA3,PE5和PE6。 3、STM32输出PWM原理 下图中的①部分,在《STM32基础定时器详解》讲解过了,关于影子寄存器,也在《STM32影子寄存器》中讲述,下文不再赘述了。本文将重点在②部分,捕获/对比通道讲解,其中STM32的PWM就是利用对比通道实现的。 Pulse Width Modulation mode allows you to generate a signal with afrequency determined by the value of the TIMx_ARR register and a dutycycle determined by the value of the TIMx_CCRx register。 脉冲宽度调制模式可以生成一个信号,该信号频率由TIMx_ARR 寄存器值决定,其占空比则由TIMx_CCRx 寄存器值决定。 从下图可以看出,当CCR寄存器和CNT计数器数值一样时,会产生动作(改变通道对应的GPIO电平)。由于CNT溢出时,重载值由TIMx_ARR寄存器值决定的。所以说TIMx_ARR寄存器值决定周期,而TIMx_CCRx寄存器值决定CNT溢出时,经过多久会产生动作(改变通道对应的GPIO电平),也就是决定了占空比。 以向上计数为例,重载值为ARR,比较值为CRRx 上图可以看出: 0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平。 t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平。 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数。..循环此过程至此一个PWM周期完成。 上图更加形象的说明了 信号频率由 TIMx_ARR 寄存器值决定。 占空比则由 TIMx_CCRx 寄存器值决定。 STM32输出PWM的过程: 1、首先配置GPIO,配置定时器,具体参考一下代码。定时器配置参考《STM32基础定时器详解》。 2、捕获/比较通道使能比较通道。 上图看到,①寄存器名字为:Capture/Compare1register。可以选择从②处输入捕获,也可以选择从从③中输出,也就是我们需要的PWM输出功能。选择捕获通道,还是选择比较通道,在框图中没有找到具体的说明,但在TIMx_CCMR1寄存器CC1S[1:0]控制位使能。 3、使能完输出,就要配置PWM输出了 ①TIMx_CCMR1寄存器的OC1M[2:0]位,设置输出模式控制器 110:PWM模式1,111:PWM模式2。 ②计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平。 OC1REF=0 无效电平,OC1REF=1无效电平。 ③通过输出模式控制器产生的信号。TIMx_CCER寄存器的CC1P位,设置输入/捕获通道1输出极性。 0:高电平有效,1:低电平有效。 ④TIMx_CCER:CC1E位控制输出使能电路,信号由此输出到对应引脚。 0:关闭,1:打开。 首先对PWM模式1和PWM模式2进行介绍: 模式1 在向上计数时,一旦TIMx_CNT《TIMx_CCR1时通道1为有效电平,否则为无效电平;在向上计数时,一旦TIMx_CNT》TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 模式2 在向上计数时,一旦TIMx_CNT《TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT》TIMx_CCR1时通道1为有效电平,否则为无效电平。 TIMx_CNT》TIMx_CCR1时通道1为有效电平,否则为无效电平。 PWM输出高低电平由TIMx_CCMR1:OC1M位和TIMx_CCER:CC1P位共同决定。 总结下来: 模式1: CNT《CCR为有效电平//(OC1REF =1) CNT》CCR为无效电平//(OC1REF =0) 模式2: CNT《CCR为无效电平//(OC1REF =0) CNT》CCR为有效电平//(OC1REF =1) CC1P: 0:高电平有效 1:低电平有效 4、STM32输出PWM配置 分析了原理,那么下面就分析STM32生成PWM的过程。 1、首先要将GPIO设置为复用输出 /* GPIOE clock enable */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); /* GPIOE Configuration: TIM9 CH2 (PE6)*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;GPIO_Init(GPIOE, &GPIO_InitStructure); /* Connect TIM9 pins to AF3 */ GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_TIM9);GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9); 2、配置定时器向上计数,配置定时器频率 /* TIM9 clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);/* Compute the prescaler value */PrescalerValue = (uint16_t) ((SystemCoreClock) / 2000000) - 1;/* Time base configuration */TIM_TimeBaseStructure.TIM_Period = 1000-1;TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStructure); 3、配置PWM输出 上面分析过程较为麻烦,ST提供了标准外设库,我们只需要配置TIM_OCInitTypeDef结构体即可。 TIM_OCInitTypeDef TIM_OCInitStructure;/* PWM Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 100-1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM9, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable); TIM_OCInitTypeDef结构体解析 typedef struct{ uint16_t TIM_OCMode; //PWM模式1或者模式2 uint16_t TIM_OutputState; // 输出使能OR失能 uint16_t TIM_OutputNState; // PWM输出不需要 uint32_t TIM_Pulse; // 比较值 uint16_t TIM_OCPolarity;// 比较输出极性 uint16_t TIM_OCNPolarity; // PWM输出不需要 uint16_t TIM_OCIdleState;// PWM输出不需要 uint16_t TIM_OCNIdleState; // PWM输出不需要}TIM_OCInitTypeDef; 其中TIM_Pulse可以在初始化时设置,设置完毕后,也可以通过以下接口再次更新。 void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1) 4、使能定时器 TIM_ARRPreloadConfig(TIM9, ENABLE);/* TIM9 enable counter */TIM_Cmd(TIM9, ENABLE); 使用timer9输出PWM的波形 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1933浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
726浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
550浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 13:57 , Processed in 0.858526 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号