十六
回答者
回答于 2026-10-22
使用单片机定时器输出周期5秒、占空比60%的方波信号,核心原理是将一个完整周期拆分为3秒高电平和2秒低电平,利用定时器中断进行精确计时并控制GPIO引脚电平翻转。
实现步骤
- 确定定时基准:根据单片机主频和定时器位宽(如8位、16位),选择合适的预分频器,使定时器产生一个固定的中断周期(例如每10毫秒或每100毫秒触发一次中断)。
- 计算计数阈值:以100毫秒中断为例,高电平持续3秒需要累计30次中断,低电平持续2秒需要累计20次中断。
- 初始化配置:配置定时器工作模式、装载初值、开启定时器中断及总中断;将目标GPIO引脚配置为推挽输出模式。
- 编写中断服务函数:在定时器中断中维护一个计数变量。当处于高电平阶段且计数达到30时,将GPIO拉低并清零计数器;当处于低电平阶段且计数达到20时,将GPIO拉高并清零计数器。
判断依据
- 占空比 = 高电平持续时间 / 总周期 = 3s / 5s = 60%。
- 定时器溢出时间计算公式:溢出时间 = (预分频值 × 计数最大值) / 系统时钟频率。
适用条件
- 适用于STM32、51系列、AVR等具备硬件定时器的单片机平台。
- 若系统对精度要求极高,需考虑中断响应延迟及晶振温漂的影响。
常见误区
- 软件延时替代定时器:使用循环延时(如
delay())会阻塞CPU,无法同时处理其他任务,且精度受编译器优化影响大。 - 忽略中断标志位清除:进入中断服务函数后未手动清除定时器溢出标志位,会导致程序反复进入中断或死机。
- 计数变量类型溢出:累计次数较多时使用了8位无符号整数(最大255),导致计数错误,应根据需求选择16位或32位变量。