
本文概述
STM32定时器是外设中功能最丰富的模块之一,除了基本定时中断,还支持PWM输出、输入捕获、输出比较、单脉冲模式、编码器接口、霍尔传感器接口、死区插入和互补输出等高级功能。面试中需要讲清定时器的基本结构(时基单元、捕获/比较通道、预分频器、自动重装载寄存器)、PWM输出配置(占空比、频率、对齐模式、互补输出+死区)、输入捕获(测量脉冲宽度/频率/占空比、捕获中断、DMA)、编码器接口(正交编码器计数、方向判断、倍频)、以及定时器级联和同步。
核心要点
STM32定时器分类:基本定时器(TIM6/7,只有定时中断和DAC触发)、通用定时器(TIM2-5,4个捕获/比较通道,支持PWM/输入捕获/编码器)、高级定时器(TIM1/8,带死区插入、互补输出、刹车输入,适合电机控制)
定时器时基:计数频率=系统时钟/((PSC+1)×(ARR+1)),PSC是预分频器(16位),ARR是自动重装载值(16位或32位,TIM2/5是32位)
PWM输出:频率=定时器时钟/((PSC+1)×(ARR+1)),占空比=CCR/(ARR+1)×100%;支持PWM模式1/2、边沿对齐/中心对齐、互补输出(CH和CHN)+死区插入(高级定时器)
输入捕获:测量外部信号的脉冲宽度、频率、占空比;支持上升沿/下降沿/双边沿捕获、捕获预分频器(每N个事件捕获一次)、捕获DMA(连续捕获不丢数据);测频率用两个捕获值之差,测脉宽用上升沿到下降沿的捕获值之差
编码器接口:定时器配置为编码器模式,CH1和CH2接正交编码器的A/B相,自动计数并判断方向;支持编码器模式1/2/3(仅TI1计数/仅TI2计数/TI1和TI2都计数,即1倍/2倍/4倍频),配合第三个通道测编码器Z相(索引脉冲)
STM32定时器除了定时中断,还有哪些高级应用?PWM输出、输入捕获、编码器接口怎么配置?请结合实际项目说明。
面试官考察点
面试官考察的是定时器高级功能的实际应用能力。
定时器结构理解:是否知道不同定时器的区别(基本/通用/高级),时基单元的计算
PWM输出:能否配置PWM频率和占空比,知道互补输出和死区,知道中心对齐模式的应用
输入捕获:能否用输入捕获测量频率/脉宽/占空比,知道捕获中断和DMA的使用,知道测量误差来源
编码器接口:是否知道编码器模式的配置,A/B相正交解码,倍频,方向判断,Z相处理
项目经验:能否结合实际项目(电机控制、调光、测速、脉冲测量)说明定时器的应用,有没有踩过坑
回答思路
按"定时器分类→时基计算→PWM输出→输入捕获→编码器接口→其他高级功能"六层回答:
定时器分类和结构:基本/通用/高级定时器的区别,时基单元组成
时基计算:PSC/ARR的计算,定时频率和PWM频率公式
PWM输出:频率/占空比配置,模式1/2,边沿/中心对齐,互补输出+死区
输入捕获:测频率/脉宽/占空比的方法,捕获中断/DMA,误差分析
编码器接口:正交编码器A/B相,编码器模式1/2/3,倍频,方向,Z相
其他功能:输出比较、单脉冲、定时器级联同步、霍尔接口
参考回答
STM32定时器的高级应用我一般从六个层面讲。
第一,定时器分类和基本结构。STM32的定时器分三类:1) 基本定时器(TIM6、TIM7):功能最简单,只有定时中断和DAC触发输出,没有捕获/比较通道,不能做PWM或输入捕获。主要用于简单延时、定时中断、触发DAC。2) 通用定时器(TIM2-TIM5,以及部分型号的TIM9-TIM14):功能最丰富,有4个捕获/比较通道(CH1-CH4),支持:a) 定时中断;b) PWM输出(所有通道);c) 输入捕获(所有通道);d) 输出比较;e) 编码器接口(CH1+CH2);f) 霍尔传感器接口(CH1+CH2+CH3);g) 单脉冲模式。TIM2和TIM5是32位计数器(其他是16位),适合需要大计数范围的应用(如长时间定时、高精度测量)。3) 高级定时器(TIM1、TIM8,部分型号有TIM20):在通用定时器基础上增加了:a) 互补输出(CH1和CH1N、CH2和CH2N等,6路输出);b) 死区时间插入(Dead-time insertion,防止上下桥臂直通);c) 刹车输入(Break input,故障时快速关闭输出,保护功率器件);d) 重复计数器(Repetition counter,用于PWM突发模式)。高级定时器主要用于电机控制(三相逆变桥的6路PWM)、开关电源(互补PWM+死区)等需要安全保护的功率应用。定时器的基本结构(时基单元):a) 预分频器(PSC):16位,对定时器时钟分频,计数频率=定时器时钟/(PSC+1);b) 计数器(CNT):实际计数的寄存器,16位或32位;c) 自动重装载寄存器(ARR):计数到ARR后溢出(或重装),决定定时周期;d) 捕获/比较寄存器(CCR1-CCR4):输入捕获时存捕获值,PWM输出时决定占空比。定时频率公式:f_update = f_tim / ((PSC+1) × (ARR+1))。例如定时器时钟84MHz,要1ms定时中断,PSC=83(分频到1MHz),ARR=999(1MHz/1000=1kHz=1ms)。
第二,PWM输出。PWM(脉冲宽度调制)是定时器最常用的高级功能,用于电机调速、LED调光、开关电源、DAC模拟输出(加RC滤波)等。配置要点:1) PWM频率:f_PWM = f_tim / ((PSC+1) × (ARR+1))。频率选择取决于应用:电机控制通常10-20kHz(高于人耳听觉范围,减少噪音),LED调光通常1-10kHz(高于人眼闪烁频率),开关电源通常几十kHz到几MHz。2) 占空比:Duty = CCR / (ARR+1) × 100%。CCR是捕获/比较寄存器的值,修改CCR就可以实时改变占空比。例如ARR=999(PWM频率=定时器时钟/1000),CCR=500时占空比50%,CCR=250时占空比25%。3) PWM模式:a) 模式1:CNTCCR时输出无效(低)——最常用;b) 模式2:CNTCCR时输出有效——和模式1反相。4) 对齐模式:a) 边沿对齐(Edge-aligned):计数器从0递增到ARR,然后重装,PWM波形左对齐;b) 中心对齐(Center-aligned):计数器从0递增到ARR再递减回0,PWM波形中心对称。中心对齐模式的PWM谐波分量更小,适合电机控制和开关电源(减少纹波和EMI),但频率是边沿对齐的一半(因为一个周期包含递增+递减)。5) 互补输出+死区(高级定时器):高级定时器的每个通道可以输出互补的PWM(CHx和CHxN反相),用于驱动半桥或全桥的上下管。死区时间(Dead-time)插入确保上下管不会同时导通(防止直通短路),死区时间由BDTR寄存器的DTG位配置,通常几百ns到几μs,取决于功率器件的开关速度。6) PWM突发(Burst)和重复计数器:高级定时器的重复计数器可以设置每N个PWM周期才产生一次更新中断,用于电机控制的FOC算法(每N个PWM周期执行一次电流采样和控制算法)。7) 实际配置步骤(HAL库):a) 使能定时器时钟;b) 配置GPIO为定时器复用功能(AF);c) 配置定时器时基(PSC、ARR、对齐模式);d) 配置PWM通道(模式、占空比、极性);e) 高级定时器配置死区和刹车;f) 启动PWM(HAL_TIM_PWM_Start);g) 需要实时改变占空比时调用__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_x, duty)。
工程经验:PWM输出最常见的坑:1) 占空比计算错误——CCR/(ARR+1)不是CCR/ARR,ARR=999时CCR=999是100%占空比(不是99.9%);2) 高级定时器互补输出忘记使能(HAL_TIM_PWM_Start只启动主通道,互补通道要用HAL_TIMEx_PWMN_Start);3) 死区时间设置太小导致上下管直通(烧功率管),太大导致效率降低,要根据器件开关速度合理设置;4) 中心对齐模式的频率计算错误(是边沿对齐的一半);5) 修改占空比时没有考虑更新事件(有些定时器CCR有预装载,修改后要等下一个更新事件才生效,需要时可以立即生效)。
第三,输入捕获。输入捕获用于测量外部信号的参数(频率、周期、脉冲宽度、占空比),是定时器的另一个核心高级功能。原理:当外部信号发生指定的跳变(上升沿/下降沿/双边沿)时,定时器把当前计数器的值锁存到CCR寄存器,并产生捕获中断(或DMA请求)。通过两次捕获值之差可以计算时间间隔。1) 测量频率/周期:方法一(周期测量法,适合低频):配置通道1为上升沿捕获,每次上升沿捕获CNT值,两次捕获值之差就是信号周期(乘以计数周期得到时间),频率=1/周期。方法二(脉冲计数法,适合高频):配置定时器为从模式(外部时钟源),外部信号作为定时器时钟,在固定时间窗口(如1秒)内计数值就是频率。2) 测量脉冲宽度(高电平或低电平持续时间):配置通道1为双边沿捕获(或用两个通道:通道1上升沿、通道2下降沿),上升沿捕获值为t1,下降沿捕获值为t2,脉冲宽度=t2-t1(乘以计数周期)。或者用PWM输入模式(PWM Input)——一个定时器的两个通道自动测量一个PWM信号的周期和占空比,硬件自动计算,不需要软件干预。3) 测量占空比:用PWM输入模式,或分别测量周期和高电平时间,占空比=高电平时间/周期×100%。4) 捕获预分频器:可以设置每N个事件才捕获一次(1/2/4/8),用于高频信号(减少中断频率)或测量平均。5) 捕获DMA:连续捕获时(如测量多个脉冲),用DMA把捕获值自动搬到内存,不需要CPU干预,避免丢数据。配置HAL_TIM_IC_Start_DMA。6) 测量误差分析:a) 量化误差:捕获值是整数,误差±1个计数周期,计数频率越高误差越小;b) 中断延迟:用中断读取捕获值时,中断响应延迟会导致误差(特别是高频信号),用DMA或PWM输入模式可以减少;c) 计数器溢出:测量长周期时计数器可能溢出(超过ARR),需要处理溢出中断(记录溢出次数,计算总计数=溢出次数×(ARR+1)+当前值);d) 信号抖动:被测信号有抖动时,单次测量误差大,可以多次测量取平均或用滤波。7) 实际配置步骤(HAL库):a) 使能定时器和GPIO时钟;b) 配置GPIO为定时器复用输入;c) 配置定时器时基(PSC、ARR,计数频率要足够高以保证测量精度);d) 配置输入捕获通道(捕获极性:上升沿/下降沿/双边沿、捕获预分频器);e) 启动输入捕获(HAL_TIM_IC_Start_IT或HAL_TIM_IC_Start_DMA);f) 在捕获中断或DMA完成回调中读取CCR值(HAL_TIM_ReadCapturedValue),计算时间参数。
第四,编码器接口。编码器接口是定时器专门为正交编码器(增量式编码器)设计的功能,用于测量旋转位置和速度。正交编码器有A、B两相输出,相位差90度,根据A/B相的相位关系可以判断旋转方向,脉冲数对应旋转角度。定时器编码器模式自动完成A/B相解码和计数,不需要CPU干预。1) 编码器模式:a) 编码器模式1:仅在TI1(CH1)的边沿计数,TI2(CH2)的电平决定计数方向——A相每来一个脉冲计数一次(1倍频);b) 编码器模式2:仅在TI2的边沿计数,TI1的电平决定方向——B相每来一个脉冲计数一次(1倍频);c) 编码器模式3:TI1和TI2的边沿都计数(A相上升/下降+B相上升/下降=4个边沿/周期),即4倍频——这是最常用的模式,分辨率最高。2) 方向判断:定时器硬件自动判断方向——A相超前B相90度时正转(递增计数),B相超前A相90度时反转(递减计数)。方向状态可以从CR1寄存器的DIR位读取,或用方向中断。3) 位置计算:计数器CNT的值就是编码器的位置(相对于初始位置的脉冲数)。旋转角度=CNT / (编码器线数×倍频系数) × 360度。例如1000线编码器,4倍频模式,每圈4000个计数,CNT=1000时角度=90度。4) 速度计算:在固定时间间隔(如10ms)读取CNT的变化量,速度=ΔCNT/Δ时间。或者用第三个通道(CH3)测量编码器Z相(索引脉冲,每圈一个脉冲)的周期,计算转速。5) Z相(索引脉冲)处理:正交编码器通常还有Z相(Index),每圈输出一个脉冲,用于归零和绝对位置参考。可以用定时器的第三个通道(CH3)做输入捕获,捕获Z相脉冲,在Z相中断时把CNT清零(归零),或记录Z相位置用于校准。6) 编码器接线和滤波:a) A相接CH1,B相接CH2,Z相接CH3(或另一个定时器);b) 编码器信号通常是差分输出(A+/A-、B+/B-、Z+/Z-),长距离传输时需要用差分接收芯片(如AM26LS32)转为单端信号再接STM32;c) 编码器信号可能有抖动或毛刺,可以用定时器的输入滤波器(ICF位,数字滤波,采样N次确认才有效),或外部RC滤波;d) 编码器电源和地要接对,注意编码器的供电电压(5V或3.3V)。7) 实际配置步骤(HAL库):a) 使能定时器和GPIO时钟;b) 配置CH1/CH2的GPIO为定时器复用输入(可选上拉/下拉);c) 配置定时器时基(PSC通常设为0,ARR设为最大值如65535,因为编码器模式下CNT是位置计数器);d) 配置编码器模式(HAL_TIM_Encoder_Init,设置EncoderMode=TIM_ENCODERMODE_TI12即4倍频);e) 配置CH1/CH2的输入极性和滤波器;f) 启动编码器接口(HAL_TIM_Encoder_Start);g) 读取CNT值获得位置(__HAL_TIM_GET_COUNTER),定期计算速度,需要时用CH3捕获Z相。
第五,其他高级功能。1) 输出比较(Output Compare):当CNT等于CCR时,输出引脚翻转/置位/清零,用于产生精确延时的脉冲、相位移动的信号、多个同步信号。和PWM的区别:输出比较是单次事件(CNT=CCR时动作一次),PWM是连续的周期波形。2) 单脉冲模式(One-Pulse Mode):定时器触发后产生一个精确宽度的单脉冲,然后停止。用于触发外部设备(如ADC采样、相机快门、激光器脉冲),脉冲宽度由CCR决定,延迟由另一个CCR决定。3) 定时器级联和同步:多个定时器可以级联(一个定时器的输出作为另一个的时钟或触发),实现32位/64位定时、复杂的定时序列。例如TIM2(主)的更新事件触发TIM3(从),实现精确的延时序列。4) 霍尔传感器接口(Hall Sensor Mode):高级定时器或部分通用定时器支持霍尔传感器模式,CH1/CH2/CH3接三相霍尔传感器,定时器自动解码霍尔信号并产生6步换相时序,用于无刷直流电机(BLDC)控制。5) 定时器触发ADC:定时器的更新事件或捕获/比较事件可以触发ADC开始转换(通过TRGO输出),实现精确时间的ADC采样(如电机控制中在PWM周期的特定时刻采样电流),不需要CPU干预,延迟极小。6) 定时器触发DAC:定时器的更新事件可以触发DAC输出,产生任意波形(如正弦波、三角波),配合DMA可以实现DDS(直接数字频率合成)。
面试官可能追问
追问 1:PWM输出时,怎么实现精确的频率和占空比?ARR和CCR怎么计算?
PWM频率和占空比的计算是定时器应用的基础,要注意几个细节:1) PWM频率公式:f_PWM = f_tim / ((PSC+1) × (ARR+1)),其中f_tim是定时器的时钟频率(注意不是系统时钟,APB1定时器时钟可能是APB1时钟的2倍,如STM32F4的APB1定时器时钟是84MHz,APB2是168MHz)。2) 占空比公式:Duty = CCR / (ARR+1) × 100%。注意分母是ARR+1不是ARR——因为计数器从0计数到ARR,总共有ARR+1个计数周期。例如ARR=999(计数0-999,共1000个周期),CCR=500时占空比=500/1000=50%,CCR=999时占空比=999/1000=99.9%(不是100%),CCR=1000时才是100%(但CCR不能超过ARR+1,有些定时器支持CCR=ARR+1实现100%占空比,需要查手册)。3) 计算步骤:a) 确定需要的PWM频率f_PWM;b) 选择PSC(预分频器),让计数频率f_cnt=f_tim/(PSC+1)在合理范围(通常1MHz-100MHz,太高分辨率低,太低精度差);c) 计算ARR = f_cnt/f_PWM - 1;d) 根据需要的占空比计算CCR = Duty × (ARR+1) / 100%。4) 举例:STM32F4,TIM2时钟84MHz,要20kHz PWM用于电机控制:a) 选PSC=0(计数频率84MHz);b) ARR=84MHz/20kHz-1=4200-1=4199;c) 50%占空比时CCR=0.5×4200=2100。5) 分辨率:PWM占空比的分辨率=log2(ARR+1)位。ARR=4199时分辨率约12位(2^12=4096),足够大多数应用。如果需要更高分辨率(如16位),需要降低PWM频率或提高定时器时钟。6) 注意事项:a) ARR和CCR都有预装载寄存器(ARRPE和CCPE位),使能后修改的值在下一个更新事件才生效,避免波形中间突变;b) 中心对齐模式的PWM频率是边沿对齐的一半(因为计数器递增+递减),计算时要注意;c) 高级定时器需要使能主输出(MOE位,BDTR寄存器),否则PWM不输出,HAL库中HAL_TIM_PWM_Start会自动设置;d) 修改占空比时CCR不能超过ARR+1,否则可能产生异常波形。
追问 2:输入捕获测量频率时,计数器溢出了怎么办?怎么处理长周期测量?
输入捕获测量长周期信号(低频)时,计数器可能在两次捕获之间溢出(CNT从ARR回到0),导致两次捕获值之差不是真实的周期,需要处理溢出。处理方法:1) 溢出中断法:a) 使能定时器更新中断(溢出中断,HAL_TIM_Base_Start_IT);b) 在溢出中断中记录溢出次数(overflow_count++);c) 捕获中断中计算总计数=overflow_count×(ARR+1)+(capture_value - previous_capture_value)(注意处理边界情况);d) 捕获后重置overflow_count=0。这种方法简单,但溢出中断会增加CPU负担(特别是ARR设得小时溢出频繁)。2) 增大ARR法:把ARR设为最大值(16位定时器65535,32位定时器如TIM2/5可以设为0xFFFFFFFF),这样计数器溢出周期很长,大多数低频信号不会溢出。例如84MHz时钟、ARR=65535时,溢出周期=65536/84MHz≈780μs,可以测量频率>1.3kHz的信号;如果是32位定时器,溢出周期=2^32/84MHz≈51秒,几乎不会溢出。这是最简单有效的方法——测量低频信号时尽量用32位定时器(TIM2/TIM5),或把ARR设大。3) 从模式复位法:配置定时器为从模式,在捕获事件(如上升沿)时自动复位计数器(复位模式,Slave Mode=Reset),这样每次捕获时CNT自动清零,下一次捕获的值就是周期(不需要处理溢出,因为计数器在每次上升沿都复位了)。这种方法最简洁,硬件自动处理,不需要溢出中断。配置:a) 配置通道1为上升沿捕获;b) 配置从模式为复位模式(SMS=100),触发源为TI1(TS=101);c) 每次上升沿时CNT复位,捕获值就是上一个周期的长度。注意:这种方法只能测量周期(上升沿到上升沿),不能测量脉冲宽度,且复位模式下计数器在捕获时清零,需要确保捕获值在ARR范围内。4) DMA+溢出记录法:用DMA连续捕获,同时用另一个定时器或溢出中断记录溢出次数,在DMA完成后统一计算。适合连续测量多个周期。5) 选择合适的计数频率:测量低频信号时可以降低计数频率(增大PSC),这样计数增长慢,不容易溢出,但分辨率降低。要在溢出风险和分辨率之间取折中。实际工程中,我一般优先用32位定时器(TIM2/TIM5)+ 大ARR + 从模式复位,这样最简单可靠,不需要处理溢出。如果只能用16位定时器,就用溢出中断法或从模式复位法。
追问 3:编码器接口4倍频模式下,怎么计算转速?M法和T法有什么区别?
编码器测速是电机控制和运动控制的基础,常用的方法有M法(频率法)、T法(周期法)和M/T法。1) M法(频率法/定时计数法):在固定的时间窗口T内(如10ms、100ms),读取编码器的脉冲数ΔN,转速n=ΔN/(T×N_ppr)×60(rpm),其中N_ppr是编码器每转脉冲数(4倍频后是线数×4)。M法的特点:a) 适合高速(脉冲频率高,固定时间内脉冲数多,量化误差小);b) 低速时误差大(固定时间内脉冲数少,±1个脉冲的误差占比大);c) 实现简单,只需要定时读取CNT差值。2) T法(周期法/脉冲计时法):测量两个相邻脉冲(或Z相脉冲)之间的时间间隔ΔT,转速n=60/(N_ppr×ΔT)(rpm)。用定时器输入捕获测量脉冲周期,计数频率越高精度越高。T法的特点:a) 适合低速(脉冲周期长,测量时间精度高,相对误差小);b) 高速时误差大(脉冲周期短,定时器量化误差占比大);c) 需要输入捕获,实现稍复杂。3) M/T法(混合法):结合M法和T法,在固定时间窗口内同时计数脉冲数(M法)和高频时钟数(T法),转速n=(f_clk×N_pulse)/(N_clk×N_ppr)×60,其中f_clk是高频时钟频率,N_pulse是窗口内编码器脉冲数,N_clk是窗口内高频时钟计数。M/T法在高速和低速都有较高精度,是最常用的测速方法,但实现最复杂(需要同时计数脉冲和时钟,处理窗口同步)。4) 4倍频模式下的计算:4倍频模式(编码器模式3)下,编码器每圈的计数数=线数×4。例如1000线编码器,4倍频后每圈4000个计数。M法:10ms内计数ΔN=400(即0.1圈),转速=0.1/0.01×60=600rpm。T法:两个相邻计数脉冲(4倍频后每圈4000个脉冲)的时间间隔ΔT=25μs(对应4000×25μs=100ms/圈=600rpm),转速=60/(4000×25×10^-6)=600rpm。5) 实际应用选择:a) 高速应用(如电机额定转速>1000rpm)→M法,简单可靠;b) 低速应用(如<100rpm)或需要高精度低速测速→T法或M/T法;c) 宽速度范围(如伺服电机,从0到额定转速)→M/T法,全速度范围精度高;d) 简单应用(如转速显示、过零检测)→M法足够。6) 注意事项:a) 编码器信号有抖动时,测速会有波动,可以加滤波(滑动平均、低通滤波、卡尔曼滤波);b) 4倍频模式下A/B相的相位关系必须正确(90度±容差),否则方向判断错误或计数异常;c) Z相用于归零和绝对位置校准,上电时先找Z相(回零),然后用相对计数;d) 长距离传输时编码器差分信号需要用差分接收芯片(如AM26LS32),并注意终端匹配(120Ω)。
追问 4:高级定时器的互补输出和死区怎么配置?死区时间怎么计算?
高级定时器(TIM1/TIM8)的互补输出+死区是电机控制和开关电源的关键功能,配置和计算如下:1) 互补输出原理:每个通道(CH1-CH4)有两个输出:CHx(主输出)和CHxN(互补输出),两者波形反相(CHx高时CHxN低,反之)。用于驱动半桥的上下管(如MOSFET/IGBT),上管用CHx,下管用CHxN。2) 死区时间(Dead-time):由于功率器件的开关延迟(开通延迟ton、关断延迟toff),上下管不能同时导通(否则电源直通短路,烧毁器件)。死区时间就是在上下管切换时,两个管子都关断的时间间隔,确保一个管子完全关断后另一个才开通。死区时间插入在CHx和CHxN的切换沿之间——CHx从高变低后,延迟死区时间,CHxN才从低变高;反之亦然。3) 死区时间计算:死区时间DT需要大于功率器件的关断延迟(toff)加上开关时间裕量。通常DT = toff_max + 裕量(通常100-500ns)。例如:MOSFET的toff=100ns,取DT=200-500ns;IGBT的toff=1-2μs,取DT=2-3μs。死区时间太小会导致上下管直通(短路、烧器件),太大会导致输出波形失真、效率降低(死区期间没有输出)、谐波增大。所以死区时间要在安全和效率之间取折中,通常取器件toff的1.5-2倍。4) 死区寄存器配置:高级定时器的BDTR(Break and Dead-Time Register)寄存器的DTG[7:0]位配置死区时间,分四个范围:a) DTG[7]=0:DT = DTG[6:0] × t_dtg,t_dtg=t_tim/256(t_tim是定时器时钟周期),最大127×t_dtg;b) DTG[7:6]=10:DT = (64+DTG[5:0]) × 2×t_dtg,最大127×2×t_dtg;c) DTG[7:5]=110:DT = (32+DTG[4:0]) × 8×t_dtg,最大63×8×t_dtg;d) DTG[7:5]=111:DT = (32+DTG[4:0]) × 16×t_dtg,最大63×16×t_dtg。HAL库中用sDeadTime.DeadTime = 值(0-255)配置,库函数会自动计算。5) 配置步骤(HAL库):a) 使能高级定时器时钟和GPIO时钟;b) 配置CHx和CHxN的GPIO为定时器复用功能(AF);c) 配置定时器时基(PSC、ARR、PWM频率);d) 配置PWM通道(模式、占空比、极性);e) 配置死区时间(sMasterConfig DeadTime,或HAL_TIMEx_ConfigDeadTime);f) 配置刹车输入(可选,Break功能,故障时关闭输出);g) 启动PWM和互补PWM(HAL_TIM_PWM_Start启动CHx,HAL_TIMEx_PWMN_Start启动CHxN);h) 使能主输出(MOE位,HAL库自动设置,或手动__HAL_TIM_MOE_ENABLE)。6) 刹车(Break)功能:高级定时器有刹车输入(BKIN),当刹车信号有效(通常低电平或高电平,可配置)时,定时器立即关闭所有输出(置为安全状态,如高阻或固定电平),用于故障保护(如过流、过压、过温时快速关断功率器件,防止损坏)。刹车功能可以配置为立即生效(异步,不等待时钟)或同步生效,刹车后输出状态可配置(高阻/低/高)。7) 注意事项:a) 互补输出必须使能主输出(MOE=1),否则没有输出;b) 死区时间要根据实际功率器件计算,不能照搬参考值;c) 上下管的栅极驱动电路也要有死区(有些驱动芯片自带死区),和定时器死区配合;d) 调试时先用小占空比和大死区,确认正常后再调整;e) 用示波器同时看CHx和CHxN波形,确认死区时间正确、没有直通。
追问 5:STM32定时器的输入捕获和输出比较有什么区别?分别用在什么场景?
输入捕获(Input Capture)和输出比较(Output Compare)是定时器捕获/比较通道的两种工作模式,方向相反,应用场景不同:1) 输入捕获:a) 方向:外部信号→定时器(输入),定时器被动测量外部信号;b) 原理:当外部信号发生指定跳变(上升沿/下降沿/双边沿)时,定时器把当前CNT值锁存到CCR,产生捕获中断或DMA请求;c) 用途:测量外部信号的频率、周期、脉冲宽度、占空比、相位差;解码脉冲信号(如红外遥控、超声波回波检测);测量事件发生的时间(如按键按下时间、传感器响应时间);编码器Z相捕获;d) 关键寄存器:CCMR(捕获模式、输入滤波器、预分频器)、CCER(捕获极性、使能)、CCR(捕获值,只读);e) 场景举例:超声波测距(测量发射到回波的时间)、红外遥控解码(测量脉冲宽度)、电机转速测量(输入捕获测编码器脉冲周期)、频率计(测量信号频率)、占空比测量(PWM输入模式)。2) 输出比较:a) 方向:定时器→外部引脚(输出),定时器主动产生信号;b) 原理:当CNT等于CCR时,输出引脚执行指定动作(翻转/置位/清零/冻结),可以产生精确时序的信号;c) 用途:产生精确延时的脉冲(单脉冲模式)、产生相位移动的方波、产生多个同步或相位差的信号、产生特定时序的触发信号(如触发ADC、触发外部设备)、PWM输出(PWM是输出比较的特殊形式,连续周期波形);d) 关键寄存器:CCMR(输出比较模式:冻结/置位/清零/翻转/PWM模式1/PWM模式2)、CCER(输出极性、使能)、CCR(比较值,可写);e) 场景举例:产生多路相位差的方波(如步进电机驱动时序、三相正弦波)、单脉冲触发(相机快门、激光器脉冲、ADC采样触发)、精确延时输出(在指定时间后翻转引脚)、PWM输出(电机调速、LED调光、开关电源,这是输出比较最常用的模式)。3) 区别总结:a) 方向相反:输入捕获是输入(测外部),输出比较是输出(产生信号);b) CCR角色不同:输入捕获时CCR是捕获值(硬件写入,软件读取),输出比较时CCR是比较值(软件写入,硬件比较);c) 中断不同:输入捕获产生捕获中断(CCxIF),输出比较产生比较中断(也是CCxIF,但原因不同);d) 应用场景不同:输入捕获用于测量,输出比较用于产生信号。4) PWM和输出比较的关系:PWM模式是输出比较的特殊模式——输出比较的模式1/2是PWM模式,CNTCCR时输出另一种电平,连续产生周期波形。而普通输出比较模式(翻转/置位/清零)是单次事件(CNT=CCR时动作一次,之后保持)。所以PWM是输出比较的一种连续周期应用。5) 实际选择:a) 需要测量外部信号参数(频率/脉宽/周期)→输入捕获;b) 需要产生精确时序的输出信号(脉冲/方波/触发)→输出比较;c) 需要产生连续周期的可调占空比方波→PWM(输出比较的PWM模式);d) 两者可以同时使用——一个定时器的不同通道可以分别配置为输入捕获和输出比较(如CH1输入捕获测频率,CH2输出比较产生触发信号)。
常见失分表达
✗ 定时器就是做定时中断的,其他功能用不到 — STM32定时器功能丰富,PWM输出、输入捕获、编码器接口、互补输出+死区等是电机控制、电源、测量的核心功能,只会定时中断说明对定时器理解很浅
✗ PWM占空比=CCR/ARR,频率=时钟/(PSC×ARR) — 占空比公式是CCR/(ARR+1)不是CCR/ARR,频率公式是时钟/((PSC+1)×(ARR+1))不是PSC×ARR,差一个+1会导致计算错误,特别是ARR小时误差大
✗ 输入捕获直接读CCR就行,不用管溢出 — 测量长周期信号时计数器会溢出,不处理溢出会得到错误的周期值,需要用32位定时器、大ARR、从模式复位或溢出中断处理
✗ 编码器A/B相接反了没关系,软件改方向就行 — A/B相接反会导致方向判断错误、计数异常(可能跳变),4倍频模式下相位关系必须正确,接反了要硬件调换或在软件中仔细处理,不能简单改方向标志
准备动作
1
复习STM32定时器分类和结构:基本/通用/高级定时器的区别,时基单元(PSC/CNT/ARR/CCR)
2
练习PWM输出配置:频率和占空比计算,HAL库配置步骤,互补输出+死区配置(高级定时器)
3
练习输入捕获:测量频率/脉宽/占空比的方法,PWM输入模式,溢出处理,DMA捕获
4
学习编码器接口:正交编码器A/B相,编码器模式1/2/3(1/2/4倍频),方向判断,Z相处理,M法/T法测速
5
准备一个定时器高级应用项目:如电机控制(PWM+编码器+死区)、超声波测距(输入捕获+PWM触发)、调光(PWM)
核心关键词
STM32定时器PWM输出输入捕获编码器接口互补输出死区时间正交编码器频率测量电机控制嵌入式单片机
声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉