STM32F1系列的产品,除了互联型产品外,工位8个定时器 TIM6、TIM7是基本定时器,TIM2、3、4、5是通用定时器,TIM1、TIM8是高级定时器
基本定时器
定时器时钟TIMxCLK,即内部时钟CK_INT,经APB1预分频提供。
在STM32L4:
Tim1是高级时钟可做PWM输出
Tim15、Tim16是通用时钟,他们的时钟来源是APB2总线
Tim2、Tim3通用时钟,Tim6,Tim7基本时钟的时钟来源是APB1总线
定时器时钟CK_CNT,用来驱动计数器计数。PSC是一个16位的预分频器,CK_CNT = TIMxCLK/(PSC+1)
计数器CNT是一个16位的寄存器,最大计数值为65535.当计数达到自动重载寄存器的值ARR的时候产生更新事件,并清零从头开始计数
自动重载寄存器ARR是个16位寄存器,里面装着计数器能计数达到最大的值。当计数到这个值时,如果使能了中断,定时器会产生溢出中断
基本定时器没有捕获通道不能做PWM输出,可以做中断
定时器时钟CK_CNT = CK_INT/(PSC+1),T=1/f,则计数器计数一次的时间是1/CK_CNT;
当计数值达到ARR的时候也就是计数了ARR次,产生一次中断,中断一次的时间是(1/CK_CNT)*ARR。
脉冲宽度调制(PWM),是英文“Pulse Width Modulation"的缩写,简称脉宽调制
PWM的产生,在STM32定时器1-8中除了Timer6和Timer7不能产生PWM外,其它都可以产生。高级定时器1和8可以产生7路的PWM波,其它的可以产生4路。对于波的输出频率也利用公式1进行计算,至于波的占空比取CCR/ARR。
如图为向上计数:
定时器重装载值为ARR,比较值CCRx
t时刻对计数器值和比较值进行比较
如果计数器值小于CCRx值,输出低电平
如果计数器值大于CCRx值,输出高电平
PWM的一个周期
定时器从0开始向上计数
当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程
至此一个PWM周期完成
影响因素
ARR : 决定PWM周期(在时钟频率一定的情况下,当前为默认内部时钟CK_INT)
CCRx : 决定PWM占空比(高低电平所占整个周期比例)
通过在timx_ccmrx寄存器里的OCXM位中写入“0110”(脉宽调制模式1)或“0111”(脉宽调制模式2)。
捕获/比较模式寄存器(TIMx_CCMR1/2):该寄存器总共有 2 个, TIMx _CCMR1和 TIMx _CCMR2。 TIMx_CCMR1 控制 CH1 和 2,而 TIMx_CCMR2 控制 CH3 和 4。
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为有效电平,否则为无效电平。
当 PA1 输出高电平的时候,蜂鸣器将发声, 当 PA1 输出低电平的时候,蜂鸣器停止发声。R10U为了防止蜂鸣器误发声,下拉输出,推挽输出
有源蜂鸣器内含振荡源,只要一通电就发声,但发生频率固定,音色单一;无源蜂鸣器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出一定频率的信号才能发声。
人耳能听到的频率范围在20Hz--20kHz之间,通过STM32的GPIO引脚快速切换高低电平输出就能实现无源蜂鸣器的发声,切换的频率不同,发出的音调就不一样。当CNT达到ARR值的时候,重新归零,然后重新向上计数,依次循环。改变CCRx的值,就可以改变PWM输出的占空比;改变ARR的值,就可以改变PWM输出的频率。
由上面知道Tim2的时钟来源是APB1
80MHZ,
PWM的时钟80MHz/PSC,PWM频率80MHz/PSC/ARR,PWM周期1*ARR/(80MHz/PSC),占空比CRRx/ARR。
GPIO mode设置成复用推挽输出,因为PWM会输出高低电平,GPIO下拉防止蜂鸣器误发声音。
生成代码
写个函数改变这几个值便能控制PWM
TIMx_CHxN是互补通道,与对应的TIM_CHx是相反的输出
要用HAL_TIMEx_PWMN_Start()函数使其工作