STM32高级定时器日记之PWM

合集下载

STM32 TIM的PMW模式

STM32 TIM的PMW模式

STM32 TIM的PMW模式STM32开发板学习日记-[5]TIM的PMW模式脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。

必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。

因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。

OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP 位设置,它可以设置为高电平有效活或低电平有效。

TIMx_CCER寄存器中的CCxE位控制OCx输出使能。

在PWM模式(模式1或模式2)下,TIMx_CNT和TIM1_CCRx 始终在进行比较,(依据计数器的计数方向)以确定是否符合TIM1_CCRx≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRx。

然而为了与OCREF_CLR的功能(在下一个PWM周期之前,ETR信号上的一个外部事件能够清除OCxREF)一致,OCxREF信号只能在下述条件下产生:●当比较的结果改变●当输出比较模式(TIMx_CCMRx寄存器中的OCxM位)从“冻结”(无比较,OCxM=’000’)切换到某个PWM模式(OCxM=’110’或’111’)。

STM32高级定时器TIM1输出六路带死区互补PWM波形

STM32高级定时器TIM1输出六路带死区互补PWM波形

本文讲述如何配置单片机STM32F407VET6高级定时器TIM1输出六路带死区互补PWM波形。

一、高级定时器TIM1介绍
高级定时器TIM1有5种计数模式:
TIM_CounterMode_Up、TIM_CounterMode_Down
TIM_CounterMode_CenterAligned1
TIM_CounterMode_CenterAligned2
TIM_CounterMode_CenterAligned3
PWM输出有2种模式:
TIM_OCMode_PWM1、TIM_OCMode_PWM2
查看ST官方RM0090参考手册,高级定时器TIM1框图如下:
本文以高级定时器TIM1工作在TIM_CounterMode_Up模式,PWM工作在TIM_OCMode_PWM1为例,讲述如何配置输出六路带死区互补PWM波形。

二、配置代码示例
1.IO配置
硬件IO说明
TIM1_CH1---->PE9 TIM1_CH1N---->PE8
TIM1_CH2---->PE11 TIM1_CH2N---->PE10
TIM1_CH3---->PE13 TIM1_CH3N---->PE12
IO配置具体代码如下:
2. 定时器配置
三、实验测试
1. 测试硬件平台接线
2.测试结果
由测试结果可以看到高级定时器TIM1可以输出六路带死区互补PWM波形。

具体死区时间如何计算,下篇文章会讲解,敬请关注!。

stm32PWM输入捕获

stm32PWM输入捕获

stm32PWM输入捕获tm32定时器pwm输入捕获输入捕捉的功能是记录下要捕捉的边沿出现的时刻,如果你仅仅捕捉下降沿,那么两次捕捉的差表示输入信号的周期,即两次下降沿之间的时间。

如果要测量低电平的宽度,你应该在捕捉到下降沿的中断处理中把捕捉边沿改变为上升沿,然后把两次捕捉的数值相减就得到了需要测量的低电平宽度。

如果要的测量低电平太窄,中断中来不及改变捕捉方向时,或不想在中断中改变捕捉方向,则需要使用PWM输入模式,或使用两个TIM某通道,一个通道捕捉下降沿,另一个通道捕捉上升沿,然后对两次捕捉的数值相减。

PWM输入模式也是需要用到两个通道。

使用两个通道时,最好使用通道1和通道2,或通道3和通道4,这样上述功能只需要使用一个I/O管脚,详细请看STM32技术参考手册中的TIM某框图。

//0-----------------------一、概念理解PWM输入捕获模式是输入捕获模式的特例,自己理解如下1.每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。

且IC1IC2一组,IC3IC4一组。

并且可是设置管脚和寄存器的对应关系。

2.同一个TI某输入映射了两个IC某信号。

3.这两个IC某信号分别在相反的极性边沿有效。

4.两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。

5.当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。

6.同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)7.由此可以计算出PWM的时钟周期和占空比了frequency=f(TIM时钟频率)/n。

dutycycle=(高电平计数个数/n),若m为高电平计数个数,则dutycycle=m/n若m为低电平计数个数,则dutycycle=(n-m)/n 注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的最小频率=TIM时钟频率/65535。

stm32 pwm调节转速原理

stm32 pwm调节转速原理

STM32的PWM调节转速原理主要基于PWM(Pulse Width Modulation)脉冲宽度调制。

通过编程控制输出方波的频率和占空比(高低电平的比例),可以实现对电机转速的控制。

在直流电机驱动中,PWM调速的基本原理是通过控制电机通电的电压来实现转速的调节。

当提高电压时,反电势升高,进而转速升高。

因此,通过控制PWM信号的占空比,可以实现对电机通电电压的调节,从而控制电机的转速。

在STM32中,可以通过定时器产生PWM信号,并通过调节占空比来控制电机的转速。

具体实现方式如下:
1.设置定时器工作模式为PWM模式,并配置相应的PWM通道和占空比。

2.根据需要调节占空比的值,以控制电机通电的电压。

3.将PWM信号输出到电机驱动器,从而实现对电机转速的控制。

需要注意的是,具体的PWM调速实现方式可能会因电机的类型、驱动器的型号等因素而有所不同。

因此,在实际应用中,需要根据具体情况进行相应的调整和配置。

STM32++定时器与+PWM+快速使用入门

STM32++定时器与+PWM+快速使用入门

STM32 定时器与 PWM 快速使用入门要求:在万利的开发板 EK-STM32F 上产生周期为1秒,占空比分别为 50% 10%的 PWM 并且点亮板上的 LD1,LD2 灯闪烁。

做法很简单。

STM32的PWM是由定时器来产生的。

可以看出。

定时器3的通道1至4在GPIO端口的映像。

如果是完全映射。

各通道的连接引脚如下:CH1=PC6, CH2=PC7, CH3=PC8, CH4=PC9这样,刚好与板上的LD1,LD2灯符合,因为LD1连接到PC7,LD2连接到PC6引脚。

关于PWM一些知识.STM32的TIMx 是 TIMx_ARR 寄存器确定频率(周期)、由TIMx_CCRx 寄存器确定占空比的信号。

使用定时器3。

而TIM2、3、4的时钟源是 APB1 即是 PCLK1 ( APB1 对应 PCLK1 )PCLK1 = APB1 = HCLK/2 = SYSCLK/2 = 36MHZ (36,000,000 HZ)但是注意:倍频器会自动倍2,即是【72MHZ】!代码如下:voidSTM32_PWM_GPIO_Configuration(void){// 11:完全映像STM32_Afio_Regs-&gtmapr.bit.TIM3_REMAP=3;// LD1 =P7 LD2=PC6/*GPIOA Configuration: ( PC6 PC7 ) TIM3 channel 1 and 2 as alternate function push -pull */STM32_Gpioc_Regs-&F6=Output_Af_push_pull; // PC.06 复用功能推挽输出模式STM32_Gpioc_Regs-&gtcrl.bit.MODE6=Output_Mode_50mhz; // PC.06 输出模式,最大速度50MHzSTM32_Gpioc_Regs-&F7=Output_Af_push_pull; // PC.07 复用功能推挽输出模式STM32_Gpioc_Regs-&gtcrl.bit.MODE7=Output_Mode_50mhz; // PC.07 输出模式,最大速度50MHz}//end subvoidSTM32_TIM3_Configuration(void){// TIM_DeInit( TIM3);//复位TIM3定时器STM32_Rcc_Regs-&gtapb1rstr.all |= RCC_TIM3RST;STM32_Rcc_Regs-&gtapb1rstr.all &= ~RCC_TIM3RST;//时钟使能STM32_Rcc_Regs-&gtapb1enr.all |=RCC_TIM3EN;/* TIM3 base configuration *///TIM_TimeBaseStructure.TIM_Period = 9999;//TIM_TimeBaseStructure.TIM_Prescaler = 7200;//TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);STM32_Tim3_Regs-&gtarr.all=9999; // 定时周期,PWM频率! 10毫秒*100=1秒STM32_Tim3_Regs-&gtpsc.all=720; // 7200分频 72MHZ/72,00 72,000,000/72,00=10,000STM32_Tim3_Regs-&gtcr1.bit.CKD=0; // 时钟分频因子STM32_Tim3_Regs-&gtcr1.bit.DIR=0; // 0:计数器向上计数/* Clear TIM3 update pending flag[清除TIM3溢出中断标志] *///TIM_ClearFlag(TIM3, TIM_FLAG_Update);STM32_Tim3_Regs-&gtsr.bit.UIF=0; //更新中断标记由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化/* PWM1 Mode configuration: Channel1 Channel2 *///TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OC1Init(TIM3, &TIM_OCInitStructure);// timer3 的通道1 是 PC6 引脚, AFIO完全映射STM32_Tim3_Regs-&1P=0; // 输入/捕获1输出极性 0:OC1高电平有效 1:OC1低电平有效STM32_Tim3_Regs-&1E=1; // 输入/捕获1输出使能 1:开启- OC1信号输出到对应的输出引脚。

stm32 中pwm频率计算公式

stm32 中pwm频率计算公式

一、概述在嵌入式系统开发中,PWM(脉冲宽度调制)是一种重要的控制技术,常用于电机驱动、灯光控制、无线通讯和其他类似应用领域。

对于STM32系列的微控制器来说,如何准确地计算PWM的频率是一个关键问题。

本文将介绍STM32中PWM频率的计算公式,希望对开发者们有所帮助。

二、PWM频率计算公式在STM32系列微控制器中,PWM的频率计算可以使用以下公式:\[PWM频率 = \frac{定时器时钟频率}{预分频系数 * 定时器自动重载值}\]其中,各参数的含义如下:1. 定时器时钟频率:定时器的时钟频率取决于系统时钟的频率以及定时器的分频系数。

一般情况下,定时器的时钟频率可以表示为:\[定时器时钟频率 = 系统时钟频率 / 分频系数\]如果系统时钟频率为72MHz,定时器的分频系数为72,那么定时器时钟频率为1MHz。

2. 预分频系数:预分频系数决定了定时器时钟频率的除数。

通过修改预分频系数,可以改变PWM信号的频率。

在STM32系列微控制器中,通常有多个预分频系数可以选择,开发者可以根据具体应用需求进行选择。

3. 定时器自动重载值:定时器的自动重载值决定了PWM周期的长度。

一般情况下,定时器的计数范围为0到定时器自动重载值,当定时器计数达到自动重载值时,定时器会自动清零并产生中断。

通过以上公式,开发者可以根据具体的系统时钟频率、预分频系数和定时器自动重载值来计算出所需的PWM频率。

三、实例分析为了更直观地理解PWM频率的计算方法,接下来将通过一个实例来演示具体的计算过程。

假设我们需要设计一个PWM信号,其频率为1kHz,系统的时钟频率为72MHz。

我们可以根据需要的PWM频率来确定定时器的自动重载值。

由于所需的PWM频率为1kHz,因此PWM周期为1ms。

根据PWM的工作原理,我们知道PWM信号的周期T与频率f的关系为:\[T = \frac{1}{f}\]PWM周期T为1ms。

我们需要根据系统时钟频率来确定定时器的分频系数。

STM32TIM的PMW模式

STM32TIM的PMW模式

STM32TIM的PMW模式STM32 TIM的PMW模式STM32开发板学习⽇记-[5]TIM的PMW模式脉冲宽度调制模式可以产⽣⼀个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空⽐的信号。

在TIMx_CCMRx寄存器中的OCxM位写⼊’110’(PWM模式1)或’111’(PWM模式2),能够独⽴地设置每个OCx输出通道产⽣⼀路PWM。

必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能⾃动重装载的预装载寄存器(在向上计数或中⼼对称模式中)。

因为仅当发⽣⼀个更新事件的时候,预装载寄存器才能被传送到影⼦寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。

OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP 位设置,它可以设置为⾼电平有效活或低电平有效。

TIMx_CCER寄存器中的CCxE位控制OCx输出使能。

在PWM模式(模式1或模式2)下,TIMx_CNT和TIM1_CCRx始终在进⾏⽐较,(依据计数器的计数⽅向)以确定是否符合TIM1_CCRx≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRx。

然⽽为了与OCREF_CLR 的功能(在下⼀个PWM周期之前,ETR信号上的⼀个外部事件能够清除OCxREF)⼀致,OCxREF信号只能在下述条件下产⽣:●当⽐较的结果改变●当输出⽐较模式(TIMx_CCMRx寄存器中的OCxM位)从“冻结”(⽆⽐较,OCxM=’000’)切换到某个PWM模式(OCxM=’110’或’111’)。

这样在运⾏中可以通过软件强置PWM输出。

根据TIMx_CR1寄存器中CMS位的状态,定时器能够产⽣边沿对齐的PWM信号或中央对齐的PWM信号。

110:PWM模式1-在向上计数时,⼀旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为⽆效电平;在向下计数时,⼀旦TIMx_CNT>TIMx_CCR1时通道1为⽆效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

STM32之PWM波形输出配置总结

STM32之PWM波形输出配置总结

STM32之PWM波形输出配置总结1.TIMER分类STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

其中系统嘀嗒定时器是前文中所描述的SysTick。

其中TIM1和TIM8是能够产生3对PWM互补输出,常用于三相电机的驱动,时钟由APB2的输出产生。

TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

2.PWM波形产生的原理通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。

举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X 在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。

而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR 预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。

如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A 乘以触发脉冲的时钟周期,即输出PWM的占空比为 A/(N+1) 。

3.STM32产生PWM的配置方法1)配置GPIO口不是每一个IO引脚都可以直接使用于PWM输出,下面是定时器的引脚重映像,其实就是引脚的复用功能选择:表3-1 定时器1的引脚复用功能映像表3-2 定时器2的引脚复用功能映像表3-3 定时器3的引脚复用功能映像表3-4 定时器4的引脚复用功能映像根据以上重映像表,我们使用定时器3的通道2作为PWM的输出引脚,所以需要对PB5引脚进行配置,对IO口操作代码:2)初始化定时器3)设置TIM3_CH2的PWM模式、使能TIM3的CH2输出4)使能定时器3经过以上的操作,定时器3的第二通道已经可以正常工作并输出PWM波了,只是其占空比和频率都是固定的,我们可以通过改变TIM3_CCR2,则可以控制它的占空比。

stm32的pwm输出及频率计算方法

stm32的pwm输出及频率计算方法

stm32的pwm输出及频率计算方法
一、stm32的pwm输出引脚是使用的IO口的复用功能。

二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。

三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。

四、给出了PWM频率和占空比的计算公式。

步骤如下:
1、使能TIM3时钟
RCC->APB1ENR |= 1 2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL //PA6清0GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)GPIOA->ODR |= 1
3、设定计数器自动重装值及是否分频
TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)TIM3->PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可
注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。

//TIM3->CCMR1 |= 6 TIM3->CCMR1 |= 7 TIM3->CCMR1 |= 1
5、输出使能设置
TIM3->CCER |= 1。

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解STM32高级定时器TIM1具有四个独立的PWM输出通道,可以用来控制四个不同的设备或驱动器。

在本篇文章中,我们将详细讲解如何使用寄存器操作实现TIM1的四路PWM输出。

首先,需要了解几个相关的概念。

STM32的定时器是通过寄存器进行配置和操作的,其中TIM1是高级定时器,具有更高级的功能和更多的寄存器。

PWM(脉冲宽度调制)是一种常见的控制技术,可实现模拟信号的数字化控制,通过调整高电平和低电平的时间比例来控制目标设备或驱动器的动作。

在开始编写程序之前,我们首先需要对TIM1进行初始化和配置。

以下是一个基本的初始化函数示例:```void TIM1_PWM_Init//开启TIM1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//初始化TIM1的配置TIM_TimeBaseInitTypeDef TIM_BaseStruct;TIM_OCInitTypeDef TIM_OCStruct;TIM_BaseStruct.TIM_Prescaler = 0;TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_BaseStruct.TIM_Period = 999; // 设置周期为1000TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_BaseStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_BaseStruct);//配置输出比较通道TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCStruct.TIM_Pulse = 0; // 设置脉冲宽度,0表示低电平TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM1, &TIM_OCStruct);TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC2Init(TIM1, &TIM_OCStruct);TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC3Init(TIM1, &TIM_OCStruct);TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC4Init(TIM1, &TIM_OCStruct);TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//启动定时器TIM_Cmd(TIM1, ENABLE);```上述代码是一个初始化TIM1的函数示例,其中包含了基本的配置步骤。

STM32HAL库学习系列第4篇定时器TIM-----开始定时器与PWM输出配置

STM32HAL库学习系列第4篇定时器TIM-----开始定时器与PWM输出配置

STM32HAL库学习系列第4篇定时器TIM-----开始定时器与PWM输出配置基本流程:1.配置定时器2.开启定时器3.动态改变pwm输出,改变值HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);函数总结:1 __HAL_TIM_SET_COMPARE()// 是设置CCRx,⼀般是⽤在PWM输出的,控制PWM占空⽐2 __HAL_TIM_GET_COMPARE // 是⽤来读取CCRx的,⼀般⽤于捕获处理PWM输出配置:频率设置:1static void MX_TIM2_Init(void)2 {3 TIM_MasterConfigTypeDef sMasterConfig;4 TIM_IC_InitTypeDef sConfigIC;5 TIM_OC_InitTypeDef sConfigOC;6 htim2.Instance = TIM2;7 htim2.Init.Prescaler = (36-1); //实际时钟频率为 72M/36=2MHz /40000=50H,-----490HZ,改变观察电机输出状态定时器预分频器8 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;9 htim2.Init.Period = (4082-1); //定时器周期配置 PWM频率为 490KHz 定义定时器周期,PWM频率为:168MHz/ (L298N_TIMx_PRESCALER+1)/ (L298N_TIM_PERIOD+1)10//⾼级定时器重复计数寄存器值11 **⾼级才有12// 定义⾼级定时器重复计数寄存器值13//实际PWM频率为:72MHz/(L298N_TIMx_PRESCALER+1)/(L298N_TIM_PERIOD+1)/(L298N_TIM_REPETITIONCOUNTER+1)14#define L298N_TIM_REPETITIONCOUNTER 015 **刹车和死区配置:1/* 刹车和死区时间配置 */2 sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;3 sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;4 sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;5 sBreakDeadTimeConfig.DeadTime = 0;6 sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;7 sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;8 sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;9 HAL_TIMEx_ConfigBreakDeadTime(&htimx_L298N, &sBreakDeadTimeConfig);基于通信的pwm频率和脉宽的更新控制算法:1/*2** pwm是否需要更新,⽐较上⼀次的频率和脉宽值,如果不同,则更新3*/4void pwm_update_loop( void )5 {6/*1,第⼀路判断: 频率或占空⽐发⽣变化 */7if( (HLM_SOKO_I_FREQ != HLM_SOKO_I_FREQ_LAST ) ||8 HLM_SOKO_I_DUTY != HLM_SOKO_I_DUTY_LAST )9 {10/* 更新频率和占空⽐的记录值 */11 HLM_SOKO_I_FREQ_LAST = HLM_SOKO_I_FREQ;12 HLM_SOKO_I_DUTY_LAST = HLM_SOKO_I_DUTY;13/* 更新当前通道的PWM波形 */14 pwm_update( PWM_I,HLM_SOKO_I_FREQ, HLM_SOKO_I_DUTY );15 }1617/*2,第⼆路判断 */18if( (HLM_SOKO_II_FREQ != HLM_SOKO_II_FREQ_LAST ) ||19 HLM_SOKO_II_DUTY != HLM_SOKO_II_DUTY_LAST )20 {21/* 更新频率和占空⽐的记录值 */22 HLM_SOKO_II_FREQ_LAST = HLM_SOKO_II_FREQ;23 HLM_SOKO_II_DUTY_LAST = HLM_SOKO_II_DUTY;24/* 更新当前通道的PWM波形 */25 pwm_update( PWM_II,HLM_SOKO_II_FREQ, HLM_SOKO_II_DUTY );26 }2728/*3,第三路判断 */29if( (HLM_SOKO_III_FREQ != HLM_SOKO_III_FREQ_LAST ) ||30 HLM_SOKO_III_DUTY != HLM_SOKO_III_DUTY_LAST )31 {32/* 更新频率和占空⽐的记录值 */33 HLM_SOKO_III_FREQ_LAST = HLM_SOKO_III_FREQ;34 HLM_SOKO_III_DUTY_LAST = HLM_SOKO_III_DUTY;35/* 更新当前通道的PWM波形 */36 pwm_update( PWM_III,HLM_SOKO_III_FREQ, HLM_SOKO_III_DUTY );37 }38 }补充:开起定时器功能只要在相应的定时器下开始内部时钟源即可使⽤定时器功能定时器内部动能:定时器时钟配置:M是10的6次⽅微秒是10的-6次⽅内部时钟设置为不分频(CKD),则CK_PSC的时钟频率等于APB1的时钟频率108MHz,即108000 000Hz。

STM32 TIMER 产生PWM的具体操作方法

STM32 TIMER 产生PWM的具体操作方法

定时器的配置定时器用于PWM脉冲输出时的配置:(1)首先定义一个TIM_TimeBaseInitTypeDef的结构体变量用于配置TIME时基如下:TIM_TimeBaseInitTypeDefTIME_BaseConstructure;(2)再定义一个TIM_OCInitTypeDef的结构体变量用于配置定时器输出模式如下:TIM_OCInitTypeDefTIM_OCInitStructure;(3)调用定时器初始化函数将定时器初始化到默认模式如下:TIM_DeInit(TIMx);(4)配置TIME时基下的四个参数①TIM_Period即定时周期实际上是存储到重载寄存器TIMx_ARR的数值M;②TIM_Prescaler即对定时器时钟TIMx_CLK的预分频值也就是定时器时钟频率除以该值(N+1)③TIM_ClockDivision即时钟分频因子,使用内部时钟时配置为0,使用外部时钟可以配置为1,2,4用来对外部时钟进行滤波④TIM_CounterMode用来为脉冲计数器的计数模式,(有向上计数,向下计数,中央对齐模式);(5)填充好上面的配置参数后调用TIM_TimeBaseInit(TIMx,&TIME_BaseConstructure);把这些控制参数写到寄存器中,这样定时器时钟配置就基本完成了。

(6)现在开始配置定时器输出模式参数①TIM_OCMode:输出模式配置,总共6种模式参考资料选择(TIM_OCMode_Timing 输出比较时间模式,TIM_OCMode_Activ输出比较主动模式,TIM_OCMode_Inactive输出比较非主动模式,TIM_OCMode_Toggle 输出比较触发模式,TIM_OCMode_PWM1 向上计数时,当TIMx_CNT <TIMx_CCR*时,输出电平有效,否则为无效,向下计数时,当TIMx_CNT > TIMx_CCR*时,输出电平无效,否则为有效,TIM_OCMode_PWM2 与PWM1模式相反)②TIM_OutputState:(TIM_OutputState_Disable禁止OC*输出,TIM_OutputState_Enable 开启OC*输出到对应引脚)③TIM_OutputNState:(互补输出同上)④TIM_Pulse:(该成员值即为比较寄存器TIMx-CCR的数值,当脉冲计数器TIMx-CNT与TIMx-CCR的比较结果发生变化时,输出脉冲将发生变化)⑤TIM_OCPolarity:(有效电平的极性)⑥TIM_OCNPolarity:(有效电平的极性)⑦TIM_OCIdleState:(TIM_OCIdleState_Set 当MOE=0时,如果实现了OC*N,则死区后OC*=1,TIM_OCIdleState_Reset 当MOE=0时,如果实现了OC*N,则死区后OC*=0)⑧TIM_OCNIdleState:(同上) 注意:通过配置TIM_OutputState和TIM_OutputNState可使能或者失能主输出和互补输出,如果二路的极性配置(OCPolarity和OCNPolarity)相同,则输出互补;如果输出极性配置相反,则二路输出相同。

STM32定时器输出六路PWM

STM32定时器输出六路PWM

定时器实验一、实验要求编程序利用STM32的通用定时器TIM2和TIM3产生六路PWM输出。

二、实验原理实验主要考察对STM32F10X系列单片机定时器的使用。

STM32F103系列的单片机一共有11个定时器,其中:✧2个高级定时器✧4个普通定时器✧2个基本定时器✧2个看门狗定时器✧1个系统嘀嗒定时器出去看门狗定时器和系统滴答定时器的八个定时器列表;八个定时器分成3个组TIM1和TIM8是高级定时器TIM2-TIM5是通用定时器TIM6和TIM7是基本的定时器这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式。

本次试验主要用到通用定时器TIM2和TIM3。

通用定时器(TIM2~TIM5)的主要功能:除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM)。

通用定时器的时钟来源;a:内部时钟(CK_INT)b:外部时钟模式1:外部输入脚(TIx)c:外部时钟模式2:外部触发输入(ETR)d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器通用定时期内部时钟的产生:通用定时器(TIM2-5)的时钟不是直接来自APB1,而是通过APB1的预分频器以后才到达定时器模块。

当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。

PWM输出模式;STM32的PWM输出有两种模式:模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。

区别如下:110:PWM模式1,在向上计数时,一旦TIMx_CNT在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

STM32日记之TIM1模块产生PWM(分别用库函数和寄存器)

STM32日记之TIM1模块产生PWM(分别用库函数和寄存器)

C语言: TIM1模块产生PWM,带死区//Step1.开启TIM和相应端口时钟//启动GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\ENABLE);//启动AFIORCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//启动TIM1RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//Step2. GPIO做相应设置,为AF输出//PA.8/9口设置为TIM1的OC1输出口GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8| GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13| GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//Step3. TIM模块初始化void TIM_Configuration(void){TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_BDTRInitTypeDef TIM_BDTRInitStructure;//TIM1基本计数器设置(设置PWM频率)//频率=TIM1_CLK/(ARR+1)TIM_BaseInitStructure.TIM_Period = 1000-1;TIM_BaseInitStructure.TIM_Prescaler = 72-1;TIM_BaseInitStructure.TIM_ClockDivision = 0;TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_BaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);//启用ARR的影子寄存器(直到产生更新事件才更改设置)TIM_ARRPreloadConfig(TIM1, ENABLE);//TIM1_OC1模块设置(设置1通道占空比)TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;TIM_OCInitStructure.TIM_Pulse = 120; //TIM1_Pulse设置了待装入捕获比较寄存器的脉冲值TIM_OC1Init(TIM1, &TIM_OCInitStructure);//启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//TIM2_OC2模块设置(设置2通道占空比)TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_Pulse = 680;TIM_OC2Init(TIM1, &TIM_OCInitStructure);//启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//死区设置TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //这里调整死区大小0-0xffTIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);//TIM1开启TIM_Cmd(TIM1, ENABLE);//TIM1_OC通道输出PWM(一定要加)TIM_CtrlPWMOutputs(TIM1, ENABLE);}另一程序---------------------------------#include<stm32f10x_lib.h>#include"PWM.h" // 头文件#include"IOSET.h" // 包含io口设置头文件u16 pw1=0;u16 pw2=5600;u16 pw3=2800;void PWM_Init( u16 arr,u16 psc) //PWM初始化程序{RCC->APB2ENR|=1<<11; // 使能定时器1时钟RCC->APB2ENR|=1<<2; //使能IO口A时钟RCC->APB2ENR|=1<<3; //使能IO口B时钟RCC->APB2ENR|=1<<0; //开启辅助时钟GPIOB->CRH&=0X000FFFFF; // 清除PB13PB14,15状态寄存器位GPIOB->CRH|=0XBBB00000; // 设定PB13PB14,15//TIM1CH1N,TIM1CHH2N CH3N输出 GPIOA->CRH&=0XFFFFF000; // 清除PA8,9,10状态寄存器位GPIOA->CRH|=0X00000BBB; // 设定PA8,9,10为复用功能TIM1CH1,2,3输出GPIOB->ODR|=1<<13;GPIOB->ODR|=1<<14;GPIOB->ODR|=1<<15; // 输出上拉,低电平有效GPIOA->ODR|=1<<8;GPIOA->ODR|=1<<9;GPIOA->ODR|=1<<10;TIM1->CCR1=pw1; //捕获比较预装载值TIM1->CCR2=pw2;TIM1->CCR3=pw3;TIM1->ARR=arr; // 设定计数器自动重装值TIM1->PSC=psc; // 预分频器不分频TIM1->BDTR|=0xCD; // 死区时间设定TIM1->CCER|=1<<0; // TIM1CH1 通道开关TIM1->CCER|=1<<2; // TIM1CH1N 通道开关TIM1->CCER|=1<<4; // TIM1CH2 通道开关TIM1->CCER|=1<<6; // TIM4CH2N 通道开关TIM1->CCER|=1<<8; // TIM4CH3 通道开关TIM1->CCER|=1<<10; // TIM4CH3N 通道开关TIM1->CCMR1|=7<<4; // TIM1CH1 PWM2模式TIM1->CCMR1|=7<<12; // TIM1CH2 PWM2模式TIM1->CCMR2|=7<<4; // TIM1CH3 PWM2模式TIM1->CCMR1|=1<<3; // TIM1CH1 预装载使能TIM1->CCMR1|=1<<11; // TIM1CH2 预装载使能TIM1->CCMR2|=1<<3; // TIM1CH3 预装载使能TIM1->CR1|=0X80; // CR1 ARPE自动重装载预装载允许位使能TIM1->BDTR|=1<<15; // 刹车使能位置1,开启所有输出通道TIM1->CR1|=0X01; // 使能定时计数器1//TIM1->EGR|=1<<0;}。

STM32的PWM精讲

STM32的PWM精讲
PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使 用, 方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍 然是数字 的,因为在给定的任何时刻,满幅值的直流供电要么完全有(0N),要么 完全无(OFF)。 电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模 拟负载上去的。通的 时候即是直流供电被加到负载上的时候,断的时候即是供电 被断开的时候。只要带宽足 够,任何模拟值都可以使用 PWM 进行编码。
第 2 章 STM32 处理器概述 STM32F103xx 增强型系列产品中内置了多达 3 个同步的标准定时器。每个定 时
器都有一个 16 位的自动加载递加/递减计数器、一个 16 位的预分频器和 4 个 独立的 通道,每个通道都可用于输入捕获、输出比较、PWM 和单脉冲模式输出, 在最大的 封装配置中可提供最多 12 个输入捕获、输出比较或 PWM 通道。它们还 能通过定时器 链接功能与高级控制定时器共同工作,提供同步或事件链接功能。
它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术其控制简单灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式其应用领域包括测量通信功率控制与变换电动机控制伺服控制调光开关电源甚至某些音频放大器因此研究基于pwm技术的正负脉宽数控调制信号发生器具有十分重要的现实意义
STM32 的 PWM 精讲
器中的计数器使能位(CEN)时,CK_CNT 才有效。(有关更多的计数器使能的 细节,请参见控制器的从模式描述)。
注:真正的计数器使能信号 CNT_EN 是在 CEN 后的一个时钟周期后被设置。 预分 频器描述 。
预分频器可以将计数器的时钟频率按 1 到 65536 之间的任意值分频。它是

STM32中的PWM的频率和占空比的设置

STM32中的PWM的频率和占空比的设置

STM32 中的PWM 的频率和占空比的设置下面的这个是STM32 的定时器逻辑图,上来有助于理解:
TIM3 的ARR 寄存器和PSC 寄存器,确定PWM 频率。

这里配置的这两个定时器确定了PWM 的频率,我的理解是:PWM 的周期(频率)就是ARR 寄存器值与PSC 寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM 的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ 频率的PWM,首先,确定TIMx 的时钟,除非APB1 的时钟分频数设置为1,否则通用定时器TIMx 的时钟是APB1 时钟的2 倍,这时的TIMx 时钟为72MHz,用这个TIMx 时钟72MHz 除以(PSC+1),得到定时器每隔多少秒涨一次,这里给PSC 赋7199,计算得定时器每隔0.0001 秒涨一次,即此时频率为10KHz,再把这个值乘以(ARR+1)得出PWM 频率,假如ARR 值为0,即0.0001*(0+1),则输出PWM 频率为10KHz,再假如输出频率为100Hz 的PWM,则将ARR 寄存器设置为99 即可。

如果想调整PWM 占空比精度,则只需降低PSC 寄存器的值即可。

TIMx_CCRx 寄存器,确定PWM 的占空比。

TIMx_CCR1TIMx_CCR4 确定定时器的CH1CH4 四路PWM 的占空比。

直接给该寄存器赋065535 值即可确定占空比。

占空比计算方法:TIMx_CCRx 的值除以ARR 寄存器的值即为占空比,因为占空比在0100%之间,所以一。

STM32学习笔记(5):通用定时器PWM输出

STM32学习笔记(5):通用定时器PWM输出

STM32学习笔记(5):通用定时器PWM输出1.TIMER输出PWM基本概念脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

简单一点,就是对脉冲宽度的控制。

一般用来控制步进电机的速度等等。

STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM 输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。

1.1PWM输出模式STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。

模式1和模式2的区别如下:110:PWM模式1-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。

而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。

1.2PWM输出管脚PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7定时器复用功能重映射”一节。

在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。

stm32定时器定时器中断PWM输出输入捕获

stm32定时器定时器中断PWM输出输入捕获

stm32定时器定时器中断PWM输出输⼊捕获STM32F4 的通⽤定时器包含⼀个 16 位或 32 位⾃动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。

STM32F4 的通⽤定时器可以被⽤于:测量输⼊信号的脉冲长度(输⼊捕获)或者产⽣输出波形(输出⽐较和 PWM)等。

使⽤定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在⼏个微秒到⼏个毫秒间调整。

STM32F4 的每个通⽤定时器都是完全独⽴的,没有互相共享的任何资源。

STM3 的通⽤ TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:1)16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下⾃动装载计数器(TIMx_CNT),注意: TIM9~TIM14 只⽀持向上(递增)计数⽅式。

2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。

3) 4 个独⽴通道(TIMx_CH1~4, TIM9~TIM14 最多 2 个通道),这些通道可以⽤来作为:A.输⼊捕获B.输出⽐较C. PWM ⽣成(边缘或中间对齐模式) ,注意: TIM9~TIM14 不⽀持中间对齐模式D.单脉冲模式输出4)可使⽤外部信号(TIMx_ETR)控制定时器和定时器互连(可以⽤ 1 个定时器控制另外⼀个定时器)的同步电路。

5)如下事件发⽣时产⽣中断/DMA(TIM9~TIM14 不⽀持 DMA):A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)B.触发事件(计数器启动、停⽌、初始化或者由内部/外部触发计数)C.输⼊捕获D.输出⽐较E.⽀持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不⽀持)F.触发输⼊作为外部时钟或者按周期的电流管理(TIM9~TIM14 不⽀持)下⾯我们介绍⼀下与我们这章的实验密切相关的⼏个通⽤定时器的寄存器(以下均以 TIM2~TIM5 的寄存器介绍, TIM9~TIM14 的略有区别,具体请看《STM32F4xx 中⽂参考⼿册》对应章节)。

关于STM32在程序中间修改PWM值的总结(原创)

关于STM32在程序中间修改PWM值的总结(原创)
请您及时更换请请请您正在使用的模版将于2周后被下线请您及时更换
关于 STM32在程序中间修改 PWM值的总结(原创)
首先在STM32库函数里有这样一个函数 void TIM3_PWM_Init(u16 arr,u16 psc)
若TIM3_PWM_Init(7200,100)//设置频谱7200.分频100
若想要在程序进程中修改频率需要函数TIM_SetAutoreload(TIM3,arr); 这个函数就是手动更改 TIMx->ARR 的意思 使能预装载ARPE 可以保证ARR在 更新事件到来时(或者你说的周期结束) 被 送到影子寄存器 如果不使能ARPE, 写入的ARR值立即生效;
所以最终在程序进程中修改我们的pwm需要通过 TIM_SetCompare2(TIM3,pwmval); TIM_SetAutoreload(TIM3,arr); 两个函数实现。
我们初始化定时器得到得频率为PWM频率=72000000/7200=10000hz 10000/100=100hz; TIM_SetCompare2(TIM3,pwmval);函数调节占空比; 占空比为arr/pwmval;
占空比在3,pwmval);

STM32中的PWM的频率和占空比的设置

STM32中的PWM的频率和占空比的设置

STM32中的PWM的频率和占空比的设置
STM32 中的PWM 的频率和占空比的设置下面的这个是STM32 的定时器逻辑图,上来有助于理解:
TIM3 的ARR 寄存器和PSC 寄存器,确定PWM 频率。

这里配置的这两个定时器确定了PWM 的频率,我的理解是:PWM 的周期(频率)就是ARR 寄存器值与PSC 寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM 的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ 频率的PWM,首先,确定TIMx 的时钟,除非APB1 的时钟分频数设置为1,否则通用定时器TIMx 的时钟是APB1 时钟的2 倍,这时的TIMx 时钟为72MHz,用这个TIMx 时钟72MHz 除以(PSC+1),得到定时器每隔多少秒涨一次,这里给PSC 赋7199,计算得定时器每隔0.0001 秒涨一次,即此时频率为10KHz,再把这个值乘以(ARR+1)得出PWM 频率,假如ARR 值为0,即0.0001*(0+1),则输出PWM 频率为10KHz,再假如输出频率为100Hz 的PWM,则将ARR 寄存器设置为99 即可。

如果想调整PWM 占空比精度,则只需降低PSC 寄存器的值即可。

TIMx_CCRx 寄存器,确定PWM 的占空比。

TIMx_CCR1TIMx_CCR4 确定定时器的CH1CH4 四路PWM 的占空比。

直接给该寄存器赋065535 值即可确定占空比。

占空比计算方法:TIMx_CCRx 的值除以ARR 寄存器的值即为占空比,因为占空比在0100%之间,所以一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32高级定时器PWM实用程序
文章来源:本站原创作者:佚名
该文章讲述了STM32高级定时器PWM实用程序.
高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。

共有4个通道有死区有互补。

先是配置IO脚:
GPIO_InitTypeDef GPIO_InitStructure;
/* PA8设置为功能脚(PWM) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*PB13 设置为PWM的反极性输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*开时钟PWM的与GPIO的*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*配置TIM1*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
void Tim1_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM1); //重设为缺省值
/*TIM1时钟配置*/
TIM_TimeBaseStructure.TIM_Prescaler = 4000; //预分频(时钟分
频)72M/4000=18K
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 144; //装载值18k/144=125hz 就是说向上加的144便满了
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置了时钟分割不
懂得不管
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //周期计数器值不懂得不管TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //初始化TIMx的时间基数单位/* Channel 1 Configuration in PWM mode 通道一的PWM */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效PA8
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //反向通道也有效PB13
TIM_OCInitStructure.TIM_Pulse = 40; //占空时间144 中有40的时间为高,互补的输出正好相反
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //互补端的极性TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //空闲状态下的非工作状态不管
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //先不管TIM_OC1Init(TIM1,&TIM_OCInitStructure); //数初始化外设TIMx通道1这里2.0库为TIM_OCInit。

相关文档
最新文档