STM32stm32 定时器计数清零的定时频率和计数频率的区别

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
STM32定时器.ppt39页
本文档一共被下载:
次 ,本文档已强制全文免费阅读,若需下载请自行甄别文档质量。
文档加载中...广告还剩秒
需要金币:120 &&
STM32定时器.ppt
你可能关注的文档:
··········
··········
STM32的定时器使用 STM32定时器的工作原理 STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振) T
F为频率 例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频 即1个机器周期有12个时钟周期 ,则单片机的最小定时时间为
12MHz / 12
1us STM32定时器的工作原理 最小定时时间 T
1us 51单片机定时器:
13位 最大定时时间间隔
2^13 8.192ms 方式1
16位 最大定时时间间隔 2^16 65.536ms 方式2
最大定时时间间隔
STM32定时器的工作原理 由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容
1.分频器 分频比
2.定时计数器的值
STM32定时器类型 按功能划分 ●
2个高级控制定时器
TIM8 可分配6个通道的三相PWM发生器(多用于电机控制) ●
4个普通定时器 TIM2 TIM3 TIM4 TIM5 每个定时器有4个输入捕获/输出比较/PWM/脉冲计数 STM32定时器类型 ●
2个基本定时器 TIM6
TIM7 主要用于产生DAC触发信号 ●
2个看门狗定时器―― 独立看门狗
窗口看门狗 ●
系统时基定时器
24位递减计数器
自动重加载
常用于产生延时
ms级 STM32定时器的时钟 CK_CNT
表示定时器工作频率 TIMx_PSC
表示分频系数
则定时器的工作频率计算公式为 CK_CNT 定时器时钟/
TIMx_PSC +1
由此我们可得到STM32单片机1个时钟周期为:
T 1/ CK_CNT 例如普通定时器模块的时钟为72MHz,分频比位7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为 TIMx_ARR
因为72 000 000 / 7200
10KHz 时钟周期T 1/10KHz 100us 100us × 10 000
结论 :分频比7199 定时计数器的值 10 000
普通定时器相关的寄存器介绍及配制方法 第一步: 打开(使能)相应定时器的
正在加载中,请稍后...21ic官方微信-->
后使用快捷导航没有帐号?
查看: 8757|回复: 15
STM32每个通用定时器可以单独输出4路不同频率的PWM波形?
&&已结帖(1)
主题帖子积分
资深技术员, 积分 340, 距离下一级还需 160 积分
资深技术员, 积分 340, 距离下一级还需 160 积分
主题帖子积分
专家等级:结帖率:74%
主题帖子积分
资深技术员, 积分 340, 距离下一级还需 160 积分
资深技术员, 积分 340, 距离下一级还需 160 积分
STM32每个通用定时器可以单独输出4路不同频率的PWM波形?
如下代码。是不是说STM32每个通用定时器可以单独输出4路不同频率的PWM波形?我看以下代码还有每个通道的单独设置。
#include &stm32f10x.h&
TIM_TimeBaseInitTypeDef TIM_TimeBaseS
TIM_OCInitTypeDef TIM_OCInitS
uint16_t CCR1_Val = 250;
uint16_t CCR2_Val = 500;
uint16_t CCR3_Val = 750;
uint16_t CCR4_Val = 0;
uint16_t PrescalerValue = 0;
voidRCC_Configuration(void);& && && && && & //时钟配置
voidGPIO_Configuration(void);& && && && &//管脚配置
void Delay (__IO uint32_tnCount);& && && &//延时函数
int main(void)
RCC_Configuration();
GPIO_Configuration();
PrescalerValue = (uint16_t) (SystemCoreClock /) - 1;
TIM_TimeBaseStructure.TIM_Period =1000;& && && && && && && && && && && &//周期
TIM_TimeBaseStructure.TIM_Prescaler =PrescalerV& && && && & //分频
TIM_TimeBaseStructure.TIM_ClockDivision =0;& && && && && && && && && & //时钟分割
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;
& && && && && &//计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);& && && && && && &//初始TIM3
/*************************** 通道1 ********************************/
TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM2;& & //PWM2
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_E& &//PWM功能使能
TIM_OCInitStructure.TIM_Pulse =CCR1_V& && && && && && && && && &//写比较值(占空比
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_L& &//置高
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
/****************************** 通道2 ******************************/
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR2_V
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_H
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
/******************************* 通道3 *********************************/
/* PWM1 Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR3_V
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
/****************************** 通道4 *********************************/
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR4_V
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3,ENABLE);& && && && && && && &&&//
TIM_Cmd(TIM3,ENABLE);& && && && && && && && && && && && && &&&//使能计数
CCR4_Val++;
if(CCR4_Val==1000)CCR4_Val=0;
TIM_SetCompare4(TIM3,CCR4_Val);& && && && && && && && &//占空比调节
满意回复+1
除非不断地进行软件干预,否则单个通用定时器不可以单独输出4路不同频率的PWM波形。
主题帖子积分
主题帖子积分
专家等级:结帖率:33%打赏:0.00受赏:9.00
主题帖子积分
除非不断地进行软件干预,否则单个通用定时器不可以单独输出4路不同频率的PWM波形。
I do not teach, but I coach. I do not feed, but I seed.
欢迎访问我的博客:/BLOG_OWNER_199055.HTM
主题帖子积分
资深技术员, 积分 340, 距离下一级还需 160 积分
资深技术员, 积分 340, 距离下一级还需 160 积分
主题帖子积分
专家等级:结帖率:74%
主题帖子积分
资深技术员, 积分 340, 距离下一级还需 160 积分
资深技术员, 积分 340, 距离下一级还需 160 积分
/*************************** 通道1 ********************************/
TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM2;& & //PWM2
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_E& &//PWM功能使能
TIM_OCInitStructure.TIM_Pulse =CCR1_V& && && && && && && && && &//写比较值(占空比
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_L& &//置高
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
/****************************** 通道2 ******************************/
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR2_V
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_H
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
/******************************* 通道3 *********************************/
/* PWM1 Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR3_V
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
/****************************** 通道4 *********************************/
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR4_V
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3,ENABLE);
主题帖子积分
资深技术员, 积分 340, 距离下一级还需 160 积分
资深技术员, 积分 340, 距离下一级还需 160 积分
主题帖子积分
专家等级:结帖率:74%
主题帖子积分
资深技术员, 积分 340, 距离下一级还需 160 积分
资深技术员, 积分 340, 距离下一级还需 160 积分
如楼上红色的文字,那这里每个通道设置一个常数,是想得到4个不同占空比的PWM信号吗?
主题帖子积分
资深技术员, 积分 340, 距离下一级还需 160 积分
资深技术员, 积分 340, 距离下一级还需 160 积分
主题帖子积分
专家等级:结帖率:74%
主题帖子积分
资深技术员, 积分 340, 距离下一级还需 160 积分
资深技术员, 积分 340, 距离下一级还需 160 积分
前面的4个常数是这样设置的
uint16_t CCR1_Val = 250;
uint16_t CCR2_Val = 500;
uint16_t CCR3_Val = 750;
uint16_t CCR4_Val = 0;
主题帖子积分
中级技术员, 积分 212, 距离下一级还需 88 积分
中级技术员, 积分 212, 距离下一级还需 88 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 212, 距离下一级还需 88 积分
中级技术员, 积分 212, 距离下一级还需 88 积分
对的,频率应该都是一样的,但可以输出不同占空比的波形
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
同意6楼。。。
主题帖子积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
主题帖子积分
中级技术员, 积分 144, 距离下一级还需 156 积分
中级技术员, 积分 144, 距离下一级还需 156 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 144, 距离下一级还需 156 积分
中级技术员, 积分 144, 距离下一级还需 156 积分
恩,频率肯定是一个,占空比可调
骑车去远方
主题帖子积分
实习生, 积分 21, 距离下一级还需 29 积分
实习生, 积分 21, 距离下一级还需 29 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
实习生, 积分 21, 距离下一级还需 29 积分
实习生, 积分 21, 距离下一级还需 29 积分
请问这种情况下,怎么设置不同PWM的输出IO口,有没有这方面的参考文档
主题帖子积分
助理工程师, 积分 1552, 距离下一级还需 448 积分
助理工程师, 积分 1552, 距离下一级还需 448 积分
主题帖子积分
专家等级:结帖率:25%
主题帖子积分
助理工程师, 积分 1552, 距离下一级还需 448 积分
助理工程师, 积分 1552, 距离下一级还需 448 积分
请问楼主实现了没:一个定时器输出四路不同频率的PWM????
主题帖子积分
中级技术员, 积分 228, 距离下一级还需 72 积分
中级技术员, 积分 228, 距离下一级还需 72 积分
主题帖子积分
专家等级:结帖率:39%
主题帖子积分
中级技术员, 积分 228, 距离下一级还需 72 积分
中级技术员, 积分 228, 距离下一级还需 72 积分
用比较输出模式 输出的好像也是PWM波吧?那样的话就可以输出4路PWM
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
四路不同频率的PWM输出,各位解决了没有啊
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
四路不同频率的PWM输出,各位解决了没有啊
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
用PWM模式是没办法输出不同频率的PWM波的,有人说用比较模式可以,我没有实现过
主题帖子积分
助理工程师, 积分 1038, 距离下一级还需 962 积分
助理工程师, 积分 1038, 距离下一级还需 962 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:10.00
主题帖子积分
助理工程师, 积分 1038, 距离下一级还需 962 积分
助理工程师, 积分 1038, 距离下一级还需 962 积分
四路频率一样,占空比不同的PWM
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
技术新星奖章
人才类勋章
时间类勋章
技术奇才奖章
人才类勋章
时间类勋章
欢快之小溪
发帖类勋章
社区建设奖章
等级类勋章
时间类勋章下次自动登录
现在的位置:
& 综合 & 正文
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下面还会用到。
GPIO_InitTypeDef GPIO_InitStructure2;
TIM_TimeBaseInitTypeDef TIM_TimeBaseS
TIM_OCInitTypeDef TIM_OCInitS
TIM_BDTRInitTypeDef TIM_BDTRInitS
//第一步:配置时钟
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_L //设置输出极性
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_E //使能该通道输出
//下面几个参数是高级定时器才会用到,通用定时器不用配置
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_H //设置互补端输出极性
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_E//使能互补端输出
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_R //死区后输出状态
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_R//死区后互补端输出状态
TIM_OC1Init(TIM1,&TIM_OCInitStructure); //按照指定参数初始化
//第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_D//运行模式下输出选择
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_D//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_D //刹车功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_H//刹车输入极性
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_E//自动输出使能
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()这两个函数就可以了。
//第三步,定时器基本配置
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_L //设置输出极性
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_E //使能该通道输出
//下面几个参数是高级定时器才会用到,通用定时器不用配置
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_H //设置互补端输出极性
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_E//使能互补端输出
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_R //死区后输出状态
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_R//死区后互补端输出状态
TIM_OC1Init(TIM1,&TIM_OCInitStructure); //按照指定参数初始化
//第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_D//运行模式下输出选择
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_D//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_D //刹车功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_H//刹车输入极性
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_E//自动输出使能
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()这两个函数就可以了。
//第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_D//运行模式下输出选择
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_D//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_D //刹车功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_H//刹车输入极性
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_E//自动输出使能
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()这两个函数就可以了。
//第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_D//运行模式下输出选择
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_D//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_D //刹车功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_H//刹车输入极性
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_E//自动输出使能
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()这两个函数就可以了。
//第六步,使能端的打开
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()这两个函数就可以了。
//第六步,使能端的打开
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()这两个函数就可以了。
TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();这两个函数控制的是ccr1和arr的预装在使能,使能和失能的区别就是:使能的时候这两个局存期的读写需要等待有更新事件发生时才能被改变(比如计数溢出就是更新时间)。失能的时候可以直接进行读写而没有延迟。
另外在运行当中想要改变pwm的频率和占空比调用:TIM_SetAutoreload()
TIM_SetCompare1()这两个函数就可以了。
stm32的时钟频率弄得确实是很饶人的,所以关键就是先要把思路理清楚。时钟的频率弄好了下面终于可以开说重点PWM了。当然还少不了频率:pwm主要就是控制频率和占空比的:这两个因素分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX。ARR寄存器就是自动重装寄存器,也就是计数器记到这个数以后清零再开始计,这样pwm的频率就是tim_frequency/(TIMX_ARR-1)。在计数时会不停的和CCRX寄存器中的数据进行比较,如果小于的话是高电平或者低电平,计数值大于CCRX值的话电平极性反相。所以这也就控制了占空比。
下面是定时器1的配置:
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 stm32定时器计数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信