第8章 8位定时计数器结构与应用
Chip type : ATmega16 Program type : Application Clock frequency : 4.000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256
*********************************************/
#include
flash char auc_SinParam[128] = {
128,134,140,147,153,159,165,171,177,182,188,193,199,204,209,213, 218,222,226,230,234,237,240,243,245,248,250,251,253,254,254,255, 255,255,254,254,253,251,250,248,245,243,240,237,234,230,226,222, 218,213,209,204,199,193,188,182,177,171,165,159,153,147,140,134, 128,122,116,109,103,97,91,85,79,74,68,63,57,52,47,43, 38,34,30,26,22,19,16,13,11,8,6,5,3,2,2,1, 1,1,2,2,3,5,6,8,11,13,16,19,22,26,30,34,
38,43,47,52,57,63,68,74,79,85,91,97,103,109,116,122}
char x_SW = 8,X_LUT = 0;
// T/C0 溢出中断服务
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
X_LUT += x_SW;
}
void main(void) {
TIMSK=0x01; #asm(\
// 允许T/C0溢出中断 // 开放全局中断
DDRB=0x08;
// PB3输出方式,作为OC0输出PWM波
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 4000.000 kHz // Mode: Fast PWM top=FFh // OC0 output: Non-Inverted PWM TCCR0=0x69; OCR0=128;
// 新样点指针
// 取样点指针到比较匹配寄存器
if (X_LUT > 127) X_LUT -= 128; // 样点指针调整 OCR0 = auc_SinParam[X_LUT]; // OCR0+=1;
// 128点正弦波样本值
,基于AVR的单片嵌入式系统原理与实践应用
}
while (1)
{};
程序中,在每次的计数器溢出中断的服务中取出一个正弦波的样点值到比较匹配寄存器中,用于调整下一个PWM的脉冲宽度,这样在PB3引脚上输出了按正弦波调制的PWM方波。当PB3的输出通过低通滤波器后,便得到一个976.56Hz的正弦波了。
如要得到更精确的1KHz的正弦波,可使用ATmega16的T/C1,选择工作模式10,设置ICR1=250为计数器的上限值(将在以后的章节中给出)。
图8-17为程序运行后使用示波器在B点测量的实际波形。B点的波形轮廓非常接近正弦波,频率为976.7Hz,幅度在0-5v之间。由于滤波电路由非常简单的RC电路构成,因此还能够看出在正弦波的轮廓上的高频成分。如果用示波器在A点测量的话,可以观察到一个占空比变化的序列方波。
图8-17 实际测量到的正弦波输出波形
3) 思考与实践
? 根据T/C0的PWM模式,再结合本例,详细描述快速PWM的工作原理。
? 减小或增加程序中变量x_SW的值时,B点输出的波形有何变化?如何进行理论的
计算?
? 如果将T/C0中断服务程序中的语句清除到,用OCR0+=1代替时,分析B点输出的
波形,以及频率,并用示波器观察。
8.4 16位定时计数器T/C1的应用
ATmega16的T/C1是一个16位的多功能定时计数器,图8-18为该16位定时计数器的结构框图。其主要特点有: ? 真正的16位设计。
? 2个独立的输出比较匹配单元。 ? 双缓冲输出比较寄存器。
华东师范大学 电子系 马 潮 8-27
第8章 8位定时计数器结构与应用
? 一个输入捕捉单元。 ? 输入捕捉躁声抑制。
? 比较匹配时清零计数器(自动重装特性,Auto Reload)。
? 可产生无输出抖动(glitch-free)的,相位可调的脉宽调制(PWM)信号输出。 ? 周期可调的PWM波形输出。 ? 频率发生器。 ? 外部事件计数器。 ? 带10位的时钟预分频器。
? 4个独立的中断源(TOV1、OCF1A、OCF1B、ICF1)。
图8-18 T/C1结构图(图中n为1)
图中给出了MCU可以操作的寄存器以及相关的标志位,其中计数器寄存器TCNT1、输出比较寄存器OCR1A、OCR1B和输入捕捉寄存器ICR1都是16位的寄存器。T/C1所有的中断请求信号TOV1、OC1A、OC1B、ICF1可以在定时计数器中断标志寄存器TIFR找到,而在定时器中断屏蔽寄存器TIMSK中,可以找到与它们对应的4个相互独立的中断屏蔽控制位TOIE1、OCIE1A、OCIE1B和TICIE1。TCCR1A、TCCR1B为2个8位寄存器,是T/C1的控制寄存器。
T/C1的时钟源的选择由T/C1的控制寄存器TCCR1B中的3个标志位CS1[2:0]确定,共有8种选择。其中包括无时钟源(停止计数),外部引脚T1的上升沿或下降沿,以及内部系
,基于AVR的单片嵌入式系统原理与实践应用
统时钟经过一个10位预定比例分频器分频的5种频率的时钟信号(1/1、1/8、1/64、1/256、1/1024)。
T/C1基本的工作原理和功能与8位定时计数器相同,常规的使用方法也是类同的。但与8位的T/C0、T/C2相比,T/C1不仅位数增加到16位,其功能也更加强大。由于篇幅有限,本节着重介绍T/C1一些增强的功能和基本应用。
8.4.1 16位T/C1增强功能介绍
与8位T/C0、T/C2相比,T/C1的功能增强主要表现在以下几个方面。 1.16位的计数器
由于T/C1是16位的计数器,因此它的计数宽度、计时长度大大增加,配合一个独立的10位预定比例分频器,在系统时钟为4Mh条件下,16位的T/C1最高计时精度为0.25us,而最长的时宽可达到16.777216秒(精度为256us),这是其它的8位单片机所做不到的。
需要注意的是,AVR的内部有许多16位的寄存器,这些寄存器都是由两个8位的寄存器组成的。如16位的寄存器TCNT1实际由2个8位寄存器TCNT1H、TCNT1L组成的。对这些16位寄存器的读写操作需要遵循以下特定的步骤。
2.16位寄存器的读写操作步骤
由于AVR的内部数据总线为8位,因此读写16位的寄存器需要分两次操作。为了能够同步读写16位寄存器,每一个16位寄存器分别配有一个8位的临时辅助寄存器(Temporary Register),用于保存16位寄存器的高8位数据。要同步读写这些16位的寄存器,读写操作应遵循以下特定的步骤:
? 16位寄存器的读操作
当MCU读取16位寄存器的低字节(低8位)时,16位寄存器低字节内容被送到MCU,而高字节(高8位)内容在读低字节操作的同时被置于临时辅助(TEMP)寄存器中。当MCU读取高字节时,读到的是TEMP寄存器中的内容。因此,要同步读取16位寄存器中的数据,应先读取该寄存器的低位字节,再立即读取其高位字节。
? 16位寄存器的写入操作
当MCU写入数据到16位寄存器的高位字节时,数据是写入到TEMP寄存器中。当MCU写入数据到16位寄存器的低位字节时,写入的8位数据与TEMP寄存器中的8位数据组合成一个16位数据,同步写入到16位寄存器中。因此,要同步写16位寄存器时,应先写入该寄存器的高位字节,再立即写入它的低位字节。
用户编写汇编程序时,如要对16位寄存器进行读写操作,应遵循以上特定的步骤。此外,在对16位寄存器操作时,最好将中断响应屏蔽,防止在主程序读写16位寄存器的两条指令之间插入一个含有对该寄存器操作的中断服务。如果这种情况发生,那么中断返回后,寄存器中的内容已经改变,会造成主程序中对16位寄存器的读写失误。下面是读写16位寄存器的汇编子程序示例。
;汇编代码:TIME16_Read_Write_TCNT1: ;保存寄存器SREG in r18,SREG ;禁止中断 cli
;读TCNT1 到r17:r16 in r16,TCNT1L in r17,TCNT1H ;置TCNT1为0x01FF
华东师范大学 电子系 马 潮 8-29
第8章 8位定时计数器结构与应用
ldi r17,0x01 ldi r16,0xFF out TCNT1H,r17 out TCNT1l,r16 ;恢复寄存器SREG out SREG,r18 ret
采用C等高级语言编写程序则可以直接对16位的寄存器进行操作,因为这些高级语言的编译系统会根据16位寄存器的操作步骤生成正确的执行代码。
3. 更加强大和完善的PWM功能
T/C1配备了2个比较匹配输出单元OC1A、OC1B和比较匹配寄存器OCR1A、OCR1B。同时它的PWM模式,有多种不同的计数器上限(TOP)值可供选择,因此T/C1的PWM功能具备以下特点:
? 可产生频率、相位均可调整的PWM波。
T/C1有15种工作模式,除了常规的计数、CTC模式外,还可以产生频率可调、相位可调、频率相位均可调的多种形式的PWM波。其中频率可调的PWM波利用8位定时计数器是不能实现的。T/C1的频率调整范围可以达到16位的精度,它是通过改变计数器的上限值实现的。
? 可同时产生2路不同占空比的PWM波
由于T/C1配备了2个比较匹配输出单元OC1A、OC1B和比较匹配寄存器OCR1A、OCR1B,因此使用一个计数器就可以得到相同频率,不同占空比的2路PWM输出。2路PWM波的占空比的确定和调整分别由寄存器OCR1A、OCR1B确定,分别在OC1A、OC1B上输出。
4.输入捕捉功能
T/C1的输入捕捉功能是AVR定时计数器的另一个非常有特点的功能。T/C1的输入捕捉单元(如图8-19所示)可应用于精确捕捉一个外部事件的发生,记录事件发生的时间印记(Time-stamp)。捕捉外部事件发生的触发信号由引脚ICP1输入,或模拟比较器的AC0单元的输出信号也可作为外部事件捕获的触发信号。
图8-19 T/C1的外部事件输入捕捉单元(n为1)