本帖最后由 香水城 于 2017-8-17 14:36 编辑
STM32F1通用定时器示例详解--TIM15_ComplementarySignals
前言
基于学习的目的,详细讲解关于标准外设库中的定时器的17个示例项目函数文件。本次介绍TIM15_ComplementarySignals的示例。
一、示例详解
基于硬件平台:STM32F100B-EVAL,MCU的型号是STM32F100VBT6。
软件则是其标准外设库。
1、TIM15_ComplementarySignals的寄存器配置
软件配置,运行程序可以发现,系统时钟设置为24MHz,定时器使用到的是TIM15 ;
AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是24MHz;
APB2的prescaler的系数是PPRE2:0x0,HCLK not divided,即/1,APB2CLK为24MHz;由于APB2的prescaler系数部分频,即/1,所以倍频器不起作用,即为上图中的TIMxCLK = 24Mhz。
二、示例演练
综合上述,本案例中,Timer的时钟源选择的是Internal clock,CK_PSC的时钟频率其实就是时钟树图中的输出TIMxCLK,然后TIMxCLK或CK_PSC经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。
另外,
占空比的计算如上图,其中,CCR1_Val = 32767,所以带入上式,计算得到:Duty Cycle = 32767/(65535+1) = 49.99%,近似50%。
在上面的函数执行完成后,TIM_INT的计数时钟等已经设置好了。基本上TimeBaseInit的函数主要初始化的寄存器是:
a.Select the Counter Mode;b.Set the clock division;c.Set the Autoreload value;d.Set the prescaler value;e.Set the Repetition Counter value;
主要的是TIMx_CR1,TIMx_ARR,TIMx_PSC,TIMx_RCR,TIMx_EGR这几个寄存器,主要的设置ARR寄存器。
再简单的描述一下Prescaler和ClockDivision这两者区别:个人理解,prescalor是预分频,用于输入捕获等采样时候的分频,是计数分频;
而ClockDivision决定了时钟和滤波器采样时间之间的关系,只能取1,2,4这三个值。
接着配置各个通道的设置:
(结合上面两个图片和极性的配置,可以得出OCx的电平的输出,这里不再多说。)
配置的模式为TIM_OCMode_PWM2 (值为OC1M = 111);输出使能;低电平有效;最后TIM_Cmd(TIM2, ENABLE);
使能PWM输出;没有打开中断;
TIM15 counter clock at 24 MHz,计数到32767变化,50%占空比,所以更新率为24000000/32767 = 732.4Hz,PWM周期为732.4/2 = 366Hz,用示波器观测符合描述。如下图:(下图中并未使能TIM_Break_Enable,未插入死区时间,仅仅是观察互补信号的波形,从下图可以看出,两个波形的周期相同,占空比之和为100%,符合互补性号的描述)。
其中:
黄色信号代表的是PA2,TIM15_CH1;
蓝色信号代表的是PB15,TIM15_CH1N;
此处,TIM_OCIdleState的端口是PA2,空闲时是Set即为高电平,TIM_OCNIdleState的端口是PB15,空闲时是Reset即为低电平,对于通道对应的端口位可以参考相关芯片的datasheet表格。
打到如上断点后,示波器的波形,黄色的是PA2,高电平,蓝色的是PB15,低电平;也符合描述,用于指明空闲时的状态。
其中,TIM_OSSRState_Enable和TIM_OSSIState_Enable分别是运行模式下“关闭状态”选择 (Off-state selection for Run mode)和空闲模式下“关闭状态”选择 (Off-state selection for Idle mode)。具体结合下图表,可以得出相应的端口状态。
TIM_AutomaticOutput_Enable,在该程序中,AOE = 1,而MOE = 0,即MOE 主输出使能 (Main output enable)在下一个更新事件被自动置’1’(如果刹车输入无效)。
使能刹车功能,且刹车输入高电平有效,即当:
TIM15_BKIN(PA9)引脚拉高时,刹车功能起作用,无信号输出 ;
TIM15_BKIN(PA9)引脚拉低时,刹车功能不起作用,有信号输出 ;
所以在演练该示例时,需要将PA9跳线接到地以观察输出的互补信号。
最后,讨论死区时间的设置,TIM_DeadTime的影响;其设置的公式如下:
自己的计算与Readme.txt中的描述相符。
当TIM_DeadTime = 0xFF;可以很明显的看出DeadTime在起作用,
直观的看是对两者CH1和CH1N都起作用,对占空比有影响,不影响周期。
下图讲解的很清楚:
如果OCx和OCxN为高有效:
1/ OCx输出信号与参考信号OCxREF相同,只是它的上升沿相对于参考信号的上升沿有一个延迟。
2/ OCxN输出信号与参考信号OCxREF相反,只是它的上升沿相对于参考信号的下降沿有一个延迟。
参考这两句话,可以得出下面的图形。
对应的pdf:STM32F1通用定时器示例详解_TIM15_ComplementarySignals
更多实战经验请看:【ST MCU实战经验汇总贴】
|