ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32 TIM 定时器学习笔记

STM32 TIM 定时器学习笔记 TIM 定时器基础一、定时器前面实现的延时用的是软件空转while(i--);有两个缺点占用 CPUCPU 空转期间不能做任何其他事不精确延时时长受主频、编译优化等级影响无法精确到微秒级。TIM 定时器是芯片内置的硬件外设靠硬件时钟自动计数全程不占用 CPU精确计数频率由晶振/时钟树决定可精确到微秒一个定时器可实现定时中断、PWM 输出、输入捕获、编码器接口等多种功能。二、TIM 定时器的基本结构时钟源72MHz │ ▼ 预分频器 PSC ──► 计数器 CNT ──► 计到 ARR 时溢出 ──► 更新事件/中断 (分频降速) (每来一个脉冲1) (自动重装载) │ ▼ 可触发定时中断 / 输出比较 / 输入捕获部件作用类比时钟源定时器计数的基础时钟内部 RCC 时钟通常 72MHz秒表的上链动力预分频器 PSC对时钟分频PSC 越大计数越慢秒表刻度每格代表多久计数器 CNT每来一个时钟脉冲 1可读/可写秒表的当前读数自动重装载寄存器 ARRCNT 计到 ARR 后清零重新计数形成周期秒表走到 60 秒归零更新事件溢出时刻产生的事件可触发中断秒表响铃计数频率与定时周期计算计数频率 f_cnt 时钟频率 / (PSC 1) 定时周期 T (ARR 1) / f_cnt (PSC1) × (ARR1) / 时钟频率例题72MHz 时钟要定时 1 秒PSC 7199 → 分频 7200 → f_cnt 72M / 7200 10kHz每 0.1ms 计一次 ARR 9999 → 计 10000 次溢出 → T 10000 × 0.1ms 1 秒记忆PSC 决定每格多快ARR 决定走多少格归零两者乘积决定总时间。三、STM32 定时器资源与总线定时器总线位宽特点TIM1、TIM8APB216 位高级定时器带死区/刹车PWM 功能最强TIM2~TIM5APB116 位通用定时器最常用功能齐全TIM6、TIM7APB116 位基本定时器仅定时TIM2、TIM5APB132 位可选 32 位计数范围更大总线记忆TIM1/8 在 APB2和 GPIO 同总线TIM2~7 在 APB1。RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2~7 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // TIM1/8四、TIM 初始化结构体总览TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_Prescaler 7199; // PSC 预分频 TIM_InitStructure.TIM_CounterMode TIM_CounterMode_Up; // 计数模式Up 向上/Down 向下 TIM_InitStructure.TIM_Period 9999; // ARR 自动重装载 TIM_InitStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频滤波用一般 DIV1 TIM_TimeBaseInit(TIM2, TIM_InitStructure);三个计数模式TIM_CounterMode_Up向上计数0 → ARR → 溢出TIM_CounterMode_Down向下计数ARR → 0 → 溢出TIM_CounterMode_CenterAligned中央对齐上下往返五、 TIM 定时中断1. 功能用定时器产生周期性中断每到一个周期如 1 秒CPU 自动进入中断服务函数执行任务。常用于定时刷新、系统计时、周期采样。2. 配置流程五步① 选择时钟源内部时钟默认 ② 配置 PSC 分频 ARR 重装载定时间隔 ③ 使能更新中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE) ④ 配置 NVIC使能中断 优先级 ⑤ 启动定时器 TIM_Cmd(TIM2, ENABLE) ⑥ 编写中断服务函数清标志3. 时钟源选择TIM_InternalClockConfig(TIM2); // 内部时钟默认一般不用写 TIM_ETRClockMode2Config(...); // 外部时钟见 6-24. 中断服务函数void TIM2_IRQHandler(void) // 函数名固定从启动文件里复制 { if (TIM_GetITStatus(TIM2, TIM_IT_Update) SET) // 确认是更新中断 { // 到点要执行的任务 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除标志必须 } }六、定时器定时中断 定时器外部时钟1. 定时器外部时钟除了内部时钟定时器还能用外部信号作为计数时钟外部脉冲接定时器的ETR 引脚如 TIM2 的 ETR 是 PA0每来一个脉冲CNT 1计到 ARR 溢出触发中断用途对未知频率的脉冲信号计数如测电机编码器脉冲数。// 外部时钟模式配置每来一个上升沿计数一次 TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, // 外部触发预分频不预分频 TIM_ExtTRGPolarity_NonInverted, // 极性上升沿有效 0x00); // 滤波2. 与内部时钟定时中断的对比内部时钟外部时钟计数源芯片内部 72MHz外部 ETR 脉冲定时间隔确定PSC/ARR 决定取决于外部脉冲频率用途定时、周期性任务外部事件计数七、TIM 输出比较PWM 原理1. PWMPWMPulse Width Modulation脉冲宽度调制输出一个频率固定的方波通过改变**高电平所占的比例占空比**控制输出平均电平。一个周期内 高电平 ████████░░░░░░ 低电平 └────────占空比────────┘ 占空比 高电平时间 / 周期 × 100%占空比的应用LED 亮度占空比越大越亮呼吸灯舵机角度不同占空比对应不同角度直流电机占空比越大转速越快。2. 输出比较寄存器 CCR 与 PWM 产生计数器 CNT 和比较寄存器CCR实时比较CNT CCR→ 输出高电平CNT ≥ CCR→ 输出低电平改变 CCR 即可改变占空比实现 PWM。PWM 频率 计数频率 / (ARR1) 由 PSC、ARR 决定 PWM 占空比 CCR / (ARR1) 由 CCR 决定3. PWM 模式PWM 模式1CNT CCR 时有效递增时高电平PWM 模式2CNT CCR 时无效与模式1电平相反极性可选TIM_OCPolarity_High/_Low决定有效电平是哪个PWM 配置流程1. 配置定时器PSC、ARR决定 PWM 频率 2. 配置输出比较通道CCR 初值、输出模式 3. 配置 GPIO 为复用推挽输出PWM 由定时器外设控制引脚 4. 使能输出通道 启动定时器4. 输出通道与引脚复用功能PWM 由定时器外设直接控制引脚所以引脚要配成复用推挽输出定时器引脚通道TIM2PA0 / PA1 / PA2 / PA3通道 1/2/3/4TIM3PA6 / PA7 / PB0 / PB1通道 1/2/3/4TIM1PA8 / PA9 / PA10 / PA11通道 1/2/3/4复用推挽GPIO_Mode_AF_PP引脚让给外设管理普通推挽输出不生效。八、 PWM 驱动 LED 呼吸灯 / 舵机 / 直流电机1. 呼吸灯周期 1kHz 左右占空比从 0% 缓慢升到 100% 再降回形成呼吸效果视觉上亮度连续变化。2. 舵机需要50Hz的 PWM周期 20ms占空比 0.5ms~2.5ms 脉宽对应 0°~180°脉宽角度0.5ms占空比 2.5%0°1.5ms占空比 7.5%90°中间2.5ms占空比 12.5%180°舵机接线信号线接 PWM 引脚 VCC GND。PSC/ARR 要配成 50Hz如 72MHz/721MHzARR19999 → 频率 50Hz。3. 直流电机调速PWM 占空比控制平均电压 → 转速正反转用 H 桥电路如 L298N、TB6612切换方向PWM 控制速度频率一般 1kHz~20kHz九、 TIM 输入捕获1. 功能输入捕获通过定时器测量外部信号的频率、周期、脉宽。原理捕获外部信号边沿瞬间的 CNT 值两次捕获的差值就是时间。输入引脚 → 滤波 → 边沿检测 → 捕获 CNT 值存入捕获寄存器 CCR2. 输入捕获结构部件作用输入滤波滤波抖动防止误触发边沿检测选择上升沿/下降沿触发捕获捕获通道边沿到来时把 CNT 的值冻结到 CCR主从触发模式由边沿自动触发 CNT 清零测周期用3. 测周期原理测周法上升沿到达 → 捕获 CNT 值存入 CCR→ 自动清零 CNT 下一次上升沿 → 再捕获 → CCR 的值就是一个周期内计了多少个脉冲 周期 T CCR / 计数频率 频率 f 计数频率 / CCR4. 相关配置函数TIM_ICInitTypeDef 结构体通道、滤波、极性、分频 TIM_ICInit(TIM2, TIM_ICInitStructure); // 输入捕获初始化 TIM_GetCapture1(TIM2); // 读取捕获值 CCR TIM_PWMIConfig(TIM2, ...); // PWMI 模式见 6-6十、输入捕获测频率 PWMI 测频率占空比1. 两种测频率方法方法原理适用测频法闸门时间内数脉冲个数高频信号测周法测一个周期的时间低频信号输入捕获用测周法测出周期 T 再取倒数得频率。2. PWMI 模式测频率 占空比PWMI PWM InputPWM 输入模式主从触发模式 输入捕获一个定时器同时用两个通道通道1 捕获上升沿 → 测周期频率通道2 捕获下降沿由通道1间接映射→ 测高电平时间脉宽占空比 高电平时间 / 周期。上升沿捕获 CNT₁ → 周期 CNT₁ - CNT₀ 下降沿捕获 CNT₂ → 高电平时间 CNT₂ - CNT₀ 占空比 高电平时间 / 周期// PWMI 配置一个 ICInit 结构体同时配置两个通道 TIM_ICInitStructure.TIM_Channel TIM_Channel_1; // 通道1上升沿 TIM_PWMIConfig(TIM2, TIM_ICInitStructure); // 自动配置为主从捕获十一、TIM 编码器接口1. 编码器接口前面 EXTI 章节用中断 读另一相电平判断方向缺点是占用中断、代码复杂。TIM 编码器接口由硬件自动根据 A、B 两相脉冲的相位关系计数A、B 两相相差 90°正转A 超前 B → CNT 自动 1反转B 超前 A → CNT 自动 -1完全硬件计数不占 CPU、不占中断。2. 编码器接口模式配置 CNT 计数模式为编码器模式A、B 相同时接到定时器通道TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, // 模式只计 TI1/TI2/都计 TIM_ICPolarity_Rising, // 极性 TIM_ICPolarity_Rising);3. 编码器接口相关函数TIM_EncoderInterfaceConfig(...); // 配置编码器模式 TIM_GetCounter(TIM3); // 读取 CNT即当前计数 TIM_SetCounter(TIM3, 0); // CNT 清零测增量十二、 编码器接口测速1. 测速原理编码器接口只统计转了多少个脉冲要得到速度还需测时间速度 增量脉冲数 / 时间实现定时器1如 TIM2每秒产生一个更新中断在中断里读取编码器接口计数器TIM3 的 CNT增量把 CNT 清零增量 ÷ 1秒 即为转速结合编码器线数换算成 RPM。转速 RPM (每秒脉冲增量 / 编码器线数) × 602. 双定时器分工定时器作用TIM2编码器接口硬件计数 A/B 相脉冲TIM3基础定时每秒中断取增量算速度
返回列表