




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ATMEGA16定时器的使用日期:2012-01-07 来源:本站编辑 作者:佚名 字体:大 中 小 (投递新闻) /* 本程序简单的示范了如何使用ATMEGA16的定时器 AVR定时器的要点介绍 T0工作于CTC模式,输出1KHz/2KHz 50%占空比的方波 T1工作于快速PWM模式兼输入捕捉 T2工作于相位修正PWM模式,输出490Hz的8bit PWM波 出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器 对于定时器,AVRstudio的软件仿真是不准确的。 */ #include #include #include /时钟定为8MHz,F_CPU=8000000 /管脚定义 #define ICPKEY 6 /ICP1 PD6 按键模拟ICP输入 #define PWM0 3 /OC0 PB3 #define PWM1A 5 /OC1A PD5 #define PWM1B 4 /OC1B PD4 #define PWM2 7 /OC2 PD7 /宏定义 #define PWM1A_ON() PORTD|= (1PWM1A) /输出高电平,灯亮 #define PWM1A_OFF() PORTD&=(1PWM1A) /输出低电平,灯灭 /全局变量 volatile unsigned int ICP_Time; /记录ICP输入捕捉事件的发生时刻 volatile unsigned char T2PWM; /设置T2的PWM值 volatile unsigned char T0OCR; /设置T0的时间值 /仿真时在watch窗口,监控这些变量。 void timer0_init(void) /CTC模式输出1KHz/2KHz方波 OCR0 = T0OCR; /设定TOP值 /TOP=8000000/(2*64*1000)-1=61.5 选61 1.008KHz(0.992mS) /TOP=8000000/(2*64*2000)-1=30.25 选30 2.016KHz(0.496ms) TCCR0 = (1WGM01)|(0WGM00)|(0COM01)|(1COM00)|(0CS02)|(1CS01)|(1CS00); /64分频,CTC模式,OC0取反输出方波 void timer1_init(void) OCR1A = 39062; /设定TOP值.时间5S(0.2Hz) /TOP=8000000/(1024*0.2)=39062.5 OCR1B = 15624; /设定OC1B的PWM值 约2秒钟 40% TCCR1A = (1COM1B1)|(0COM1B0)|(1WGM11)|(1WGM10); TCCR1B = (0ICES1)|(1WGM13)|(1WGM12)|(1CS12)|(0CS11)|(1CS10); /1024分频,WGM1=15 快速PWM模式,TOP=OCRnA,ICP下降沿触发,OC1B正向PWM输出,OC1A为普通IO SIGNAL(SIG_INPUT_CAPTURE1) /输入捕捉中断 ICP_Time=ICR1; /读取ICP输入捕捉事件的发生时刻 SIGNAL(SIG_OUTPUT_COMPARE1A)/T1输出比较A匹配中断 /在WGM1=15 快速PWM模式下,TOP=39062等同于5S左右的定时中断 T2PWM+=10; OCR2=T2PWM; /修改T2的PWM值 if (T0OCR=61) T0OCR=30; /改成1KHz else T0OCR=61; /改成2KHz OCR0=T0OCR; /修改T0的时间值 void timer2_init(void)/相位修正PWM模式 OCR2 = T2PWM; /设定PWM值(最大值固定为255,8bit) TCCR2 = (0WGM21)|(1WGM20)|(1COM21)|(0COM20)|(0CS22)|(1CS21)|(1CS20); /32分频,相位修正PWM模式,PWM频率为490Hz,OC2正向PWM输出 /fPWM=fclk_IO/(2*N*TOP)=8000000/(2*32*255)=490Hz int main(void) /上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻 PORTA =0xFF; /不用的管脚使能内部上拉电阻。 PORTC =0xFF; PORTB = (1PWM0); /低电平,灯灭 DDRB = (1PWM0); /输出 PORTD =(1PWM1A)|(1PWM1B)|(1PWM2); /低电平,灯灭 DDRD = (1PWM1A)|(1PWM1B)|(1PWM2); /输出 T2PWM=0x80; T0OCR=30; ICP_Time=0x0000; timer0_init(); timer1_init(); timer2_init(); TIMSK = (1TICIE1)|(115624) PWM1A_ON(); /如果数值大于15624(约2秒),OC1A输出高电平 else PWM1A_OFF(); /否则输出低电平 /* 程序运行效果 引脚OC0(每5秒钟切换)交替输出1KHz和2KHz的50%占空比方波,接到无源蜂鸣器上,能听到不同频率的声音 引脚OC1B输出0.2Hz的40%占空比的PWM波,精度39061级(略大于15bit) 引脚OC2输出490Hz的PWM波,精度8bit,每5秒钟PWM值增大10级,对应的LED亮度将会随之变化) ICP由引脚ICP1上的按键触发,ICP_Time将会记录下时间发生的时刻(相对于T1定时器的本次计数开始时间), 如果数值大于15624(约2秒),OC1A输出高电平,否则输出低电平(刚好跟OC1B反相) 如果使用AVR-51实验板作本实验,注意输出电平和LED的关系。还有蜂鸣器的声音较大,耳朵比较难受) */ /* 附录 AVR定时器的要点介绍 (大部分摘自 M16中文手册,未能一一测试) M16的T1 16位定时器一共有15种工作模式,其他2个8位定时器(T0/T2)相对简单,除了T2有异步工作模式用于RTC应用外 (可以利用溢出中断和比较匹配中断作定时功能) 分5种工作类型 1 普通模式 WGM1=0 跟51的普通模式差不多,有TOV1溢出中断,发生于TOP时 1 采用内部计数时钟 用于 ICP捕捉输入场合-测量脉宽/红外解码 (捕捉输入功能可以工作在多种模式下,而不单单只是普通模式) 2 采用外部计数脉冲输入 用于 计数,测频 其他的应用,采用其他模式更为方便,不需要像51般费神 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)。 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) 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) 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) T/C 的时钟源 T/C 的时钟源可以有多种选择,由CS12:0控制,分别用于高速(低分频)/长时间(高分频)/外部计数场合 一个16位定时器,在8MHz系统时钟驱动下,可以实现uS级的高速定时和长达8秒的超长定时,这可是标准51的弱点 CS12 CS11 CS10 说明 0 0 0 无时钟源 (T/C 停止) 0 0 1 clkIO/1 ( 无预分频) 0 1 0 clkIO/8 ( 来自预分频器) 0 1 1 clkIO/64 ( 来自预分频器) 1 0 0 clkIO/256 ( 来自预分频器) 1 0 1 clkIO/1024 ( 来自预分频器) 1 1 0 外部T1 引脚,下降沿驱动 1 1 1 外部T1 引脚,上升沿驱动 分频器复位 在高预分频应用时, 通过复位预分频器来同步T/C 与程序运行,可以减少误差。 但是必须注意另一个T/C是否也在使用这一预分频器,因为预分频器复位将会影响所有与其连接的T/C。 外部时钟源 由于使用了引脚同步逻辑,建议外部时钟的最高频率不要大于fclk_IO/2.5。 外部时钟源不送入预分频器 选择使用外部时钟源后,即使T1引脚被定义为输出,其T1引脚上的逻辑信号电平变化仍然会驱动T/C1 计数,这个特性允许用户通过软件来控制计数。 输入捕捉单元 T/C 的输入捕捉单元可用来捕获外部事件,并为其赋予时间标记以说明此时间的发生时刻。 外部事件发生的触发信号由引脚ICP1 输入,也可通过模拟比较器单元来实现。 时间标记可用来计算频率、占空比及信号的其它特征,以及为事件创建日志。 输入捕捉单元可以工作在多种工作模式下 (使用ICR1定义TOP的(WGM1=12,14,10,8)波形产生模式时,ICP1与输入捕捉功能脱开,从而输入捕捉功能被禁用。) 在任何输入捕捉工作模式下都不推荐在操作过程中改变TOP值 当引脚ICP1 上的逻辑电平( 事件) 发生了变化,或模拟比较器输出ACO 电平发生了变化,并且这个电平变化为边沿检测器所证实,输入捕捉即被激发: 16位的TCNT1 数据被拷贝到输入捕捉寄存器ICR1,同时输入捕捉标志位ICF1 置位。 如果此时ICIE1 = 1,输入捕捉标志将产生输入捕捉中断。 中断执行时ICF1 自动清零,或者也可通过软件在其对应的I/O 位置写入逻辑1” 清零。 注意,改变触发源有可能造成一次输入捕捉。因此在改变触发源后必须对输入捕捉标志执行一次清零操作以避免出现错误的结果 除去使用ICR1定义TOP的波形产生模式外, T/C中的噪声抑制器与边沿检测器总是使能的。 (其实就是永远使能?) 使能噪声抑制器后,在边沿检测器前会加入额外的逻辑电路并引入4个系统时钟周期的延迟. 噪声抑制器使用的是系统时钟,因而不受预分频器的影响 使用输入捕捉中断时,中断程序应尽可能早的读取ICR1 寄存器 如果处理器在下一次事件出现之前没有读取ICR1 的数据, ICR1 就会被新值覆盖,从而无法得到正确的捕捉结果。 测量外部信号的占空比时要求每次捕捉后都要改变触发沿。 因此读取ICR1 后必须尽快改变敏感的信号边沿。改变边沿后,ICF1 必须由软件清零( 在对应的I/O 位置写1”)。 若仅需测量频率,且使用了中断发生,则不需对ICF1 进行软件清零。 输出比较单元 16位比较器持续比较TCNT1与OCR1x的内容,一旦发现它们相等,比较器立即产生一个匹配信号。 然后OCF1x 在下一个定时器时钟置位。 如果此时OCIE1x = 1, OCF1x 置位将引发输出比较中断。 (就是说输出比较可以工作在所有工作模式下,但PWM模式下更好用,功能更强) 输出比较单元A(OCR1A) 的一个特质是定义T/C 的TOP 值( 即计数器的分辨率)。 TOP 值还用来定义通过波形发生器产生的波形的周期。 由于在任意模式下写TCNT1 都将在下一个定时器时钟周期里阻止比较匹配,在使用输出比较时改变TCNT1就会有风险,不管T/C是否在运行 这个特性可以用来将OCR1x初始化为与TCNT1 相同的数值而不触发中断。 强制输出比较(FOC) 工作于非PWM 模式时,可以通过对强制输出比较位FOC1x 写”1” 的方式来产生比较匹配。 强制比较匹配不会置位 OCF1x 标志,也不会重载/ 清零定时器, 但是OC1x 引脚将被更新,好象
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年程序员进阶算法与数据结构考试要点
- 人教版除法竖式教学课件
- 【教案版】小学五班级上册 武术
- 2025年专业备考指南初级工程师面试题预测与解析工程技术类
- 2025年特岗教师招聘考试历史专业知识与面试技巧详解
- 2025年初级软件测试工程师模拟题及面试技巧
- 2025年数据分析师实战技能模拟测试题库及答案详解
- 2025年财务会计招聘面试技巧及预测题详解
- 2025年电子商务运营专家老年人电商市场趋势分析预测题集
- 2025年特岗教师招聘考试备考策略与规划
- 安装聚氨酯冷库板施工方案
- 医院培训课件:《黄帝内针临床运用》
- 峥嵘岁月 课件-2024-2025学年高中音乐人音版(2019) 必修 音乐鉴赏
- 《医院医疗技术临床应用管理制度》
- 建筑装饰工程涂料施工技术考核试卷
- 数字媒体艺术史全册完整教学课件
- 2024年人社法律法规知识竞赛考试题库及答案
- 知识题库-人社劳动知识竞赛测试题及答案(十五)
- 《民宿管家》课件-民宿管家之预订接待
- 部编小学语文单元作业设计四年级上册第三单元 3
- 《信号完整性测试》课件2
评论
0/150
提交评论