谁有STM32stm32f103高级定时器器的 详细教程啊

高级定时器和普通定时器使用的区别疑惑? - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
Hot [活动]
高级定时器和普通定时器使用的区别疑惑?
21:35:42  
例程里给了TIM3 CH3输出PWM的例程,我复制了这个例程照着手册把每一句代码相应的寄存器都修改了一下,让它成为TIM1 CH1输出PWM,结果TIM3 CH3的pwm输出正常,但TIM1 CH1却一直没有信号,这是为什么?是不是TIM1还需要不同于TIM3的配置步骤?
求大神相助!!
上面的TIM1和TIM16用了& &TIM_CtrlPWMOutputs(TIM1, ENABLE);& & TIM_CtrlPWMOutputs(TIM16, ENABLE)这两句才可以出来PWM的
助理工程师
21:35:43  
上面的TIM1和TIM16用了& &TIM_CtrlPWMOutputs(TIM1, ENABLE);& & TIM_CtrlPWMOutputs(TIM16, ENABLE)这两句才可以出来PWM的
助理工程师
16:08:22  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
高级定时器需要加上这句 TIM_CtrlPWMOutputs(TIM1, ENABLE); 你看看你加了没,如果不加出不来PWM,你网上查下这句的用途,这样深刻一些。
下面的这个函数是我写的,是可以产生PWM的,GPIO你自己配置下,还有我没有使能定时器,因为我在需要的时候才打开定时器,可以餐卡下
static void TIMInit(uint16_t PWM_Frequency, uint16_t Duty)
& & uint16_t PeriodV
& & uint16_t ChannelP
& & if(PWM_Frequency &1)& && &&&
& && &&&PWM_Frequency = 1;
& & if(PWM_Frequency &100)
& && &&&PWM_Frequency = 100;
& & if(Duty & 99)
& && &&&Duty = 99;
& & PeriodValue = (uint16_t)((8000000/(((uint16_t)TIMClockPrescaler + 1)*PWM_Frequency)) - 1u);
& & ChannelPulse = (uint16_t) (((uint32_t)( Duty*100) * (PeriodValue + 1)) / 10000u);
& & /* Time Base configuration */
& & TIM_TimeBaseInitTypeDef&&TIM_TimeBaseS
& & TIM_OCInitTypeDef&&TIM_OCInitS
& & TIM_TimeBaseStructure.TIM_Prescaler = TIMClockP& && && && && && &&&//设置预分频,8M/(799+1)=10000HZ (TIM3的时钟为8MHZ)
& & TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;& && && && && &&&//向上计数
& & TIM_TimeBaseStructure.TIM_Period = PeriodV& && && && && && && && && &&&//计数器从0开始计数到999,即1000次为一个定时周期(设置PWM周期)
& & TIM_TimeBaseStructure.TIM_ClockDivision = 0;& && && && && && && && && && &&&//设置滤波分频为不分频&&
& & TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
& & TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
& & TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
& & TIM_TimeBaseInit(TIM16, &TIM_TimeBaseStructure);
& & TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;& && && && && && && && && &//配置PWM为模式1
& & TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_E
& & TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E& && && && && &//正向通道有效
& & TIM_OCInitStructure.TIM_Pulse = ChannelP& && && && && && && && && && & //当计数器计数到这个值时电平发生跳变(设置空比)
& & TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_L& && && && && && &&&//当计数值小于上面的值时的电平
& & TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_H& &
& & TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_S
& & TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_R
& & TIM_OC1Init(TIM1, &TIM_OCInitStructure);& && && && && && && && && && && && &//TIM1通道CH1N
& & TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
& & TIM_OC1Init(TIM2, &TIM_OCInitStructure);& && && && && && && && && && && && &//TIM2通道1
& & TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);& && && && && && && && && & //使能TIM2 在 CCR1 上的预装载寄存器& &
& & TIM_OC1Init(TIM3, &TIM_OCInitStructure);& && && && && && && && && && && && &//通道1
& & TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);& && && && && && && && && & //使能TIM3 在 CCR1 上的预装载寄存器
& & TIM_OC1Init(TIM16, &TIM_OCInitStructure);& && && && && && && && && && && &&&//通道1
& & TIM_OC1PreloadConfig(TIM16,TIM_OCPreload_Enable);& && && && && && && && && &//使能TIM3 在 CCR1 上的预装载寄存器
& & TIM_OC2Init(TIM1, &TIM_OCInitStructure);& && && && && && && && && && && && &//TIM1通道CH2N
& & TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);
& & TIM_OC2Init(TIM2, &TIM_OCInitStructure);& && && && && && && && && && && && &//TIM2通道2
& & TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);& && && && && && && && && & //使能TIM2 在 CCR2 上的预装载寄存器& &
& & TIM_OC2Init(TIM3, &TIM_OCInitStructure);& && && && && && && && && && && && &//通道2
& & TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);& && && && && && && && && & //使能TIM3 在 CCR2 上的预装载寄存器
& & TIM_OC3Init(TIM1, &TIM_OCInitStructure);& && && && && && && && && && && && &//TIM1通道CH3N
& & TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);
& & TIM_OC3Init(TIM2, &TIM_OCInitStructure);& && && && && && && && && && && && &//TIM2通道3
& & TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);& && && && && && && && && & //使能TIM3 在 CCR3 上的预装载寄存器& &
& & TIM_OC3Init(TIM3, &TIM_OCInitStructure);& && && && && && && && && && && && &//通道3
& & TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);& && && && && && && && && & //使能TIM3 在 CCR3 上的预装载寄存器
& & TIM_OC4Init(TIM2, &TIM_OCInitStructure);& && && && && && && && && && && && &//TIM2通道4
& & TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);& && && && && && && && && & //使能TIM3 在 CCR4 上的预装载寄存器& &
& & TIM_OC4Init(TIM3, &TIM_OCInitStructure);& && && && && && && && && && && && &//通道4
& & TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);& && && && && && && && && & //使能TIM3 在 CCR4 上的预装载寄存器
& & TIM_CtrlPWMOutputs(TIM1, ENABLE);& && && && && && && && && && && && && && & //高级定时器需要加上这句
& & TIM_CtrlPWMOutputs(TIM16, ENABLE);
& & TIM_ARRPreloadConfig(TIM2,ENABLE);& && && && && && && && && && && && && && &//使能TIM2计数值自动重装& &
& & TIM_ARRPreloadConfig(TIM3,ENABLE);& && && && && && && && && && && && && && &//使能TIM3计数值自动重装
& & TIM_ARRPreloadConfig(TIM16,ENABLE);& && && && && && && && && && && && && &&&//使能TIM3计数值自动重装
& & TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE );
工程师职场
Powered by查看: 4908|回复: 5
STM32 的 高级定时器中 BDTR 死区怎么理解啊
主题帖子精华
中级会员, 积分 308, 距离下一级还需 192 积分
在线时间32 小时
最近学习STM32的定时器,对这个死区没有理解,这个死区是什么意思啊?
在变频电源驱动中有使用,两路PWM分别控制开关管,开关管交替导通截至之间就是要插入一个死区,不然两个同事导通就爆炸了!
一路狂奔!
主题帖子精华
金牌会员, 积分 1561, 距离下一级还需 1439 积分
在线时间206 小时
在变频电源驱动中有使用,两路PWM分别控制开关管,开关管交替导通截至之间就是要插入一个死区,不然两个同事导通就爆炸了!
让我们的思维驾驭在电的速度之上!
承接各种电子产品设计。
主题帖子精华
金钱111562
在线时间787 小时
回复【5楼】南帝:
---------------------------------
在理想条件下,就不应该同时导通.
mos管的反应速度无限快,那么就不会同时导通了.
关键是mos管反应速度没那么快,你必须插入一点时间,错开高低电平的变化,防止两个mos管同时导通,否则就game&over了...
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
金钱111562
在线时间787 小时
可以百度学习下。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 308, 距离下一级还需 192 积分
在线时间32 小时
回复【2楼】正点原子:
---------------------------------
看了下,没查到有用的信息,因为没有用过,这个东西,是具体用在什么上的,我只是设置了,发现有几个微秒的差异!
一路狂奔!
主题帖子精华
中级会员, 积分 308, 距离下一级还需 192 积分
在线时间32 小时
回复【4楼】DongInker:
---------------------------------
额?是不是如果按照理想的情况下的波形,在高低电平跳转的时候,就可能出现两个同事导通的现象,死区就是这个间隔时间?
一路狂奔!
Powered by只需一步,快速开始
扫一扫,访问微社区
后使用快捷导航没有帐号?
查看: 4421|回复: 74
主题帖子积分
& & 很多网友提问,STM32能产生全桥移相波形吗?熟悉STM32定时器原理的朋友都知道它不能产生全桥移相的功能。一般的STM32含有一个或两个16位高级定时器、四个16位通用定时器、两个16位基本定时器。其中,只有高级定时器才能够输出互补波形,而生成全桥移相波形的前提就是互补输出,因此必须采用高级定时器来产生移相波形的功能。但是,高级定时器1或定时器8的3个通道只能产生同相的互补波形,因为在PWM模式下三个通道的电平翻转时刻均在计数值到达TOP和CCR时发生。所以要产生全桥移相波形,必须采用不同的定时器的通道来组成两个桥臂,在所有的定时器里面,只有定时器1和8才能产生互补输出,因此我们采用定时器1和定时器8的组合来生成移相波形。& & 本实验采用STM32F103VCT6,也可以采用更低端一点的型号,只要含有2个高级定时器就可以。
& & 全桥移相原理图以及波形图如下,这里不作详细解释。
& & 主回路原理:
主回路原理.jpg (33.74 KB, 下载次数: 49)
10:06 上传
& & 全桥移相工作原理波形图:
原理.jpg (105.2 KB, 下载次数: 56)
10:05 上传
& & 波形产生原理:
& & 利用定时器1的通道1和定时器8的通道2(也可以用其他通道,这里是随选的通道)作为互补输出的两个桥臂,定时器1作为主定时器,定时器8作为从定时器,并且配置定时器8为从模式下的复位模式,再利用定时器1的另一路比较输出通道(通道4)来复位定时器8,只要改变定时器比较通道4的比较值就可以改变定时器8输出的相位,这样就达到了移相的效果。如下图所示。
波形生成原理.jpg (24.32 KB, 下载次数: 53)
10:47 上传
& & F103VC的定时器功能配置如下,向上计数模式,TOP值=719,PWM边沿对齐模式,CCR=359,互补输出和死区插入使能,定时器1主模式,事件触发源选择CCP4;定时8从模式,从定时器1的触发事件获得复位。
& & 先看波形:& & 桥臂1的波形,带死区,频率100KHz。
& & (示波器只有两个探头,没办法测试4个驱动波形,先看上桥臂的移相波形)& &
桥臂1.jpg (73.46 KB, 下载次数: 46)
18:03 上传
& & 开始测试移相咯。
& & 相位0度:
移相0-720.jpg (68.33 KB, 下载次数: 49)
18:03 上传
& & 放大后的波形
移相0-720放大.jpg (67.53 KB, 下载次数: 53)
18:03 上传
& & 相位1/720度:
移相1-720.jpg (69.38 KB, 下载次数: 56)
18:03 上传
& & 放大后的波形,时间轴20ns,波形延迟15.2ns,理论上应该是.89ns,这里时间轴设置比较小,测量有误差
移相1-720放大.jpg (78.43 KB, 下载次数: 55)
18:03 上传
& & 相位2/720度:
移相2-720.jpg (70.1 KB, 下载次数: 51)
18:03 上传
& & 放大后的波形,波形延迟29.6ns,理论上应该是.78ns,应该是测量误差
移相2-720放大.jpg (77.53 KB, 下载次数: 50)
18:03 上传
& & 相位3/720度:
移相3-720.jpg (77.36 KB, 下载次数: 48)
18:03 上传
& & 放大后的波形,相位延迟44.0ns,理论.67ns
移相3-720放大.jpg (77.61 KB, 下载次数: 47)
18:03 上传
& & 相位4/720度:
移相4-720.jpg (69.07 KB, 下载次数: 48)
18:03 上传
& & 放大后的波形,相位延迟57.6ns,理论.56ns
移相4-720放大.jpg (78.44 KB, 下载次数: 52)
18:03 上传
& & 相位180/720=90度:
& & 相位延迟2.48us,理论.5us
移相180-720.jpg (80.88 KB, 下载次数: 50)
18:03 上传
& & 相位360/720=180度:
& & 相位延迟5.04us,理论.0us
移相360-720.jpg (80.1 KB, 下载次数: 45)
18:03 上传
& & 由以上实验波形来看,STM32F103VC的确能生成全桥移相波形,只不过里用的是两个高级定时器的各一个通道,然后采用复位的办法让定时器能够产生移相的效果。利用这一点,也可以生成其他的移相波形,并不仅局限于全桥移相。最后补充一句,由于复位本身存在延迟,大约为40ns,因此实际的程序中还需要加入一个相位补偿代码,为了提高处理速度,可以采用汇编程序来编写。@
& & 相应的源代码见附件游客,如果您要查看本帖隐藏内容请
主题帖子积分
新手上路, 积分 27, 距离下一级还需 23 积分
新手上路, 积分 27, 距离下一级还需 23 积分
主题帖子积分
新手上路, 积分 6, 距离下一级还需 44 积分
新手上路, 积分 6, 距离下一级还需 44 积分
很感谢,正需要
主题帖子积分
新手上路, 积分 20, 距离下一级还需 30 积分
新手上路, 积分 20, 距离下一级还需 30 积分
学习学习学习学习学习学习
主题帖子积分
新手上路, 积分 20, 距离下一级还需 30 积分
新手上路, 积分 20, 距离下一级还需 30 积分
附件的程序为何在模拟仿真时,用逻辑分析仪看不到TIM8的比较输出
主题帖子积分
附件的程序为何在模拟仿真时,用逻辑分析仪看不到TIM8的比较输出
这个貌似是keil软件逻辑分析仪的bug,我用的4.6版本,你用高版本试一试。
实在不行,还是真枪实弹,把程序下到芯片来验证,程序在芯片中运行又是正确的。
主题帖子积分
新手上路, 积分 20, 距离下一级还需 30 积分
新手上路, 积分 20, 距离下一级还需 30 积分
谢谢admin 。你
说的对,确实是keil的bug。我用tim2做主定时器,tim3做从定时器,逻辑分析仪就可以正常显示了。最好还是谢谢admin 。
主题帖子积分
谢谢admin 。你
说的对,确实是keil的bug。我用tim2做主定时器,tim3做从定时器,逻辑分析仪就可以正常显 ...
主题帖子积分
新手上路, 积分 24, 距离下一级还需 26 积分
新手上路, 积分 24, 距离下一级还需 26 积分
好东西要顶起来,感谢管理员,希望这个社区越办越好,方便的话加我一下QQ吧,我帮你发展一下人气,
主题帖子积分
新手上路, 积分 24, 距离下一级还需 26 积分
新手上路, 积分 24, 距离下一级还需 26 积分
好东西要顶起来!
Copyright &
Inc. All Rights Reserved.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,会员在论坛发表的言论仅代表个人观点,不代表论坛立场!
本站所有文章,发表者拥有版权,发表者拥有展示权,未经本站明确许可,任何网站不得非法盗链、转载及抄袭本站资源;转载请注明出处!
本站部分内容及所有资料来自网络,版权归原作者所有,如涉及侵权请联系我们删除;资料仅供学习和科研之用,请在下载后24小时内删除!
本站管理: Email:
本站郑重声明:本论坛不讨论涉及政治敏感话题,一经发现马上删除该贴及封ID
Powered bySTM32 NUCLEO中级教程2:
利用高级定时器产生6路互补PWM波形输出
上传时间为:
STM32的MCU产品自带定时器资源十分丰富,既有专门用于电机控制的高级定时器(TIMER1/TIMER8),又有仅定时用的基本定时器(TIMER6/TIMER7) 和通用定时器(TIMER2/3/4/5/14/15/16/17) ,还有2个看门狗定时器和一个Systick定时器,真是十分强大哈。这一篇文章就来讲解一下利用高级定时器TIMER1产生6路互补PWM波形输出。第一部分讲解用到的定时器基本内容和定时器库函数介绍;第二部分,讲解6路互补PWM输出的代码实现。一、PWM和STM32-072RB定时器及库函数内容介绍脉宽调制(PWM:(Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。简易理解,就是对输出脉冲高低电平宽度的调制!STM32-072RB MCU 有12个定时器,其中有高级定时器、通用定时器和基本定时器及系统定时器。在这其中,有一个高级定时器TIMER1可以产生7路PWM(CH1/CH2/CH3/CH4/CH1N/CH2N/CH3N), 通用定时器TIMER2/TIMER3可以分别产生4路PWM (CH1/CH2/CH3/CH4),通用定时器TIMER15能产生3路 PWM(CH1/CH2/CH1N),通用定时器TIMER14/TIMER16/TIMER17各能产生1路PWM(CH1),这样,总共能产生 21路PWM。 高级定时器TIMER1专为电机控制而生,可以产生3对6路互补PWM输出,还带有死区时间设置和刹车功能。要利用STM32的定时器来产生PWM,需要用到定时器相关的寄存器。这些寄存器在下面内容介绍。对于不同的定时器,所在时钟总线是不同的,高级定时器是APB2时钟总线提供时钟,其它通用定时器是APB1时钟总线提供时钟。STM32的定时器主要参数跟下面三个定时器有关,学习前要先看一下TIMx_CCMRx 寄存器:选择PWM模式 TIMx_ARR 寄存器: PWM的周期TIMx_CCRx 寄存器: PWM占空比 下面看一下定时器详细库函数资源介绍:1、定时器结构体成员变量 产生PWM,要用到三个结构体,分别是 TIM_TimeBaseInitTypeDef基本定时结构体 TIM_OCInitTypeDef输出比较结构体 TIM_BDTRInitTypeDef刹车和死区配置结构体 利用三个库函数来实现将结构体赋值到STM32内部寄存器中 TIM_TimeBaseInit (); TIM_OCInit () TIM_BDTRConfig()下面分别看一下三个结构体的定义:这三个结构体具体内容看一下stm32f0xx_tim.h文件。下面看一下几个常用的定时器库函数TIM_OCxPreloadConfig (); TIM_ARRPreloadConfig ();TIM_Cmd();TIM_CtrlPWMOutputs();TIM _ITConfig ();TIM_ARRPreloadConfig ();TIM_ForcedOC1Config ();TIM_GetITStatus ()TIM_ClearITPendingBit() TIM_CCPreloadControl();TIM_SelectOCxM();TIM_CCxCmd();TIM_CCxNCmd();TIM_GenerateEvent();通过这些库函数来配置出PWM波形。下面看一下在STM32-NUCLEO-072开发平台上PWM输出引脚的配置。2、PWM引脚配置在STM32F072RBT6上采用了TIMER1高级定时器的3对6路引脚(CH1/CH1N,CH2/CH2N,CH3/CH3N)分别是PA8/PA9/PA10 和/PB13/PB14/PB15在硬件上是这样:下面看一下具体的代码实现。二、Keil-mdk工程文件及代码实现1、Keil-mdk工程模板中加入PWM.C文件,在includes.h文件中加入PWM.H头文件 2、在PWM.H头文件实现宏定义 3、6路PWM引脚端口初始化PWM_GPIO_Init()代码实现 4、高级定时器初始化Timer1_Init()代码实现 这个就是对定时器三个结构体的配置,这里采用了简单的公式,实现PWM周期和占空比的设置。这里显示是8KHZ,三路占空比30%,40%和50%。这个就是对端口和三个定时器相关结构体的配置。5、主函数代码main.c代码实现 在main.c里面加入定时器初始化代码,上电复位后,就可以输出6路PWM波形了。下面的图片是利用示波器的数字通道采集的波形图。代码地址链接摩尔吧视频地址链接
目前从事研发工作,主要面向嵌入式、工业控制领域。
作者其它经验您还可以使用以下方式登录
当前位置:&>&&>& > STM32F1通用定时器示例详解--TimeBase
stm32高级定时器详解 STM32F1通用定时器示例详解--TimeBase
STM32F1通用定时器示例详解--TimeBase 前言基于学习的目的,详细讲解关于标准外设库中的定时器的17个示例项目函数文件。本次介绍TimeBase的示例。一、示例详解基于硬件平台:STM32F100B-EVAL,MCU的型号是STM32F103VET6。软件则是其标准外设库。1、Time Base的寄存器配置软件配置,运行程序可以发现,系统时钟设置为24MHz,定时器使用到的是TIM2 ; 根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,所以HCLK就是24MHz;
APB1的prescaler的系数是PPRE1:0x05,即分频4,APB1CLK为24/4 = 6M ;由于APB1的prescaler系数不为1,所以经过倍频器后就是x2,即为TIMxCLK = 6*2=12Mhz, 对于上述框图的倍频器,当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7可以工作在更高频率。
修改过来,然后发现程序就运行正常了,但是当自己再次想复现该现象时,修改回72Mhz,发现原来的现象再也不复现了。由于是超频使用了,不符合手册规范,所以这种情况是有可能的;在此,仅是提醒各位,配置时,这一块也要注意,否则可能会出现错误。
综合上述,本案例中,Timer的时钟源选择的是Internal clock,CK_PSC的时钟频率其实就是时钟树图中的输出TIMxCLK,然后TIMxCLK或CK_PSC经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。另外, 算得PrescalerValue的值为(00000)-1 = 1,即TIMx_PSC = 1,2分频,即TIMxCLK = 6*2=12Mhz, 再除以2,即TIM2 counter clock at 6 MHz,在这里我个人觉得写成PrescalerValue = (TIMx_CLK/6000000) -1 ,更合适。 TIM_PSCReloadMode_Immediate这里的PSC是写入立刻生效; 在上面的函数执行完成后,TIM_INT的计数时钟等已经设置好了。接着配置各个通道的设置: 配置的模式为TIM_OCMode_Timing (值为0x00),即是冻结Forzen,适用于产生一个基准时钟;TIM_OutputState_Enable输出使能;TIM_OCPolarity_High的值为零,代表的是高电平有效;TIM_OCPreload_Disable不允许预装载;最后TIM_Cmd(TIM2, ENABLE);,使能定时器;
允许定时器中断;在中断函数里面,如果运行下面的语句,则出现的方波的周期为73Hz,50%PWM ; 但是,如果 这是会发现,它的周期变为了上述的约一半。示波器测试是 :45.9 Hz,50%PWM ;这是怎么回事呢 ?怎么解释?上述是 update rate,所以周期是其一半。缩小CCR的值试试看是什么在影响,其实如果了解其定时机理,就不难了解,该示例中,CCR1_Val中的值定义为40961,周期值TIM_Period定义为65535;定时器是向上计数模式,计到ARR会变为0重新计数;所以,对于中断的第一个截图,有函数capture = TIM_GetCapture1(TIM2),通过变量观测capture的值总是 = CCR1_Val = CCR1 = 40961,然后再利用TIM_SetComparel的函数重新设置CCR1的值,在这里,CCR1_Val的值可以理解为步长,每隔CCR1_Val个计数时间,GPIO口翻转一次,所以 :CC1 update rate = TIM2 counter clock/ CCR1_Val
= 6000000 / 40961 = 146.48Hz,从而PWM的频率为146.48/2 = 73Hz。 对于中断的第二个截图,它一开始是计数到CCR1_Val 进入中断,GPIO翻转一次(由于GPIO初始定义为0,所以用示波器,触发模式,从波形上看不出来,如果设置初始值为高电平,则会看到一次宽度不一样的翻转),然后其实是每隔65535个计数时间,GPIO口翻转一次,此时与CCR1_Val 无关,所以 :CC1 update rate = TIM2 counter clock/ CCR1_Val
= 6000000 / 6Hz,从而PWM的频率为91.5/2 = 45.7Hz。符合描述。
重要通知 - 请仔细阅读 意法半导体公司及其子公司(“ST”)保留随时对ST 产品和/ 或本文档进行变更、更正、增强、修改和改进的权利,恕不另行通知。买方在 订货之前应获取关于ST 产品的最新信息。ST 产品的销售依照订单确认时的相关ST 销售条款。买方自行负责对ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。ST 不对任何知识产权进行任何明示或默示的授权或许可。转售的ST 产品如有不同于此处提供的信息的规定,将导致ST 针对该产品授予的任何保证失效。ST 和ST 徽标是ST 的商标。所有其他产品或服务名称均为其各自所有者的财产。本文档中的信息取代本文档所有早期版本中提供的信息。(C) 2015 STMicroelectronics - 保留所有权利
欢迎转载:
推荐:    

我要回帖

更多关于 stm32高级定时器 的文章

 

随机推荐