您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 置位脉冲 >

第5讲定时器

发布时间:2019-06-28 06:40 来源:未知 编辑:admin

  定时器应用设计 实际上不管定时/ 实际上不管定时/计数器是作为计数器使用还是 作为定时器使用, 作为定时器使用,其根本的工作原理并没有改 都是对一个脉冲系列信号进行计数。 变,都是对一个脉冲系列信号进行计数。通常 所谓的定时器, 所谓的定时器,更多的情况是指其计数脉冲信 号来自芯片本身的内部。 号来自芯片本身的内部。由于内部的计数脉冲 信号的频率(周期)是已知的或固定的, 信号的频率(周期)是已知的或固定的,因此 用户可以根据需要来设定计数器脉冲计数的个 以获得一个等间隔的定时中断。 数,以获得一个等间隔的定时中断。利用定时 中断, 中断,可以方便的实现系统定时访问外设或处 理事物,以及获得更加准确的延时等等。 理事物,以及获得更加准确的延时等等。 1 给出了系统时钟为4MHz 时, 表8.6 给出了系统时钟为 ATmega16 芯片本身能够提供给 芯片本身能够提供给T/C0 的 计数脉冲信号的最高计时精度和时宽范围。 计数脉冲信号的最高计时精度和时宽范围。 2 从表中看出,在系统时钟为4Mh 从表中看出,在系统时钟为4Mh 条件 位的T/C0 下,8 位的T/C0 最高计时精度为 0.25us, 0.25us,而最长的时宽可达到 65.536ms。而如果使用16 65.536ms。而如果使用16 位的定时 计数器T/C1 /计数器T/C1 时,不需要使用辅助 软件计数器, 软件计数器,就可以非常方便的设 计一个时间长达16.777216 计一个时间长达16.777216 秒(精 度为256us 的定时器, 256us) 度为256us)的定时器,这是其它的 位单片机所做不到的。 8 位单片机所做不到的。 3 #include mega16.h flash char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0 x07,0x7F,0x6F}; flash char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; char time[3]; // 时、分、秒计数单元 char dis_buff[6]; // 显示缓冲区,存放要显示的6 个字符 的段码值 int time_counter; // 中断次数计数单元 char posit; bit point_on, time_1s_ok; 4 void display(void) // 6 位LED 数码管动态扫描函数 { PORTC = 0xff; PORTA = led_7[dis_buff[posit]]; if (point_on && (posit==2posit==4)) PORTA = 0x80; PORTC = position[posit]; if (++posit =6 ) posit = 0; } // Timer 0 比较匹配中断服务 interrupt [TIM0_COMP] void timer0_comp_isr(void) { display(); // 调用LED 扫描显示 if (++time_counter=500) { time_counter = 0; time_1s_ok = 1; } 5 } void time_to_disbuffer(void) // 时钟时间送显示缓冲区函数 { char i,j=0; for (i=0;i=2;i++) { dis_buff[j++] = time[i] % 10; dis_buff[j++] = time[i] / 10; } } void main(void) { PORTA=0x00; // 显示控制I/O 端口初始化 DDRA=0xFF; PORTC=0x3F; DDRC=0x3F; // T/C0 初始化 TCCR0=0x0B; // 内部时钟,64 分频(4M/64=62.5KHz),CTC 模 式 TCNT0=0x00; OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms TIMSK=0x02; // 允许T/C0 比较匹配中断 time[2] = 23; time[1] = 58; time[0] = 55; // 设时间初值23:58:55 6 posit = 0; time_to_disbuffer(); #asm(sei) // 开放全局中断 while (1) { if (time_1s_ok) // 1 秒到 { time_1s_ok = 0; point_on = ~point_on; if (++time[0] = 60) // 以下时间调整 { time[0] = 0; if (++time[1] = 60) { time[1] = 0; if (++time[2] = 24) time[2] = 0; } } time_to_disbuffer(); // 新调整好的时间送显示缓冲区 } }; } 7 该程序中的LED 动态扫描,时间调整与例7.2 相同, 该程序中的LED 动态扫描,时间调整与例7.2 相同,所 不同的是使用了T/C0 硬件定时。 不同的是使用了T/C0 硬件定时。 工作在CTC 模式,采用系统时钟经过64 T/C0 工作在CTC 模式,采用系统时钟经过64 分频的信 号作为计数器的计数脉冲。 系统时钟经过64 号作为计数器的计数脉冲。4M 系统时钟经过64 分频 后为62.5KHz 周期为16us 62.5KHz, 16us。 的比较寄存器OCR0 后为62.5KHz,周期为16us。T/C0 的比较寄存器OCR0 的值为124 0x7C),因此T/C0 每计数125 124( ),因此 的值为124(0x7C),因此T/C0 每计数125 次产生一 次比较匹配中断,中断的间隔时间为16*125=2ms 16*125=2ms。 次比较匹配中断,中断的间隔时间为16*125=2ms。 的比较匹配中断服务中, 在T/C0 的比较匹配中断服务中,中断服务的内容同例 7.2,首先进行LED 的扫描,即每位LED 7.2,首先进行LED 的扫描,即每位LED 的扫描间隔 点亮时间) 毫秒, (点亮时间)为2 毫秒,然后中断次数计数器 一旦time_counter 加到500 500, time_counter 加1。一旦time_counter 加到500,则 置位time_1s_ok 表示1 秒时间到。 time_1s_ok, 置位time_1s_ok,表示1 秒时间到。 主程序中检测秒标志time_1s_ok 当秒标志置位, time_1s_ok, 主程序中检测秒标志time_1s_ok,当秒标志置位,则进 行时间的调整,然后将新的时间送显示缓冲区中。 行时间的调整,然后将新的时间送显示缓冲区中。 8 9 给出硬件接口电路图。图中仅采用了6 图6-15 给出硬件接口电路图。图中仅采用了6 个共阴极的LED 数码管。 个共阴极的LED 数码管。所有数码管段 的引脚并接, 控制; 并接, 位a 的引脚并接,由PA0 控制;段b 并接,由 控制;因此类推。既仍然用ATmega16 PA1 控制;因此类推。既仍然用ATmega16 口作为段码输出。 PC0- 的PA 口作为段码输出。ATmega16 的PC0- 分别与LED0 LED0- 的共公端COM PC5 分别与LED0-LED5 的共公端COM 引脚 连接, 口的低6 位作为位扫描控制口。 连接,既PC 口的低6 位作为位扫描控制口。 10 11 具有PWM 功能的8 位 定时器/ 计时器0 T/C0 是一个通用的单通道 位定时器 计 是一个通用的单通道8 位定时器/ 数器模块。其主要特点如下: 数器模块。其主要特点如下: ? 单通道计数器 ? 比较匹配发生时清除定时器( 自动加载) 比较匹配发生时清除定时器( 自动加载) ? 无干扰脉冲,相位正确的 无干扰脉冲,相位正确的PWM ? 频率发生器 ? 外部事件计数器 ? 10 位的时钟预分频器 ? 溢出和比较匹配中断源 (TOV0 和 OCF0) 12 13 T/C(TCNT0)和输出比较寄存器 和输出比较寄存器(OCR0)为8位寄存 和输出比较寄存器 为 位寄存 中断请求(图中简写为 图中简写为Int.Req. ) 信号在定时器 器。中断请求 图中简写为 中断标志寄存器TIFR 都有反映。 所有中断都可以 都有反映。 中断标志寄存器 通过定时器中断屏蔽寄存器TIMSK 单独进行屏蔽。 单独进行屏蔽。 通过定时器中断屏蔽寄存器 图中没有给出TIFR 和TIMSK。 图中没有给出 。 T/C可以通过预分频器由内部时钟源驱动,或者是 可以通过预分频器由内部时钟源驱动, 可以通过预分频器由内部时钟源驱动 通过T0 引脚的外部时钟源来驱动。时钟选择逻辑模 引脚的外部时钟源来驱动。 通过 块控制使用哪一个时钟源与什么边沿来增加( 块控制使用哪一个时钟源与什么边沿来增加 或降 的数值。如果没有选择时钟源T/C 就不工 低)T/C 的数值。如果没有选择时钟源 时钟选择模块的输出定义为定时器时钟clkT0。 作。时钟选择模块的输出定义为定时器时钟 。 14 双缓冲的输出比较寄存器OCR0 一直与 一直与T/C 的数值进行比 双缓冲的输出比较寄存器 比较的结果可用来产生PWM波,或在输出比较引脚 较。比较的结果可用来产生 波 OC0上产生变化频率的输出,如P69 “ 输出比较单元” 说 上产生变化频率的输出, 输出比较单元” 上产生变化频率的输出 明的那样。比较匹配事件还将置位比较标志OCF0。此标 明的那样。比较匹配事件还将置位比较标志 。 志可以用来产生输出比较中断请求。 志可以用来产生输出比较中断请求。 T/C 可以由内部同步时钟或外部异步时钟驱动。时钟源是由 可以由内部同步时钟或外部异步时钟驱动。 时钟选择逻辑决定的,而时钟选择逻辑是由位于T/C 控制寄 时钟选择逻辑决定的,而时钟选择逻辑是由位于 存器TCCR0 的时钟选择位 的时钟选择位CS02:0 控制的。 控制的。 存器 15 普通模式(WGM01:0 = 0) 为最简单的工作模式。 为最简单的工作模式。 普通模式 在此模式下计数器不停地累加。计到8比特的最大 在此模式下计数器不停地累加。计到 比特的最大 值后(TOP = 0xFF),由于数值溢出计数器简单 值后 , 地返回到最小值0x00 重新开始。在TCNT0 为零 重新开始。 地返回到最小值 的同一个定时器时钟里T/C 溢出标志 溢出标志TOV0 置位。 置位。 的同一个定时器时钟里 此时TOV0 有点象第 位,只是只能置位,不会 有点象第9 只是只能置位, 此时 清零。 清零。但由于定时器中断服务程序能够自动清零 TOV0,因此可以通过软件提高定时器的分辨率。 ,因此可以通过软件提高定时器的分辨率。 在普通模式下没有什么需要特殊考虑的, 在普通模式下没有什么需要特殊考虑的,用户可 以随时写入新的计数器数值。 以随时写入新的计数器数值。 16 模式(WGM01:0 = 2) 下OCR0 寄存 在CTC 模式 器用于调节计数器的分辨率。 器用于调节计数器的分辨率。当计数器的数 等于OCR0时计数器清零。OCR0定 时计数器清零。 值TCNT0等于 等于 时计数器清零 定 义了计数器的TOP值,亦即计数器的分辨率。 义了计数器的 值 亦即计数器的分辨率。 这个模式使得用户可以很容易地控制比较匹 配输出的频率, 配输出的频率,也简化了外部事件计数的操 计数器数值TCNT0一直累加到 一直累加到TCNT0与 作。计数器数值 一直累加到 与 OCR0匹配,然后 匹配, 清零。 匹配 然后TCNT0 清零。 17 利用OCF0 标志可以在计数器数值达到 标志可以在计数器数值达到TOP 时产生 利用 中断。在中断服务程序里可以更新TOP的数值。由 的数值。 中断。在中断服务程序里可以更新 的数值 模式没有双缓冲功能, 于CTC模式没有双缓冲功能,在计数器以无预分频 模式没有双缓冲功能 器或很低的预分频器工作的时候将TOP 更改为接近 器或很低的预分频器工作的时候将 BOTTOM 的数值时要小心。如果写入的 的数值时要小心。如果写入的OCR0 数 值小于当前TCNT0 的数值,计数器将丢失一次比 的数值, 值小于当前 较匹配。在下一次比较匹配发生之前, 较匹配。在下一次比较匹配发生之前,计数器不 得不先计数到最大值0xFF,然后再从 得不先计数到最大值 ,然后再从0x00 开始计 数到OCF0。 数到 。 18 快速PWM 模式 模式(WGM01:0 = 3) 可用来产生高频 快速 波形。快速PWM 模式与其他 模式与其他PWM模式的 的PWM 波形。快速 模式的 不同之处是其单斜坡工作方式。计数器从BOTTOM 不同之处是其单斜坡工作方式。计数器从 计到MAX,然后立即回到 重新开始。 计到 ,然后立即回到BOTTOM重新开始。对 重新开始 于普通的比较输出模式,输出比较引脚OC0在 于普通的比较输出模式,输出比较引脚 在 TCNT0与OCR0匹配时清零,在BOTTOM 时置位; 匹配时清零, 时置位; 与 匹配时清零 对于反向比较输出模式, 的动作正好相反。 对于反向比较输出模式, OC0 的动作正好相反。 由于使用了单斜坡模式,快速PWM 模式的工作频 由于使用了单斜坡模式,快速 率比使用双斜坡的相位修正PWM 模式高一 率比使用双斜坡的相位修正 此高频操作特性使得快速PWM 模式十分适合 倍。此高频操作特性使得快速 于功率调节,整流和DAC 应用。高频可以减小外部 应用。 于功率调节,整流和 元器件( 电感,电容) 的物理尺寸, 元器件 电感,电容 的物理尺寸,从而降低系统 成本。 成本。 19 T/C 控制寄存器- TCCR0 Bit 7 – FOC0: 强制输出比较 FOC0仅在 仅在WGM00指明非 指明非PWM模式时才有效。但是,为了保 模式时才有效。 仅在 指明非 模式时才有效 但是, 证与未来器件的兼容性,在使用PWM 时,写TCCR0 要对其 证与未来器件的兼容性,在使用 清零。对其写1 波形发生器将立即进行比较操作。 清零。对其写 后,波形发生器将立即进行比较操作。比较匹 将按照COM01:0 的设置输出相应的电平。 的设置输出相应的电平。 配输出引脚 OC0 将按照 要注意FOC0 类似一个锁存信号,真正对强制输出比较起作用 类似一个锁存信号, 要注意 的是COM01:0 的设置。FOC0不会引发任何中断,也不会在 的设置。 不会引发任何中断, 的是 不会引发任何中断 利用OCR0作为 作为TOP的CTC模式下对定时器进行清零的操作。 模式下对定时器进行清零的操作。 利用 作为 的 模式下对定时器进行清零的操作 20 Bit 6, 3 – WGM01:0: 波形产生模式 21 Bit 5:4 – COM01:0: 比较匹配输出模式 22 Bit 2:0 – CS02:0: 时钟选择 23 T/C 寄存器- TCNT0 通过T/C 寄存器可以直接对计数器的 位数据进 寄存器可以直接对计数器的8 通过 行读写访问。 行读写访问。对TCNT0 寄存器的写访问将在下一 个时钟阻止比较匹配。 个时钟阻止比较匹配。在计数器运行的过程中修 的数值有可能丢失一次TCNT0 和 改TCNT0 的数值有可能丢失一次 OCR0 的比较匹配。 的比较匹配。 24 输出比较寄存器- OCR0 输出比较寄存器包含一个8 位的数据, 输出比较寄存器包含一个 位的数据,不间断地 与计数器数值TCNT0 进行比较。匹配事件可以用 进行比较。 与计数器数值 来产生输出比较中断,或者用来在OC0 引脚上产 来产生输出比较中断,或者用来在 生波形。 生波形。 25 T/C 中断屏蔽寄存器- TIMSK ? Bit 1 – OCIE0: T/C0 输出比较匹配中断使能 和状态寄存器的全局中断使能位I 都为” 当OCIE0 和状态寄存器的全局中断使能位I 都为”1” 时, T/C0 的输出比较匹配中断使能。当T/C0 的比较匹配发生, 的输出比较匹配中断使能。 的比较匹配发生, 中的OCF0 置位时,中断服务程序得以执行。 置位时,中断服务程序得以执行。 即TIFR 中的 ? Bit 0 – TOIE0: T/C0 溢出中断使能 和状态寄存器的全局中断使能位I 都为” 当TOIE0 和状态寄存器的全局中断使能位 都为”1” 时, T/C0 的溢出中断使能。当T/C0发生溢出,即TIFR 中的 的溢出中断使能。 发生溢出, 发生溢出 TOV0 位置位时,中断服务程序得以执行。 位置位时,中断服务程序得以执行。 26 T/C 中断标志寄存器- TIFR ? Bit 1 – OCF0: 输出比较标志0 当T/C0 与OCR0( 输出比较寄存器0) 的值匹配时,OCF0 置位。 此位在中断服务程序里硬件清零,也可以对其写1 来清零。当 SREG 中的位I、OCIE0(T/C0 比较匹配中断使能) 和OCF0 都 置位时,中断服务程序得到执行。 ? Bit 0 – TOV0: T/C0 溢出标志 当T/C0 溢出时, TOV0 置位。执行相应的中断服务程序时此 位硬件清零。此外, TOV0也可以通过写1 来清零。当SREG 中的位I、TOIE0(T/C0 溢出中断使能) 和TOV0 都置位时,中 断服务程序得到执行。在相位修正PWM 模式中,当T/C0 在 0x00 改变记数方向时, TOV0 置位。 27 分5种工作类型 1 普通模式 WGM1=0 跟51的普通模式差不多,有TOV1溢出中断,发生于 TOP时 1 采用内部计数时钟 用于 ICP捕捉输入场合---测量 脉宽/红外解码 (捕捉输入功能可以工作在多种模式下,而不单单只 是普通模式) 2 采用外部计数脉冲输入 用于 计数,测频 其他的应用,采用其他模式更为方便,不需要像51般 费神 28 2 CTC模式 [比较匹配时清零定时器模式] WGM1=4,12 跟51的自动重载模式差不多 1 用于输出50%占空比的方波信号 2 用于产生准确的连续定时信号 WGM1=4时, 最大值由OCR1A设定,TOP时产生OCF1A比较匹配 中断 WGM1=12时,最大值由ICF1设定, TOP时产生ICF1输入捕捉中 断 注:WGM=15时,也能实现从OC1A输出方波,而且具备双缓冲功 能 计算公式: fOCn=fclk_IO/(2*N*(1+TOP)) 变量N 代表预分频因子(1、8、32,64、256,1024)。 29 3 快速PWM模式 WGM1=5,6,7,14,15 单斜波计数,用于输出高频率的PWM信号(比双斜波的高一倍频率) 都有TOV1溢出中断,发生于TOP时 比较匹配后可以产生OCF1x比较匹配中断. WGM1=5时, 最大值为0x00FF, 8位分辨率 WGM1=6时, 最大值为0x01FF, 9位分辨率 WGM1=7时, 最大值为0x03FF,10位分辨率 WGM1=14时,最大值由ICF1设定, TOP时产生ICF1输入捕捉中断 (单缓冲) WGM1=15时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配 中断(双缓冲,但OC1A将没有PWM能力,最多只能输出方波) 改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值 注意,即使OCR1A/B设为0x0000,也会输出一个定时器时钟周期 的窄脉冲,而不是一直为低电平 计算公式:fPWM=fclk_IO/(N*(1+TOP)) 30 4 相位修正PWM模式 WGM1=1,2,3,10,11 双斜波计数,用于输出高精度的,相位准确的,对称的PWM信号 都有TOV1溢出中断,但发生在BOOTOM时 比较匹配后可以产生OCF1x比较匹配中断. WGM1=1时, 最大值为0x00FF, 8位分辨率 WGM1=2时, 最大值为0x01FF, 9位分辨率 WGM1=3时, 最大值为0x03FF,10位分辨率 WGM1=10时,最大值由ICF1设定, TOP时产生ICF1输入捕捉中断 (单缓冲) WGM1=11时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配 中断(双缓冲,但OC1A将没有PWM能力,最多只能输出方波) 改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值 可以输出0%~100%占空比的PWM信号 若要在T/C 运行时改变TOP 值,最好用相位与频率修正模式代替 相位修正模式。若TOP保持不变,那么这两种工作模式实际没有 区别 计算公式:fPWM=fclk_IO/(2*N*TOP) 31 5 相位与频率修正PWM模式 WGM1=8,9 双斜波计数,用于输出高精度的、相位与频率都准确的PWM波形 都有TOV1溢出中断,但发生在BOOTOM时 比较匹配后可以产生OCF1x比较匹配中断. WGM1=8时,最大值由ICF1设定, TOP时产生ICF1输入捕捉中断 (单缓冲) WGM1=9时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中 断(双缓冲,但OC1A将没有PWM能力,最多只能输出方波) 相频修正修正PWM 模式与相位修正PWM 模式的主要区别在于 OCR1x 寄存器的更新时间 改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值 可以输出0%~100%占空比的PWM信号 使用固定TOP 值时最好使用ICR1 寄存器定义TOP。这样OCR1A 就可以用于在OC1A输出PWM 波。 但是,如果PWM 基频不断变化(通过改变TOP值), OCR1A的双缓 冲特性使其更适合于这个应用。 计算公式:fPWM=fclk_IO/(2*N*TOP) 32 T/C 的时钟源 T/C 的时钟源可以有多种选择,由CS12:0控制,分别用于高速(低分 频)/长时间(高分频)/外部计数场合 一个16位定时器,在8MHz系统时钟驱动下,可以实现uS级的高速定 时和长达8秒的超长定时,这可是标准51的弱点 CS12 CS11 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 CS10 说明 无时钟源 (T/C 停止) clkIO/1 ( 无预分频) clkIO/8 ( 来自预分频器) clkIO/64 ( 来自预分频器) clkIO/256 ( 来自预分频器) clkIO/1024 ( 来自预分频器) 外部T1 引脚,下降沿驱动 外部T1 引脚,上升沿驱动 33 34 35 36 37 T0工作于CTC模式,输出1KHz 50%占空比 的方波 程序运行效果 引脚OC0(每5秒钟切换)交替输出 1KHz和2KHz的50%占空比方波,接到无 源蜂鸣器上,能听到不同频率的声音 38 #include mega16.h void timer0_init(void) //CTC模式输出1KHz方波 { OCR0 = T0OCR; //设定TOP值 //TOP=8000000/(2*64*1000)-1=61.5 选61 1.008KHz(0.992mS) TCCR0 = (1WGM01)(0WGM00)(0COM01)( 1COM00)(0CS02)(1CS01)(1CS 00); //64分频,CTC模式,OC0取反输出方波 } 39 40 int main(void) { //上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻 PORTA =0xFF; //不用的管脚使能内部上拉电阻。 PORTC =0xFF; PORTB =~ (1PWM0); //低电平,灯灭 DDRB = (1PWM0); //输出 T0OCR=30; timer0_init(); sei(); //使能全局中断 while (1) {} } 41 预分频系数1,8,64,256,1024 1MHz 125kHz 15.625kHz 3.906kHz 0.977kHz 2MHz 250kHz 31.25kHz 7.813kHz 1.935kHz 4MHz 500kHz 62.5kHz 15.625kHz 3.906kHz 8MHz 1MHz 125kHz 31.25kHz 7.813kHz T/C0,T/C2 PWM方式周期为 512/0.977=524ms,264ms,131ms,65ms 255/8000=31.8us 42

http://yogayodame.com/zhiweimaichong/88.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有