豪杰宣布完成800万天使轮融资,由博泰集团领投,天生腾基金跟投
06-17
AVR 有3 个定时计数器,其中定时计数器0 和定时计数器2 为8 位,定时计数器1 为16 位。
在学习AVR定时计数器的时候,一开始对大量的寄存器有点困惑。
后来我仔细阅读了Datasheet中的相关寄存器,然后又重新阅读了时序计数器的内容,才搞清楚。
这里做个总结,加深一下印象。
定时器计数器0和定时器计数器2基本相同。
用定时计数器0来总结一下其几种工作模式的区别。
普通模式:不做介绍,与51完全相同。
CTC模式:当寄存器TCNT0和OCR0相等(即匹配)时,OC0根据值相应改变(置位、清零或取反) COM0[1:0]。
同时,TCNT0 被清零,TCNT0 从 0x00 重新开始计数。
当计数结果等于下一个OCR0寄存器中的值时,再次匹配。
当匹配发生时,匹配比较标志OCF0被置位,即OCF0=1,可以申请匹配比较中断。
快速 PWM 模式:当寄存器 TCNT0 和 OCR0 匹配时,根据 COM0[1:0]的值相应地设置或清除 OC0。
与CTC模式不同的是,TCNT0不会被清零,而是会继续计数,直到计数达到0XFF,此时OC0将被清零或置位。
同时,TCNT0 从 0x00 重新开始计数,当计数结果等于下一个 OCR0 寄存器中的值时,发生匹配。
与 CTC 模式不同,当匹配发生时,OCF0 不会被置位。
当TCNT0计数到0XFF时,计数溢出标志TOV0被置位,即TOV0=1。
此时可以应用溢出中断。
相位可调PWM模式:该模式下,定时计数器为双向计数器(可加减),下一个计数脉冲到来时,从0x00增加到0xff,从0xff减少到0x00。
当COM0[1:0]=2时,加法过程中,如果匹配,则OC0清零;在减法过程中,如果发生匹配,则设置 OC0。
(当COM0[1:0]=3时,与COM0[1:0]=2相反)。
与快速 PWM 模式不同,当 TCNT0 计数到 0xff 时,不会影响 OC0 的输出,但在从 0xff 减到 0x00 的过程中,当与下一个 OCR0 寄存器的值匹配时,OC0 发生变化(加法的过程)。
清零,则此时应设置)。
当定时器计数器计数到0x00时,计数溢出标志TOV0被置位,即TOV0 = 1。
此时可以申请溢出中断。
以上工作模式同时适用于定时器计数器0、1、2。
仅增强了定时器计数器 1 的功能。
这将在下面讨论。
周二看一个程序时,该程序工作在快速PWM模式下,并选择了计数溢出中断。
当时我就想为什么不选择匹配中断,等到计数溢出才中断。
不会占用时间吗?我还问过老师。
现在看来真是太傻了!快速 PWM 模式根本没有匹配中断! 定时计数器0和2,在CTC模式下,频率和相位可调。
PWM 模式下,频率无法调节。
这一点从频率统计公司就可以看出。
无论是CTC还是PWM,都可以通过调整OCRn的值来调整占空比。
(后面会给出产生PWM波频率的计算公式,关于定时计数器的各个寄存器,可以自己查看Datasheet) 下面是定时计数器1到0和2的增强功能总结: 1) 定时计数器1比0和2有很多增强。
在PWM模式下,可以生成频率和相位可调的PWM波。
这是8位定时定时器0和2无法做到的,因为定时计数器1有输入捕捉功能,即有输入捕捉寄存器ICR1。
在 PWM 模式下,ICR1 中可以存储一个最高值,正是这个最高值可以改变 PWM 波的频率。
这可以在频率计算公司中看到。
2)定时计数器1有两个输出比较单元和两个输出比较寄存器OCR1A和OCR1B,因此可以同时产生2个频率相同、占空比不同的PWM波形。
占空比的调整当然是由OCR1A和OCR1B决定的。
波形在 OC1A 和 OC1B 引脚上输出。
3) 定时计数器1具有输入捕捉单元。
能够准确记录外部事件发生的时间。
捕捉外部事件的信号由引脚 ICP1 输入。
当输入捕捉信号产生时,TCNT1 中的计数值将被写入输入捕捉寄存器 ICR1(ICR1H、ICR1L)。
输入捕捉信号也可以由模拟比较器AC0单元的输出信号触发。
触发方式有两种。
当定时计数器1的控制寄存器B(即TCCR1B)中第六位ICESE=0时,下降沿触发; ICESE=1,上升沿触发。
当满足触发条件时,输入捕捉单元开始捕捉事件的发生。
该功能可用于测量输入波形的频率。
如果我没记错的话,51中的定时计数器也有这个功能,设置GATE门控制位就可以达到这个目的。
51、设置GATE,则此时定时计数器的启动由INTX(X=0或1)引脚和TRX(X=0或1)决定。
可以先设置TRX,在定时器计数启动条件具备之前让INTX为高电平(即先让INTX为低电平),等待INTX变为高电平,此时定时器计数器就会启动,并等待直到INTX变为高电平。

当为低电平时,定时器计数器再次关闭,则此时定时器计数器的计数值为一个PWM脉宽。
说到这里,我突然想到AVR中,定时计数器有自己的分频器。
这里也可以先设置定时计数器满足启动条件,但设置为不分频。
这个时候就相当于没有人了。
心,定时器计数器此时不工作。
当满足其他条件(如外部中断)时,可以对定时计数器进行分频,然后定时计数器就会工作! 我刚刚谈到了中断。
与51不同的是,AVR在清“0”时向中断标志位写入“1”。
即AVR通过向软件写入“1”来清除中断标志位。
值得提醒的是,在设置中断寄存器时,最好先清除中断标志位,然后立即将相应的中断使能控制位值设置为“1”。
这里需要说明的是上面提到的定时计数器波形输出引脚和输入捕捉引脚。
在使用它之前,必须先将其方向寄存器设置为输出或输入。
如果是输入,还需要考虑是否需要上拉电阻。
说了这么多,差点忘记了我个人认为比较重要的一点。
定时计数器1为16位,其每个16位寄存器都配有一个8位TEMP寄存器,用于临时保留该寄存器的高位8位数据。
当MCU从16位寄存器读取数据时,低8位发送到MCU,高8位发送到TEMP。
当MCU读取高8位时,它读取TEMP中的数据。
当MCU向16位数据寄存器写入数据时,高8位写入TEMP。
当写入低8位时,TEMP中的低8位和高8位形成16位数据并写入16位寄存器。
即读取时先读取低8位,再读取高8位;写入时先写入高8位,再写入低8位。
最后给出定时计数器三种常用工作模式的设置方法(以定时计数器1为例): 正常模式: 1。
根据需要设置时钟源,即设置控制寄存器TCCR1B。
2。
根据定时时间和时钟源确定定时器的初始值,并将其写入数据寄存器TCNT1H和TCNT1B。
3、设置中断使能位。
4。
选择中断号并编写中断服务程序。
注意,需要在中断服务程序中重新加载初始值并写入TCNT1H和TCNT1B(同51)! CTC 模式: 1,如果输出波形,则设置端口 OC1A 或 OC1B 为输出模式。
2。
设置波形生成模式并选择所需的时钟源,即TCCR1B。
3。
设置输出模式,为TCCR1A。
4。
根据需要设置上限值top(前面提到的),并将其写入输出比较寄存器OCR1A。
5、根据公式计算频率。
快速 PWM 模式: 1。
如果要输出波形,请将端口 OC1A 或 OC1B 设置为输出模式。
2。
设置 PWM 波形模式并选择所需的时钟源,即 TCCR1A 和 TCCR1B。
3、设置波形的频率,即OCR1A。
4、设置波形占空比,即OCCR1B。
6、根据频率公式计算频率。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-17
06-06
06-18
06-17
06-17
06-06
06-18
最新文章
使用电子管有哪些注意事项?如何检查电子管之间是否短路?
博通支付1200万美元和解SEC财务欺诈指控
八名运营商高管确认加入虚拟运营商
内蒙古农牧区雷电灾害成因分析及防雷对策
北京联通将5G应用于世园会远程医疗急救
TD-SCDMA最后一轮冲刺测试启动,产业前景更加光明
专访阿里云总裁王健:云计算服务平台梦想成真
USB2.0控制器CY7C68013的接口设计与实现