定时器与PWM波
- 晶振的作用
- 晶振(Crystal Oscillator)用于提供一个稳定的时钟信号,帮助处理器和其他硬件设备衡量时间流逝。晶振的频率决定了时钟信号的速率。例如,8 MHz 的晶振每秒产生 8,000,000 次振荡。这些振荡信号用于驱动处理器的内部时钟和定时器模块。
- 定时器的工作原理
- 定时器计数:定时器会通过每次时钟信号来递增或递减计数器(TCNT)。当计数器达到设定的周期(TCNTB),就会发出一个中断信号。定时器的工作周期取决于分频器的值以及晶振的频率。
- 分频器:分频器用于将时钟信号的频率进行缩减,比如从 64 MHz 缩减到 1 KHz,最终生成一个 1 ms 的时钟周期,用于定时器计数。
- 定时周期:定时器会从 0 计数到设定的周期值,然后触发中断。当定时器达到设定的周期值时,计数器重置并开始新一轮计数。
- 定时器与 PWM 结合
- PWM(Pulse Width Modulation) 是一种常用于调节设备(如灯光、马达)输出强度的技术,利用定时器生成脉冲波,控制输出信号的占空比。
- PWM 的基本原理:通过改变脉冲的占空比,可以调节输出信号的强弱。占空比是指信号为高电平的时间与总周期的比值。
- PWM 的工作过程:
- 设定两个值:周期(TCNTB)和比较值(TCMPB)。
- 当定时器计数器的值达到周期值时,计数器重置并开始新一轮计数;当计数器值达到比较值时,输出电平改变。
- 通过修改比较值 TCMPB 与周期值 TCNTB 之间的关系,可以改变 PWM 波形的占空比。
控制蜂鸣器产生音乐流程
-
初始化GPIO为PWM输出
GPD0CON &= ~0xF; // 清除 GPD0_0 的配置位 GPD0CON |= 1<<1; // 将 GPD0_0 配置为 PWM 输出(TOUT_0)
- GPD0CON:用于控制 GPD0_0 管脚的功能,通过设置 0x2,将其配置为 PWM 输出模式。
-
PWM定时器配置
TCFG0 &= ~0xFF; // 清除 TCFG0 的前8位 TCFG0 |= 124; // 设置预分频器为 124 TCFG1 &= ~0xF; // 清除 TCFG1 的前4位 TCFG1 |= 3; // 设置分频器为 1/8 TCNTB0 = 100; // 设置定时器周期寄存器的初始值为 100 TCMPB0 = 30; // 设置比较寄存器的值为 30
- TCFG0 和 TCFG1:分别用于设置预分频和分频器。预分频器设置为 124,分频器设置为 1/8。
- TCNTB0 和 TCMPB0:这两个寄存器用于设定 PWM 波形的周期和占空比。周期寄存器(TCNTB0)决定 PWM 信号的周期,而比较寄存器(TCMPB0)决定高电平时间的长短,从而控制占空比。
-
控制 PWM 定时器
- 定时器初始化
TCON |= 1<<3; // 设置定时器为自动重载模式 TCON &= ~(1<<2); // 设置不翻转电平 TCON |= 1<<1; // 更新 TCNTB 和 TCMPB 到 TCNT 和 TCMP TCON &= ~(1<<1); // 清除更新位
- 定时器的启动与停止
TCON |= 1<<0; // 启动定时器 TCON &= ~(1<<0); // 停止定时器
- TCON:用于控制定时器的状态(启动、停止、更新、翻转等)。当设置 TCON 的第 1 位时,定时器会更新 TCNT 和 TCMP 的值,并且立即清除此位以确保正确更新。
-
蜂鸣器频率控制
char yf[] = { 0,191,170,152,143,128,114,101}; // 不同频率对应的 PWM 周期值
- yf 数组:存储了蜂鸣器不同音调对应的 PWM 周期值。程序通过循环修改定时器的周期值和占空比,产生不同频率的 PWM 信号,控制蜂鸣器发出不同频率的声音。
-
延时函数
void mdelay(int msec) { while