Skip to content

L2 定时器与 PWM

本课目标

能从时钟树确定定时器输入时钟,使用 PSC、ARR、CCR 计算更新频率与占空比,并将示例参数迁移到 Stellaris-Nexus 的 RGB LED、蜂鸣器和舵机接口。

一、STM32F103C8T6 的时钟树:芯片的“血液循环系统”

1.1 为什么需要复杂的时钟树?

单片机内部并非一个单一的整体,而是由众多功能各异的模块(如CPU内核、内存、定时器、串口、ADC等)协同工作的“微型城市”。时钟树的作用,可以类比为这个城市的:

  1. 统一的计时基准(脉搏): 就像城市需要统一的时间来协调交通、上下班一样,芯片内所有数字逻辑电路的每一步操作(读取、计算、写入)都需要一个精准的时钟脉冲来驱动。没有时钟,电路就无法步调一致地工作。

  2. 精细的能源管理(节能): 并非所有“城市部门”都需要全速运行。例如,待机时CPU可以慢速或停止,而独立看门狗需要低速运行以防系统死机。时钟树通过分频、倍频和门控开关,可以独立地为每个模块提供最合适的速度,并在其空闲时关闭时钟,从而实现极致的能效控制。

  3. 外设与内核的解耦(模块化): 不同的外设(如USB需要精确的48MHz,UART需要特定的波特率)对工作频率有独特要求。时钟树允许它们从不同的时钟源获取信号,让外设独立于CPU核心频率进行配置,大大增加了系统设计的灵活性。

1.2时钟树的结构

以我们开发板的F103c8t6芯片的时钟数为例,我们可以将整个时钟数大体分为三个部分时钟源部分,外设总线,以及一些其他结构

image.png

我们可以将整个时钟树看作一个由水源(时钟源)、主干渠和支流(外设总线)以及水闸和调速器(其他结构)组成的供水系统。

1.2.1 时钟源部分(水源) 这是整个系统的起点,有四个独立的水源:

高速内部时钟(HSI):

相当于一个内置的、不太精确的振荡器,频率为8MHz。

优点:不需要外部元件,上电就能用,启动快。

缺点:精度不高,受温度和电压影响。

用途:可以作为系统时钟的备用源,或者用于不需要高精度的场合。

高速外部时钟(HSE):

相当于一个外接的、高精度的晶振,通常接8MHz。

优点:非常稳定和精确。

缺点:需要外部晶体和两个小电容,成本略高,启动稍慢。

用途:当我们希望系统运行稳定、精确时(比如需要准确的定时或通信),就使用HSE。

低速内部时钟(LSI):

相当于一个内置的、低功耗的慢速振荡器,频率约40kHz。

优点:独立,功耗低,即使在深度睡眠时也能运行。

缺点:精度很差。

用途:主要给独立看门狗(IWDG)和自动唤醒单元(AWU)提供时钟,用于系统监控和低功耗唤醒。

低速外部时钟(LSE):

相当于一个外接的、高精度的慢速晶振,通常为32.768kHz。

优点:精度高,功耗低。

缺点:需要外部元件。

用途:专门给实时时钟(RTC)提供时钟,用于日历、计时等需要长时间精确计时的功能。

1.2.2 外设总线部分(主干渠和支流) 有了水源,我们需要通过渠道将水引到不同的村庄(外设)。STM32内部有两条主要的外设总线,它们就像主干渠和支流:

AHB总线(高级高性能总线):

这是最宽、最快的主干道,连接着CPU核心、内存(Flash和SRAM)、DMA等高速设备。

在STM32F103中,AHB总线通常运行在最高速度(72MHz)。

从AHB总线再分出来两条稍慢一些的总线:APB1和APB2。

APB总线(高级外设总线):

这是连接各种外设的支流,分为APB1和APB2。

APB1:低速外设总线,最大频率为36MHz。连接着大部分普通外设,如定时器2~7、串口2~5、I2C1~2、SPI2等。

APB2:高速外设总线,最大频率为72MHz。连接着一些对速度要求高的外设,如GPIO、ADC、定时器1、SPI1、USART1等。

注意:虽然APB1总线最大频率为36MHz,但挂载在它上面的定时器(TIM2~TIM4)有一个特殊设计:当APB1的预分频系数不为1时,定时器的时钟频率会是APB1总线频率的2倍。这样,即使APB1总线运行在36MHz,定时器仍然可以以72MHz运行,从而获得更高的计时精度。

1.2.3 其他结构(水闸和调速器) 在时钟树中,还有一些重要的结构,它们像水闸和调速器一样,调节着时钟的分配和转换:

PLL(锁相环):

这是一个频率倍增器,可以将低速的时钟源(如8MHz的HSE)倍频到更高的频率(如72MHz)。

我们通常使用HSE(8MHz)作为PLL的输入,然后通过PLL倍频得到72MHz,作为系统时钟(SYSCLK)的来源。

分频器:

在每个总线的入口,都有一个分频器(预分频器)。它可以将上级总线的时钟频率进行分频,以降低下级总线的速度。

例如,AHB总线时钟(HCLK)可以通过分频器得到APB1总线时钟(PCLK1)。如果HCLK是72MHz,我们可以将APB1预分频设置为2,那么PCLK1就是36MHz。

多路选择器(MUX):

在关键时刻,会有多个时钟源可以选择,比如系统时钟(SYSCLK)可以选择HSI、HSE或者PLL输出。多路选择器就像是一个多路开关,选择其中一个作为输出。

门控开关(使能位):

每个外设的时钟都有一个独立的开关(使能位),位于RCC(复位和时钟控制)模块中。当我们不使用某个外设时,可以关闭它的时钟,以节省功耗。

1.2.4一个典型的时钟配置(以72MHz系统时钟为例) 让我们来看一下在Blue Pill开发板(STM32F103C8T6)上,如何配置时钟达到72MHz的系统时钟:

选择时钟源:使用外部8MHz晶振(HSE)作为原始时钟。

倍频:通过PLL将8MHz倍频9倍,得到72MHz。

系统时钟:选择PLL的输出作为系统时钟(SYSCLK),此时整个系统的核心(CPU、内存等)运行在72MHz。

分配:

AHB总线时钟(HCLK)不分频,为72MHz。

APB1总线时钟(PCLK1)预分频为2,得到36MHz(不超过最大限制)。

APB2总线时钟(PCLK2)不分频,为72MHz。

特殊处理:虽然APB1总线时钟为36MHz,但挂载在它上面的定时器(TIM2~TIM4)的时钟会自动倍频2倍,达到72MHz。

二、定时器:STM32 的“多功能工具”

2.1定时器的本质

定时器的本质其实是一个计数器,它随着时钟信号不断累加。 不同频率时钟源会给定时器发出不同速度的信号,定时器接收到信号后会记录接收的次数

image.png

其中有几个关键参数时钟源:定时器"数数"的速度(比如每1微秒数1次),预分频器(Prescaler):决定"数数"的间隔,自动重装载值(ARR):数到多少算一圈(最大值),比较值(CCR):数到某个特定值时做什么事(用于PWM)。

2.2 STM32F103的定时器分类与功能

STM32F103C8T6有11个定时器,分为4个级别:高级定时器,通用定时器,基本定时器和SysTick定时器。

简单对比表

类型数量PWM通道编码器接口互补输出典型用途
高级2个4通道支持支持电机控制
通用4个4通道支持不支持舵机、蜂鸣器
基本2个0通道不支持不支持系统定时
SysTick1个操作系统心跳

2.3 定时器的6大功能

功能1:基础定时(时基)

作用:每隔固定时间做一件事

应用场景:LED闪烁、定时采集传感器数据

工作原理

时钟:1MHz(每微秒计1次数)

设定:数到50000次(50毫秒)触发中断

结果:每50ms执行一次中断函数

功能2:PWM生成

作用:用数字信号控制模拟设备

应用场景:舵机角度、电机速度、LED亮度

工作原理:

周期:20ms(数0~19999) 高电平时间:0.5ms~2.5ms(数500~2500)

数到500之前:输出高电平 → 舵机转到0° 500~2500之间:输出低电平 数完20000次:重新开始

除此之外还有输入捕获,输出比较,编码器接口,定时器串联等功能

2.4定时器功能总结表

功能核心用途常用场景关键配置
基础定时周期性任务LED闪烁、数据采集预分频、ARR
PWM生成模拟控制舵机、电机、LED调光PWM模式、CCR
输入捕获测量时间超声波、红外遥控捕获模式、边沿选择
输出比较精准触发步进电机、方波生成比较模式、CCR
编码器接口位置速度测量电机反馈、角度测量编码器模式
从模式多定时器同步协同控制、精密时序触发源、从模式

2.5如何选择定时器?

根据需求选择:

  1. 需要控制电机正反转 → TIM1/TIM8(高级定时器)

  2. 普通PWM控制(舵机、蜂鸣器) → TIM2~TIM5(通用定时器)

  3. 只需简单定时 → TIM6/TIM7(基本定时器)

  4. 系统延时 → SysTick(已由HAL库管理)

三、PWM 信号:用数字脉冲表达连续比例

3.1 PWM的本质是什么?

PWM(脉宽调制)本质上是一种用数字信号模拟出模拟量效果的巧妙方法。它的核心思想很简单:既然单片机引脚只能输出固定的高电平(如3.3V)和低电平(0V),那么我们通过极高频率地在高低电平之间切换,并精确控制高电平时间在一个周期内的占比,就能让连接的设备“感受到”一个平均电压。例如,如果一个引脚50%的时间输出3.3V,50%的时间输出0V,那么设备感受到的平均电压就是1.65V。这就是PWM的魔法:它用数字开关的通断时间比例,伪装出了电压连续变化的效果。

3.2PWM的关键参数

PWM的精髓由三个关键参数决定:频率占空比振幅频率决定了信号切换的快慢,单位是赫兹(Hz)。频率不能太低,否则设备(如LED、电机)会察觉到闪烁或抖动;也不能过高,否则会产生不必要的开关损耗。不同的设备有其“舒适”的频率范围,例如舵机通常要求精确的50Hz,而电机控制则常用几千到上万赫兹。占空比是PWM控制的“方向盘”,它定义为高电平时间占整个信号周期的百分比。从0%到100%调节占空比,就等效于将平均电压从0平滑地调至最大值,从而实现灯光从熄灭到最亮、电机从停止到全速的连续控制。振幅通常是固定的,即单片机引脚的高电平电压值(如3.3V),它决定了控制的最大力度。

image.png

3.3PWM的使用

以最经典的舵机控制为例,可以完整串联PWM的配置与应用。舵机需要周期为20ms(即50Hz)、高电平脉宽在0.5ms到2.5ms之间的PWM信号来对应0度到180度的角度。假设我们使用STM32F103的72MHz系统时钟,并通过预分频将其调整为1MHz(即每微秒计数一次)。要得到20ms的周期,定时器需要计数20000次,因此ARR应设置为19999。此时,0.5ms的高电平对应计数值500,2.5ms对应2500。我们只需将目标角度按比例映射为500至2500之间的一个CCR值并写入寄存器,定时器硬件就会持续输出精确的PWM波形,驱动舵机稳定地转到指定角度。整个过程,CPU仅在需要改变角度时更新一下CCR值,其余工作全部由定时器硬件自动完成,高效且精准。

总结来说,PWM是连接数字世界与物理模拟世界的桥梁。理解其“以时间比例控制平均效果”的核心原理,掌握频率、占空比与硬件寄存器(ARR、CCR)的对应关系,就能举一反三地驾驭LED调光、电机调速、蜂鸣器音调控制等绝大多数嵌入式控制场景。

image.png

最近更新