stm32 PWM & 定时器总结

发布者:ZenMaster123最新更新时间:2018-06-28 来源: eefocus关键字:stm32  PWM  定时器 手机看文章 扫描二维码
随时随地手机看文章

学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。从名字就可以看得出来主要功能上的差异。今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。
先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。
所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。

Pwm输出最基本的调节就是频率和占空比。频率当然又和时钟信号扯上了关系。高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。APB1和APB2的区别就要在于时钟频率不同。APB2最高频率允许72MH,而APB1最高频率为36MHZ。这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:
AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。
在APB1和定时器中间的倍频器起到了巨大的作用,假如红色字体的“APB1分频器”假如不为1(默认是2),倍频器会自动将APB1时钟频率扩大2倍后作为定时器信号源,这个它内部自动控制的不用配置。设置这个倍频器的目的很简单就是在APB1是36mhz的情况下通用定时器的频率同样能达到72mhz。我用的库函数直接调用函数SystemInit(); 这个函数之后时钟配置好了:通用定时器和高级定时器的时钟现在都是72mhz(你也可以自己再配置一下RCC让他的频率更低,但是不能再高了)。定时器接下来还有一个分频寄存器:TIMX_PSC经过他的分频后,才是定时器计数的频率。所以真正的时钟频率应该是72mhz/(TIMX_PSC-1),我们设为tim_frepuency下面还会用到。
stm32的时钟频率弄得确实是很饶人的,所以关键就是先要把思路理清楚。时钟的频率弄好了下面终于可以开说重点PWM了。当然还少不了频率:pwm主要就是控制频率和占空比的:这两个因素分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX。ARR寄存器就是自动重装寄存器,也就是计数器记到这个数以后清零再开始计,这样pwm的频率就是tim_frequency/(TIMX_ARR-1)。在计数时会不停的和CCRX寄存器中的数据进行比较,如果小于的话是高电平或者低电平,计数值大于CCRX值的话电平极性反相。所以这也就控制了占空比。

 

 

下面是定时器1的配置代码:
GPIO_InitTypeDef GPIO_InitStructure2;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
//第一步:配置时钟 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1,ENABLE);
//第二步,配置goio口
/********TIM1_CH1 引脚配置*********/ 
GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP; //设置为复用浮空输出
GPIO_Init(GPIOA,&GPIO_InitStructure2);
/*********TIM1_CH1N 引脚配置********/
GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP; //设置为复用浮空输出
GPIO_Init(GPIOB,&GPIO_InitStructure2);

//第三步,定时器基本配置 
TIM_TimeBaseStructure.TIM_Period=1000-1; // 自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler=72-1; // 时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

//第四步pwm输出配置
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //设置为pwm1输出模式
TIM_OCInitStructure.TIM_Pulse=500; //设置占空比时间
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //设置输出极性
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能该通道输出
//下面几个参数是高级定时器才会用到,通用定时器不用配置
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High; //设置互补端输出极性
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//使能互补端输出
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; //死区后输出状态
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//死区后互补端输出状态
TIM_OC1Init(TIM1,&TIM_OCInitStructure); //按照指定参数初始化


//第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//运行模式下输出选择 
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//空闲模式下输出选择 
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //死区时间设置
TIM_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); 


//第六步,使能端的打开
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIMx在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1,ENABLE); //打开TIM2
//下面这句是高级定时器才有的,输出pwm必须打开
TIM_CtrlPWMOutputs(TIM1, ENABLE); //pwm输出使能,一定要记得打开

TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();这两个函数控制的是ccr1和arr的预装在使能,使能和失能的区别就是:使能的时候这两个局存期的读写需要等待有更新事件发生时才能被改变(比如计数溢出就是更新时间)。失能的时候可以直接进行读写而没有延迟。
另外在运行当中想要改变pwm的频率和占空比调用:TIM_SetAutoreload() 
TIM_SetCompare1()这两个函数就可以了。


关键字:stm32  PWM  定时器 引用地址:stm32 PWM & 定时器总结

上一篇:LPC17xx的MCPWM周期设置与计算
下一篇:用stm32输出pwm波使无刷电机转起来

推荐阅读最新更新时间:2024-03-16 16:07

STM32 LibUsbDotNet 开发CDC记录
1,一定要注意端点是分方向的,在ST的USB库中使用类似如下方式来表示端点。 第7bit为1,0x80表示IN端点。为0表示OUT端点。 这里千万不要看到IN OUT 端点都是EP1就认为EP1是一个双向端点。按照USB规范,只有EP0是双向端点,其他都只能是单向端点,所以实际上,如下表示是两个不同的端点,这里千万不要混淆了。 #define CDC_IN_EP 0x81 /* EP1 for data IN */ #define CDC_OUT_EP 0x01 /* EP1 for data OUT */ 2,LibUsbDotNet在调用Read Wri
[单片机]
STM32比较常见的BUG总结
STM32是一款处理器,具有高性能、完整的系统和易于使用的特性。随着STM32在各个领域的应用越来越广泛,在开发过程中也存在一些常见的Bug。 1. 在使用该处理器的时候可能会出现无法正确保存设置的问题。此时,用户可以通过更新芯片驱动程序来解决该问题。 2. 在执行某些操作时可能会出现温度过高或电压过低的情况,导致处理器出现异常。此时,用户可以检查处理器的工作环境,确保环境温度及电压在正常范围内。 3. 可能会出现无法正常识别外部设备的问题,此时要检查连接电路是否正常,并将外设重新安装驱动程序。 4. 在编译过程中可能会出现各种报错信息,此时要检查代码是否满足编译要求,同时使用更新的编译工具来避免编译报错。 5
[单片机]
STM32—SysTick使用方法
一、STM32的SysTick简介   SysTick是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。 systick的作用:    在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。要解决这个问题,可以使用实时操作系统(RTOS).   因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。这样SYSTICK
[单片机]
<font color='red'>STM32</font>—SysTick使用方法
远翔FP6291:2.5A电流模式PWM升压IC
FP6291是一个 电流 模式增压直流-直流 转换器 。它的PWM电路内置0.2Ω功率 MOSFET 使该调节器高效。内部补偿 网络 还可以最小化多达6个外部组件计数。误差 放大器 的非反相输入连接到一个0.6V的精度参考电压,内部的软启动功能可以降低涌入电流。FP6291可在SOT23-6L软件包中使用,并为应用程序领域提供节省空间的 PCB 。 特色 ➢可调输出高达12V ➢内部固定PWM频率:1.0MHz ➢精密反馈参考电压:0.6V(±2%) ➢内部0.2Ω,2.5A,16V MOSFET ➢关机电流:0.1μA ➢过温保护 ➢过电压保护 ➢可调过电流保护:0.5A~2.5A ➢封装:SOT23-6L 应用案例 1、移
[嵌入式]
远翔FP6291:2.5A电流模式<font color='red'>PWM</font>升压IC
51单片机定时器程序超简单实现数码管24小时时钟显示
用74hc573实现数码管24小时时钟显示,对于74hc573芯片如果不了解可以看看文件里面的手册,不多说先上代码 /*以下程序是根据74hc573芯片的锁存器 **原理来写的 **若有不懂的地方可以看看文件夹的芯片 **手册或者百度*/ #include reg52.h typedef unsigned char u8; typedef unsigned int u16; //串口定义没什么好说的 sbit LSA = P2^2; sbit LSB = P2^3; sbit LSC = P2^4; u8 code mabiao ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
[单片机]
51单片机<font color='red'>定时器</font>程序超简单实现数码管24小时时钟显示
步进电压准确的PWM基准电压发生电路
电路的功能 这种PWM式的D-A转换器,数据范围为0~255(8位二进制),因此能以10MV为一步,产生0~2.55V的电压另外通过改变电阻R2可使满量程电压在10V以内随意设定。电压变化取决于脉冲占空比,因此,只要基准电压稳定,便可产生稳定的输出电压。 电路工作原理 IC3和IC4是4位地进制计数器,时钟信号每输入256个脉冲,就输入进位指令,预置R-S双稳态多谐振器IC。IC1和IC2是递减计数器,用IC4的进位指令使电压数据加载、分频,用IC2的进位指令使双稳态多谐振荡器复位。置位、复位的时间与数据成正比,以10MV为一步时,R2-0欧(短路)。
[工业控制]
步进电压准确的<font color='red'>PWM</font>基准电压发生电路
PWM DC/DC转换器输入电压恒定不变(Ui=常数)
  在临界连续状态下工作时,输出电压Uo=Ui·Du的关系仍然存在。如果输入电压恒定不变,即Ui=常数时,则IoG可以用Ui来表示,这样式(3-29)可以改写成式(3-30):      式(3-34)即为当Ui=常数时,电流临界连续时输出电压Uo的表示式,可知输出电压Uo不仅与输入电压Ui和占空比Du有关,而且还负载电流Io的大小有关。其中,IoG在转换器结构参数Lf和fs确定以后,并且在输入电压Ui一定时IoGmax为常数。   式(3-7)和式(3-34)确定了Buck PWM DC/DC转换器的外特性曲线在电感电流连续区和断续区的规律,式(3-31)和式(3--32)确定了电感电流连续和断续的边界,由此就可
[电源管理]
<font color='red'>PWM</font> DC/DC转换器输入电压恒定不变(Ui=常数)
TMS320F28xx DSP中内部Flash的应用研究
  1 前言   TMS320F28xx DSP片内有128 K×16 bit字的Flash、两块4 K x16bit字的单周期访问RAM(SARAM)LO和L1、一块8 Kxl6 bit字的单周期访问RAM(SARAM)HO、两块1 Kxl6 bit字的单周期访问RAM(SARAM)M0和M1。由于存储器种类多、容量大,所以从系统的高度来配置各个存储器必须有合适的方法,而这些方法一般都与片内Flash有关。另外,TMS320F28xx DSP片内有看门狗定时器模块(WDT)、引导ROM(ROM bootloader)模块、代码安全模块(CSM),要合理地使用这些模块为整个系统服务,必定也要用到Flash。   由此可以看出,F
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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