STM32学习笔记通用定时器PWM输出

合集下载

stm32输出pwm占空比代码

stm32输出pwm占空比代码

stm32输出pwm占空比代码在STM32单片机中,输出PWM(脉冲宽度调制)信号是非常普遍的操作,这种信号通常用于控制电机、LED灯等电子设备的亮度或运动状态。

本文将详细介绍STM32单片机如何输出PWM占空比代码。

一、配置TIM定时器要输出PWM信号,首先需要进行TIM定时器的配置。

在KEIL C 编译器中,可以通过CubeMX插件进行配置。

在此之前需要先引入库文件“stm32fxx_hal_tim.h”。

在CubeMX中选择对应的TIM,进入“Mode”选项卡,将TIM定时器配置为PWM输出模式。

在“Configuration”选项卡中,配置TIM的时钟源和预分频系数等信息。

此外还需要配置PWM的周期和占空比,具体可以通过下面的步骤实现。

二、设置PWM周期在代码中设置PWM周期,可以使用HAL库中的“__HAL_TIM_SET_AUTORELOAD”函数。

该函数的第一个参数为TIM定时器的句柄,第二个参数为PWM的周期,单位为计数器的值。

可以根据需要调整该值来改变PWM的输出频率。

例如,将PWM周期设置为1000,代码如下:__HAL_TIM_SET_AUTORELOAD(&htim1, 1000);三、设置PWM占空比在代码中设置PWM占空比,需要使用HAL库中的“__HAL_TIM_SET_COMPARE”函数。

该函数的第一个参数是TIM定时器的句柄,第二个参数是设置输出PWM的通道,第三个参数是占空比。

占空比的取值范围为0到PWM周期。

例如,将PWM占空比设置为500,代码如下:__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500);四、使用PWM输出信号最后,在代码中使用PWM输出信号,可以使用HAL库中的“HAL_TIM_PWM_Start”函数。

该函数的参数为TIM的句柄和输出PWM 的通道。

例如,在TIM1通道1上启动PWM输出,代码如下:HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);以上就是STM32单片机输出PWM占空比代码的详细步骤。

stm32pwm输出三角波原理

stm32pwm输出三角波原理

stm32pwm输出三角波原理
在STM32微控制器中,PWM 输出可以实现多种波形,包括方波、正弦波、三角波等。

其中,三角波是一种非常常见的波形,在很多应用场景中都有广泛的应用。

三角波是一种连续的、平滑的波形,其特点是从低电平逐渐升高到高电平,然后再逐渐降低到低电平,如同一个长长的三角形。

在STM32 中,输出三角波需要使用 PWM 模块和定时器,并对定时器的计数器进行配置。

具体来说,输出三角波的原理如下:
1. 配置定时器为向上计数模式,并设置一个合适的计数频率,例如 10 kHz。

2. 配置 PWM 输出通道为定时器输出比较功能,并选择合适的输出极性和时钟分频系数。

3. 在每次定时器计数器达到设定值时,PWM 输出通道会自动翻转输出电平,这将导致三角波的上升和下降。

4. 在每次计数器溢出时,需要重新设置计数器的初始值,以保证连续输出三角波。

5. 如果需要改变三角波的频率或幅值,可以通过改变定时器的计数频率或 PWM 输出通道的占空比来实现。

通过上述方法,可以在 STM32 微控制器中实现三角波的输出。

这种波形非常适合一些需要连续、平滑的变化的应用场景,例如音频信号发生器、电机驱动等。

定时器学习笔记(嵌入式)

定时器学习笔记(嵌入式)

定时器学习笔记一、STM32F103定时器STM32F103的定时器为工业控制应用度量身定做,具有延时、信号的频率测量、信号的PWM测量、PWM输出、三相六步电机控及编码接口等功能,STM32F103微控制器内部集成了多个可编程定时器,可分为基本定时器、通用定时和高级定时器3种类型,从功能上看,基本定时器的功能是通用定时器的子集,而通用定时器的功能又是高级定时器的一个子集。

二、STM32F103定时器类型1.基本定时器TIM6和TIM72.通用定时器TM2-TIM53.高级定时器TIM1和TIM8三、PWM的实现(1)传统的数字电路方式。

用传统的数字电路实现PWM,电路设计较复杂,体积大,抗于扰能力差,系统的控制周期较长。

(2)微控制器普通1/0模拟方式。

对于微控制器中无PWM输出功能的情况,可以通过CPU操控普通1/O口来实现PWM输出。

但这样实现PWM将消耗大量的时间大大降低了CPU的效率,而且得到的PWM信号精度不太高。

(3)微控制器的PWM直接输出方式。

对于具有PWM输出功能的微控制器,在进行简单的配置后即可在微控制器的指定引脚上输出PWM脉冲。

四、PWM输出模式的工作过程(1)若配置脉冲计数器TIMx_CNT为向上计数模式,自动重装载寄存器TIMx_ARR的预设值为N,则脉冲计数器TIMx_CNT的当前计数值X在时钟CK_CNT的驱动下从0开始不断累加计数(2)在脉冲计数器TIMx_CNT随着时钟CK_CNT触发进行累加计数的同时,脉冲计数器LMx_CNT的当前计数值X与捕获/比较寄存器TIMx_CCR的预设值A进行比较:如果X<A.输出高电平(或低电平);如果X=A,输出低电平(或高电平)。

(3)当脉冲计数器TIMx_CNT的计数值X大于自动重装载寄存器TIMx_ARR的预设值N时,脉冲计数器TIMx_CNT的计数值清零并重新开始计数。

如此循环往复得到的PWM输出信号的周期为(N+1)×XTCK_CNT,其中,N为自动重装载寄存TIMx_ARR的预设值,TCK_CNT为时钟CK_CNT的周期。

STM32之PWM波形输出配置复习总结.doc

STM32之PWM波形输出配置复习总结.doc

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

其中系统嘀嗒定时器是前文中所描述的SysTick o其中TIM1和TIM8是能够产生3对PWM互补输出,常用于三相电机的驱动, 时钟由APB2的输岀产生oTIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

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

举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载等存器TI Mx_ARR被配置为N,即TI Mx_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) o3. STM32产生PWM的配置方法1)配置GPIO 口不是每一个I0引脚都可以直接使用于PWM输出,下面是定时器的引脚重映像,其实就是引脚的复用功能选择:表定时器的引脚复用功能映像表定时器的引脚复用功能映像表3-4 定时器4的引脚复用功能映像根据以上重映像表,我们使用定时器3的通道2作为PWM的输出引脚,所以需要对PB5引脚进行配置,对10 口操作代码:2)初始化定时器3)设置TIM3_CH2的PWM模式.使能TIM3的CH2输出4)使能定时器3经过以上的操作,定时器3的第二通道已经可以正常工作并输出PWM波了,只是其占空比和频率都是固定的,我们可以通过改变TIM3_CCR2,则可以控制它的占空比。

使用STM32的定时器产生两路相位互为180度的PWM输出波形

使用STM32的定时器产生两路相位互为180度的PWM输出波形
③计数器继续向下计数,达到到TIMx_CC2时,CC2匹配成功,CC2的输出电平翻转;
④计数器继续向下计数,减到0时开始调头向上计数;当计数器的数值上升到TIMx_CC2时,CC2再次匹配成功,CC2的输出电平再次翻转;
如此循环,得到连续的相位互为180度的两路输出波形。
基本设置如下:
1)配置定时器的计数器为中间对齐计数,即先向上计数再向下计数。
2)在该定时器上选择2个通道,并分别配置为输出比较模式,并配置在比较成功时翻转对应的引脚输出。
3)配置自动重装载寄存器TIMx_ARR为要求输出频率的一半。
4)假定CC1为第一个输出信号的通道,再假定第一个信号的正脉冲宽度对应为W1,则配置TIMx_CCR1为TIMx_ARR-W1/2。
5) 同4),假定CC2为第二个输出信号的通道,正脉冲宽度对应为W2,配置TIMx_CCR2为W2/2。
----------------------------------------------
下面以一个例子说明:
假设要求输出的信号频率为10kHz,占空比为1:3。
再假设定时器的输入时钟为72MHz。
按照上述5),设置TIMx_CC2=W2/2=450
参照下图,图中红线表示计数器的数值变化:
①当计数器的数值从0向上计数,达到TIMx_CC1时,CC1匹配成功,CC1的输出电平翻转;
②计数器继续向上计数,达到TIMx_ARR时开始调头向下计数;当计数器的数值下降到TIMx_CC1时,CC1再次匹配成功,CC1的输出电平再次翻转;
输出信号的频率10kHz,换算为计数器的数值为7200。
按照上述电平时间W1,换算为计数器的数值为W1=7200/4=1800

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的函数示例,其中包含了基本的配置步骤。

STM32系列TIM定时器整理

STM32系列TIM定时器整理

1、PWM输出模式TIM_Period配置是代表波形的周期,因此其数值一定要比输出配置中TIM_OCInitStructure.TIM_Pulse的数值大。

(如TIM_Period = 0x3E7则波形频率为TIMCLK/(0x3E7+1))且只要TIM_Period 不为零,则其TIMCLK为系统频率的一半。

TIM_Prescaler是在上述基础上再分频(如TIM_TimeBaseStructure.TIM_Prescaler = 0x2,以1中配置为例,则输出波形频率变为TIMCLK/(0x3E7+1)/(0x2+1))。

若此时TIM_OCInitStructure.TIM_Pulse = CCR1_V al;(例如CCR1_V al=15则占空比为:CCR1_V al/(TIM_Period+1))所以TIM_Prescaler之改变输出波形的周期,并不改变占空比。

2、TIM_OCMode_Toggle TIM输出比较触发模式此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。

在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。

即TIM_TimeBaseStructure.TIM_Period配置大小对输出波形的频率没有影响(但是TIM_Period的值一定要大于TIM_OCInitStructure.TIM_Pulse,否则还没来得及更新时间就产生中断,这样结果肯定就会错误)例如下面程序:vu16 CCR2_Val = 0x4000;TIM_TimeBaseStructure.TIM_Period = 0xFFF5;TIM_TimeBaseStructure.TIM_Prescaler = 0x02;TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);/* Output Compare Toggle Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;TIM_OCInitStructure.TIM_Pulse = CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OCInit(TIM2, &TIM_OCInitStructure);TIM2 Configuration: 输出比较模式:TIM2CLK = 36 MHz, Prescaler = 0x2, 所以TIM2 counter clock = 12 MHzCC1 update rate (更新频率)= TIM2 counter clock / CCR1_Val = 366.2 Hz3、TIM输出比较时间模式在这种模式下TIM的计数时钟频率为TIM2CLK/TIM_PrescalerConfig,且TIMCLK同前面一样,只要TIM_Period 不为零,就是系统时钟的一半。

通用定时器的定时与比较输出(PWM)

通用定时器的定时与比较输出(PWM)

通⽤定时器的定时与⽐较输出(PWM)定时器的基本组成STM32的定时器1、基本定时器基本定时器:TIM6 和 TIM7基本定时器基本上只有定时功能。

基本定时器TIM6和TIM7各包含⼀个16位⾃动装载计数器,由各⾃的可编程预分频器驱动。

预分频器分频之后的 “计数频率” ,给计数器提供时钟,计数器从0开始计数,计数到重装值时,从0再次开始计数。

通⽤定时器通⽤定时器:TIM2、3、4、5在定时的功能上,输⼊捕获、输出⽐较输⼊捕获:可以⽤来检测IO上电平变化之间的时间间隔。

输出⽐较:可以⽤来控制IO输出电平⾼低的时间。

PWM、⽤来进⾏编码器的检测⾼级控制定时器⾼级控制定时器:TIM1、TIM8定时功能、输⼊捕获、输出⽐较、死区时间的控制、互补PWM输出⼀般我们会⽤于的电机控制:电桥电路电机STM32F103R8 ⾼级控制定时器:1个; 通⽤定时器:3个STM32通⽤定时器---定时通⽤定时器简介时钟源:外部时钟:输⼊通道上来的电平内部触发输⼊:将另⼀个定时器的作为当前定时器时钟输⼊分频值:可以多少分频:1-65536 216计数器的计数范围216重装载值的范围216向上计数:从0,1,2,3,4 ......装载值 (触发中断)向下计数:装载值.......4,3,2,1,0 (触发中断)时钟源的选择内部时钟如果禁⽌了从模式控制器(TIMx_SMCR寄存器的SMS=000),则CEN、 DIR是事实上的控制位,并且只能被软件修改。

只要CEN位被写成’1’,预分频器的时钟就由内部时钟CK_INT提供。

所以说,只要不开启从模式,使能CEN位,时钟源就是内部时钟源;也就是72MHz。

stm32f103C8的通⽤定时器时钟AHB的时钟选择是72MHz,APB1的分频是2分频,APB1的时钟是36MHz。

APB1的分频是2分频,所以TIMx_CLK的时钟源频率是 36*2 = 72MHz。

分频系数的设置预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。

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定时器输出六路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通用定时器

STM32通用定时器

STM32的定时器功能很强大,学习起来也很费劲儿.其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER做个剖析。

实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用……TIMER主要是由三部分组成:1、时基单元。

2、输入捕获。

3、输出比较。

还有两种模式控制功能:从模式控制和主模式控制。

一、框图让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了…为了方便的看图,我对里面出现的名词和符号做个注解:TIMx_ETR:TIMER外部触发引脚 ETR:外部触发输入ETRP:分频后的外部触发输入 ETRF:滤波后的外部触发输入ITRx:内部触发x(由另外的定时器触发)TI1F_ED:TI1的边沿检测器。

TI1FP1/2:滤波后定时器1/2的输入TRGI:触发输入 TRGO:触发输出CK_PSC:应该叫分频器时钟输入CK_CNT:定时器时钟。

(定时周期的计算就靠它)TIMx_CHx:TIMER的输入脚 TIx:应该叫做定时器输入信号xICx:输入比较x ICxPS:分频后的ICxOCx:输出捕获x OCxREF:输出参考信号关于框图还有以下几点要注意:1、影子寄存器。

有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);(详细请参考版主博客/STM32/401461/message.aspx)2、输入滤波机制在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率Fdts来采样N次进行滤波的。

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

stm32的pwm输出及频率计算方法
四、给出了PWM频率和占空比的计算公式。
步骤下:
1、使能TIM3时钟
RCC->APB1ENR |= 1 2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL&=0XF0FFFFFF;//PA6清0GPIOA->CRL|=
0X0B000000;//复用功能输出(推挽50MHz输出)GPIOA->ODR |= 1
stm32的pwm输出及频率计算方法
一、stm32的pwm输出引脚是使用的IO口的复用功能。
二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。
三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类
似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在
STM32F103RBT6上测试成功,大家放心使用!)。
3、设定计数器自动重装值及是否分频
TIM3->ARR=arr;//设定计数器自动重装值(决定PWM的频率)TIM3-
>PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相
反),根据需求选一种即可

STM32-主从定时器-输出固定数量脉冲

STM32-主从定时器-输出固定数量脉冲

在仪器仪表计量、步进电机驱动等领域,有时需要控制电路输出固定数量的PWM ,常规方法一般为中断计数法,即将单片机定时器配置成PWM 输出模式,然以在PWM 中断中对脉冲进行计数,当脉冲数量达到设定值时即关断PWM 输出,这种方法程序上比较简单,但是当输出频率较高时,计数中断会频繁打断系统的正常运行,对系统运行效率会产生一定影响。

另一种输出方式是利用主从定时器的原理,本文就介绍下该种方式。

1输出原理介绍STM32单片机具有定时器同步功能,可以配置多个定时器在内部相连,当一个定时器配置为主模式时,可以对另一个配置成从模式的定时器进行复位、启动、停止或提供时钟的操作。

而主从定时器输出固定脉冲就是利用了一个定时器充当另一个定时器的预分频的原理实现的。

1.1使用一个定时器作为另一个定时器的预分频器上图为基本框图,将定时器1配置成定时器2的预分频后,定时器1负责输出PWM ,每个输出脉冲的边沿在内部作为定时器2的输入时钟,通过配置定时器2的溢出值即可实现对定时器1脉冲输出个数的检测。

1.1.1配置思路:1)配置定时器1为主模式,它可以在每一个更新事件UEV 时输出一个周期性的触发信号。

在TIM1_CR2寄存器的MMS=’010’时,每当产生一个更新事件时在TRGO1上输出一个上升沿信号。

STM32-主从定时器-输出固定数量脉冲2)连接定时器1的TRGO1输出至定时器2,设置TIM2_SMCR 寄存器的TS=’000’,配置定时器2为使用ITR1作为内部触发的从模式。

3)把从模式控制器置于外部时钟模式1(TIM2_SMCR 寄存器的SMS=111),这样定时器2即可由定时器1周期性的上升沿(即定时器1的计数器溢出)信号驱动。

4)设置相应(TIMx_CR1寄存器)的CEN 位分别启动两个定时器。

摘录自手册P278。

1.1.2寄存器配置流程1)配置定时器1为主模式,送出它的更新事件UEV 做为触发输出(TIM1_CR2寄存器的MMS=’010’)。

STM32基础PWM输出

STM32基础PWM输出

STM32基础PWM输出a)目的:基础PWM输出,以及中断配合应用。

输出选用PB1,配置为TI M3_CH4,是目标板的LED6控制脚。

b)对于简单的PWM输出应用,暂时无需考虑TIM1的高级功能之区别。

c)初始化函数定义:void TIM_Configuration(void);//定义TIM初始化函数d)初始化函数调用:TIM_Configuration();//TIM初始化函数调用e)初始化函数,不同于前面模块,TIM的初始化分为两部分——基本初始化和通道初始化:void TIM_Configuration(void)//TIM初始化函数{TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//定时器初始化结构TIM_OCInitTypeDefTIM_OCInitStructure;//通道输出初始化结构//TIM3初始化TIM_TimeBaseStructure.TIM_Period = 0xFFFF;//周期0~FFFFTIM_TimeBaseStructure.TIM_Prescaler = 5;//时钟分频TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟分割TIM_TimeBaseStructure.TIM_Coun te rMode = TIM_CounterMode_Up;//模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//基本初始化TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);//打开中断,中断需要这行代码//TIM3通道初始化TIM_OCStructInit(& TIM_OCInitStructure);//默认参数TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//工作状态TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//设定为输出,需要PWM输出才需要这行代码TIM_OCInitStructure.TIM_Pulse = 0x2000;//占空长度TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//高电平TIM_OC4Init(TIM3, &TIM_OCInitStructure);//通道初始化TIM_Cmd(TIM3, ENABLE);//启动TIM3}f)RCC初始化函数中加入TIM时钟开启:RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3, ENABLE);g)GPIO里面将输入和输出管脚模式进行设置。

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,ADC,UART,DMA

STM32学习笔记,定时器,PWM,ADC,UART,DMA
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 ); capture = TIM_GetCapture1(TIM1); TIM_SetCompare1(TIM1, capture + 2000); //这里解释下: //将 TIM1_CCR1 的值增加 2000,使得下一个 TIM 事件也需要 2000 个脉冲, //另一种方式是清零脉冲计数器 //TIM_SetCounter(TIM2,0x0000); }
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\ ENABLE); //启动 AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //启动 TIM1 RCC_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);
}
关于 TIM 的操作,要注意的是 STM32 处理器因为低功耗的需要,各模块需要分别独立开启时钟,所以, 一定不要忘记给用到的模块和管脚使能时钟,因为这个原因,浪费了我好多时间阿~~!
STM32 笔记(二)TIM 模块产生 PWM 这个是 STM32 的 PWM 输出模式,STM32 的 TIM1 模块是增强型的定时器模块,天生就是为电机控制而生,可 以产生 3 组 6 路 PWM,同时每组 2 路 PWM 为互补,并可以带有死区,可以用来驱动 H 桥。

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调节转速原理 -回复

stm32 pwm调节转速原理-回复相信大家对于PWM(Pulse Width Modulation,脉宽调制)在电路中的应用并不陌生。

PWM是一种通过调整电流或电压的开关时间比例来控制某些设备或组件的技术。

在STM32(一类使用ARM Cortex-M内核的微控制器系列)中,PWM被广泛应用于调节电机的转速。

本文将以“stm32 pwm调节转速原理”为主题,为大家详细讲解PWM在STM32中调节电机转速的工作原理。

第一步:STM32的PWM输出首先,我们需要了解STM32中的PWM输出。

STM32系列中的多个定时器(Timer)都具备PWM输出功能,其中常用的有通用定时器(General-purpose Timer)以及高级定时器(Advanced Timer)。

通用定时器(如TIM1、TIM2等)具备多个PWM输出通道,可以通过设置相关的寄存器,确定PWM的频率、占空比等参数,并且可以同时驱动多个PWM通道。

高级定时器(如TIM8、TIM9等)则更加灵活,具备更多的PWM输出通道,并且支持更多的特性和功能(如死区控制等)。

高级定时器的PWM 输出也需要通过设置相关的寄存器来控制。

在使用PWM输出之前,需要对定时器进行初始化并设置相应的参数,比如PWM的频率、占空比等。

第二步:电机控制电路PWM调节电机转速的关键,是通过改变PWM的占空比来调节电机供电的时间比例。

当PWM的占空比较小时,电机供电时间较短,电机转速较慢;当PWM的占空比较大时,电机供电时间较长,电机转速较快。

为了实现对电机的精确控制,我们通常会采用电机驱动芯片。

电机驱动芯片能够根据控制信号调整电机的供电时间比例,并根据电机的转速反馈信号或位置反馈信号,实时调整PWM的占空比,从而达到对电机转速的精确控制。

在PWM调节电机转速的过程中,还需要注意电机的启动和停止。

在启动电机时,需要逐渐增加PWM的占空比,来逐步提供电机所需的动力;而在停止电机时,需要逐渐减小PWM的占空比,来逐步降低电机的供电。

STM32编程输出可调的硬件PWM,频率范围1Hz

STM32编程输出可调的硬件PWM,频率范围1Hz

STM32编程输出可调的硬件PWM,频率范围1Hz【原创】编程输出可调的硬件PWM,频率范围1Hz-1MHz,占空比0-100%uint32_t TIM4_PWM_FQ = 50; /* TIM4_CH1_PWM输出频率设置值,1-1000000 */uint32_t TIM4_PWM_FQ_Old = 0;uint16_t TIM4_PWM_Pulse = 50; /* TIM4_CH1_PWM输出占空比设置值,0-100 */uint16_t TIM4_PWM_Pulse_Old = 0;uint32_t SystemCoreClock = 168000000;/** 函数功能: 定时器4配置为硬件PWM模式(不开启TIM4的定时及DMA传输中断)* TIM4_PWM_FQ: TIM4_CH1_PWM 频率1Hz至1000000Hz* TIM4_PWM_Pulse: TIM4_CH1_PWM 占空比 0-100%*/void StdPeriph_TIM4_PWM_Config(void){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;uint32_t temp32;uint32_t uhTimerfrequency;uint16_t uhTimerPeriod;uint16_t uhTimerPulse;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);#ifdef USE_PB6_PWM// TIM4_CH1_PWM: PB6RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);// GPIOB ConfigurationGPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);#else// TIM4_CH1_PWM: PD12RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);// GPIOD ConfigurationGPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);#endifuhTimerfrequency = 200000; /* 初始化 200KHz */temp32 = ((SystemCoreClock /2) / uhTimerfrequency);if(temp32 > 65535) temp32 = 65535;uhTimerPeriod = (uint16_t) temp32;uhTimerPulse = uhTimerPeriod * 50 / 100; /* 占空比50% */// Time base configurationTIM_TimeBaseStructure.TIM_Period = uhTimerPeriod - 1; /* 0x0000 and 0xFFFF */TIM_TimeBaseStructure.TIM_Prescaler = 0; /* 0x0000 and 0xFFFF */TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);// PWM1 Mode configuration: Channel1TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = uhTimerPulse;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC1Init(TIM4, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM4, ENABLE);TIM_GenerateEvent(TIM4, TIM_EventSource_Update);TIM_Cmd(TIM4, ENABLE);}/** 函数功能: 刷新TIM4_CH1_PWM输出的频率和占空比* 修改TIM4_PWM_FQ的值,调节PWM频率(1Hz至1MHz)* 修改TIM4_PWM_Pulse的值,调节PWM的占空比(0-100)*/void StdPeriph_TIM4_PWM_Update(void){uint32_t temp32;uint32_t uhTimerfrequency;uint16_t uhTimerPeriod;uint16_t uhTimerPrescaler;uint16_t uhTimerPulse;if ((TIM4_PWM_FQ_Old != TIM4_PWM_FQ) || (TIM4_PWM_Pulse_Old != TIM4_PWM_Pulse)){TIM4_PWM_FQ_Old = TIM4_PWM_FQ;TIM4_PWM_Pulse_Old = TIM4_PWM_Pulse;if(TIM4_PWM_FQ >= 4000){uhTimerfrequency = TIM4_PWM_FQ; /* 定时器计时频率和PWM频率相等 */uhTimerPrescaler = 1; /* 实际频率TIM4_PWM_FQ较大时,TIM4设置分频为1(不分频) */}else{uhTimerfrequency = 4000; /* 实际频率TIM4_PWM_FQ较小时,和4000Hz的频率比较,看相差几倍 */uhTimerPrescaler = 4000 / TIM4_PWM_FQ; /* 实际频率和4000相差的倍数作为TIM4的分频设置值 */uhTimerfrequency = uhTimerPrescaler * TIM4_PWM_FQ; /* TIM4分频后,计时周期变长,需要将uhTimerfrequency倍频 */ }/* TIM4的周期要通过倍频uhTimerfrequency来计算,uhTimerPeriod = 84MHz / uhTimerfrequency */temp32 = ((SystemCoreClock /2) / uhTimerfrequency);if(temp32 > 65535) temp32 = 65535;uhTimerPeriod = (uint16_t) temp32;if(TIM4_PWM_Pulse > 100) TIM4_PWM_Pulse = 100;uhTimerPulse = uhTimerPeriod * TIM4_PWM_Pulse/ 100;TIM4->ARR = uhTimerPeriod - 1;TIM4->PSC = uhTimerPrescaler - 1;TIM4->CCR1 = uhTimerPulse;TIM4->EGR = TIM_PSCReloadMode_Update;}}。

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

STM32学习笔记(5):通用定时器PWM输出2011年3月30日TIMER输出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。

但是这些重映像的管脚也是由参考手册给出的。

比如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是PA.7,如果设置部分重映像之后,TIM3_CH2的输出就被映射到PB.5上了,如果设置了完全重映像的话,TIM3_CH2的输出就被映射到PC.7上了。

1.3PWM输出信号PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR预分频器所决定的,具体设置方法在前面一个学习笔记中有详细的交代。

而输出信号的占空比则是由TIMx_CRRx寄存器确定的。

其公式为“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通过向CRR中填入适当的数来输出自己所需的频率和占空比的方波信号。

2.TIMER输出PWM实现步骤1.设置RCC时钟;2.设置GPIO时钟;3.设置TIMx定时器的相关寄存器;4.设置TIMx定时器的PWM相关寄存器。

第1步设置RCC时钟已经在前文中给出了详细的代码,在此就不再多说了。

需要注意的是通用定时器TIMx是由APB1提供时钟,而GPIO则是由APB2提供时钟。

注意,如果需要对PWM的输出进行重映像的话,还需要开启引脚复用时钟AFIO。

第2步设置GPIO时钟时,GPIO模式应该设置为复用推挽输出GPIO_Mode_AF_PP,如果需要引脚重映像的话,则需要用GPIO_PinRemapConfig()函数进行设置。

第3步设置TIMx定时器的相关寄存器时,和前一篇学习笔记一样,设置好相关的TIMx的时钟和技术模式等等。

具体设置参看“TIMER基本定时功能”的学习笔记。

第4步设置PWM相关寄存器,首先要设置PWM模式(默认情况下PWM是冻结的),然后设置占空比(根据前面所述公式进行计算),再设置输出比较极性:当设置为High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。

最重要是是要使能TIMx的输出状态和使能TIMx的PWM输出使能。

相关设置完成之后,就可以通过TIM_Cmd()来打开TIMx定时器,从而得到PWM输出了。

3.TIMER输出PWM源代码由于我现在手上的奋斗开发板是将PB.5接到LED上,因此需要使用TIM3的CH2通道,并且要进行引脚重映像。

打开TIM3之后,PWM输出,使得LED点亮,通过改变PWM_cfg()中的占空比可以调节LED的亮度。

#include "stm32f10x_lib.h"void RCC_cfg();void GPIO_cfg();void TIMER_cfg();void PWM_cfg();//占空比,取值范围为0-100int dutyfactor = 50;int main(){int Temp;RCC_cfg();GPIO_cfg();TIMER_cfg();PWM_cfg();//使能TIM3计时器,开始输出PWMTIM_Cmd(TIM3, ENABLE);while(1);}void RCC_cfg(){//定义错误状态变量ErrorStatus HSEStartUpStatus;//将RCC寄存器重新设置为默认值RCC_DeInit();//打开外部高速时钟晶振RCC_HSEConfig(RCC_HSE_ON);//等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){//设置AHB时钟(HCLK)为系统时钟RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置高速AHB时钟(APB2)为HCLK时钟RCC_PCLK2Config(RCC_HCLK_Div1);//设置低速AHB时钟(APB1)为HCLK的2分频RCC_PCLK1Config(RCC_HCLK_Div2);//设置FLASH代码延时FLASH_SetLatency(FLASH_Latency_2);//使能预取指缓存FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//设置PLL时钟,为HSE的9倍频8MHz * 9 = 72MHzRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//使能PLLRCC_PLLCmd(ENABLE);//等待PLL准备就绪while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//设置PLL为系统时钟源RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//判断PLL是否是系统时钟while(RCC_GetSYSCLKSource() != 0x08);}//开启TIM3的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启GPIOB的时钟和复用功能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); }void GPIO_cfg(){GPIO_InitTypeDef GPIO_InitStructure;//部分映射,将TIM3_CH2映射到PB5// GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//选择引脚5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//输出频率最大50MHzGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//复用推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);}void TIMER_cfg(){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//重新将Timer设置为缺省值TIM_DeInit(TIM3);//采用内部时钟给TIM3提供时钟源TIM_InternalClockConfig(TIM3);//预分频系数为0,即不进行预分频,此时TIMER的频率为72MHzTIM_TimeBaseStructure.TIM_Prescaler = 0;//设置时钟分割TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置计数器模式为向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置计数溢出大小,每计7200个数就产生一个更新事件,即PWM的输出频率为10kHz TIM_TimeBaseStructure.TIM_Period = 7200 - 1;//将配置应用到TIM3中TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);}void PWM_cfg(){TIM_OCInitTypeDef TimOCInitStructure;//设置缺省值TIM_OCStructInit(&TimOCInitStructure);//PWM模式1输出TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100% TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;//TIM输出比较极性高TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//使能输出状态TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM3的CH2输出TIM_OC2Init(TIM3, &TimOCInitStructure);//设置TIM3的PWM输出为使能TIM_CtrlPWMOutputs(TIM3,ENABLE);}。

相关文档
最新文档