
AVRRC震荡器校正(精品).doc
10页AVR单片机内部RC振荡器校正方法AVR单片机具有内部RC振荡器,对于内部振荡器的校正一直是一个比较难的问题,由于这个问题的困扰,导致很多正常的程序无法正常工作,特此整理该文档供客户参考,如果有需要英文的可以到ATMEL官方网站下载特点l 可以使用 STK500, AVRISP, JTAGICE 或 JTAGICE mkII 校正l 可以使用第三方编程器校正l 调整 RC 频率到 +/-1% 精度l 在任意电压和温度下调整 RC 振荡器l 调整 RC 振荡器到指定频率l 支持所有带有 RC 振荡器的 AVR 单片机l 可以选择振荡器时钟频率 介绍这篇应用笔记说明了快速和精确校正内部 RC 振荡器的方法它提供了容易修改的固件源代码,可以用在任何带有内部可调 RC 振荡器的 AVR 单片机中这个固件允许使用 AVR STK500, AVRISP 或 JTAGICE,但是也可以用在第三方系统中(如编程器) 大部分 AVR 单片机提供了内部 RC 振荡器这个 RC 振荡器的频率可以校正到 +/-1%。
这个特点使其提供了更大的灵活性和节约了成本 在 Atmel 的工厂中是在固定电压和温度下进行了校正(典型是 25°C和 5V),而内部 RC 振荡器的频率是受到温度和电压同时影响的,这使得用户在特定的应用环境时可能需要进行再次校正再次校正可以得到更高的精度,匹配特定的电压或温度,甚至调整到一个完全不同的频率 这篇应用笔记说明的校正方法使用的时间只比从签名中读取工厂校正字节并回写到设备中稍长全部的编程时间几乎不受到校正的影响 注意在某些系统中非常依赖于运行时间,这说明在应用中在整个温度范围需要一个精确的与电压无关的系统时钟在这种情况下一个手表晶体可以提供可靠和低成本的解决方案 在这篇文档的最后有快速开始指南 操作理论 – 内部 RC 振荡器在产品中内部 RC 振荡器在 5V 或 3.3V 下校正工厂校正的精度在 +/-3 或 +/-10% (参考数据手册)如果一个设计需要比工厂标准校正更高的精度,就需要再次校正 RC 振荡器,这样可以得到大约 +/-1%(对于工厂校正精度是+/-10%的器件是 +/-2%)的精度 时钟选择AVR 熔丝的设置控制了系统使用的时钟源为了使用内部 RC 振荡器,需要选择正确的熔丝。
数据手册中说明了可以使用的熔丝设置 基本频率下面小节给出了 AVR 单片机内部 RC 振荡器说明 一些 AVR 单片机有一个 RC 振荡器,其它的有 4 种不同的 RC 振荡器可以选择,频率范围从 1MHz 到 9.6MHz校正内部 RC 振荡器使用晶体校正寄存器:SCCAL(在 IO 头文件中定义了)OSCCAL 寄存器是一个字节宽度,它可以对系统频率进行微调,校正 RC 振荡器就利用了这个微调 当单片机被 Atmel 校正后,校正字节就存放到单片机的签名中不同芯片的校正字节之间差异可能很大,因为 RC 振荡器与工艺有关,有一定离散性如果芯片有多于一个振荡器,那每个振荡器都对应一个校正字节 大多数单片机的缺省 RC 校正字节在复位时自动从签名中载入,并复制到 OSCCAL 寄存器中例如,ATmega8 的默认时钟设置是内部 1MHz RC 振荡器;对应的 1MHz 校正字节在复位后自动载入如果熔丝改变为 4MHz 振荡器,校正字节就需要手工载入 OSCCAL 寄存器了编程工具可以从签名中读取 4MHz 校正字节并强制存放到 Flash 或 EEPROM 中,然后由用户程序在运行时读取出来再复制到 OSCCAL 寄存器中。
为了容易使用 OSCCAL 寄存器调整振荡器,一些单片机可以设置系统的预分频时钟预分频寄存器(CLKPR) 可以用预定义的系数比例变化系统时钟同样,这个预分频可以通过熔丝预先设置;编程 CKDIV8 熔丝就设置 CLKPR 系统时钟分频 8这可以保证芯片在低于最大频率下操作,CLKPR 可以在运行时修改 基本频率是定义为不分频 RC振荡器总结AVR 单片机在不同时期使用了不同的 RC 振荡器一个关于 RC 振荡器的回顾参见表1芯片列表按照振荡器类型排序,也差不多是按照发布时间排序的表中只列出了可以调整振荡器的芯片表1.带有内部 RC 振荡器的芯片特点,按照版本分类振荡器版本器件RC 振荡器频率CKDIVPRSCK1.1ATtiny121.2--1.2ATtiny151.6--2.0ATmega1631.0--2.0ATmega3231.0--3.0ATmega81.0,2.0,4.0和8.0--3.0ATmega161.0,2.0,4.0和8.0--3.0ATmega321.0,2.0,4.0和8.0--3.1ATmega641.0,2.0,4.0和8.0-XDIV(1)3.1ATmega1281.0,2.0,4.0和8.0-XDIV(1)3.0ATmega85151.0,2.0,4.0和8.0--3.0ATmega85351.0,2.0,4.0和8.0--3.0ATmega261.0,2.0,4.0和8.0--4.0ATmega1628.0是是4.0ATmega169(2)8.0是是4.0ATmega1658.0是是4.1ATmega134.8和9.6是是4.2ATmega23134.0和8.0是是5.0ATmega48ATmega88ATmega1688.0是是5.0ATmega25ATmega45ATmega858.0是是5.0ATmega325ATmega3250ATmega645ATmega64508.0是是5.0ATmega329ATmega3290ATmega649ATmega64908.0是是5.0AT90CAN1288.0是是5.0AT90PWM2AT90PWM38.0是是注意:1. 这个器件的预分频寄存器叫做 XDIV。
2. ATmega169 修订 F 使用 5.0 版本的振荡器 版本1.X这个版本是 AVR 单片机最早的可以校正的内部 RC 振荡器,它提供了 1.2MHz 到 1.6MHz 的频率校正值存放在签名中,但是不能自动载入,必须在运行时手工加载到 OSCCAL 寄存器这个版本的振荡器的频率高度依赖于工作电压和温度 版本2.X这个版本的振荡器提供了 1MHz 频率与1.x版本相比,显著的减少了对电压和温度的依赖性 版本3.X这个版本和35.5k工艺一起引入 扩展振荡器提供多个频率,4种不同的 RC 振荡器,频率分别是 1, 2, 4 以及 8MHz这个版本自动载入 1MHz 的校正值因为有4个不同 RC 振荡器,所以在签名中保存了 4 个校正值如果使用了不是缺省的 1MHz 频率,OSCCAL 寄存器需要运行时手工加载校正值 版本4.X版本4.0中只保留了 8MHz 的振荡器稍晚一些的 4.x 版本中提供了两种频率:4MHz 和 8MHz(ATtiny2313),4.8MHz 和 9.6MHz(ATtiny13)OSCCAL 寄存器修改为只有 7 位用于调整选择的频率,最高位没有使用。
可以自动载入校正值和预分频时钟 版本4.X版本5.0中只有8MHz时钟,OSCCAL中所有的8位都可以用于调整频率,可以自动载入校正值和预分频时钟OSCCAL寄存器分为两个部分,OSCCAL的最高位选择频率范围,后7位用于调整指定的频率 振荡器特性内部 RC 振荡器的频率依赖于温度和工作电压图1显示了ATmega169 (版本 A 到 E)的 8MHz RC 振荡器的频率如图所示,频率随着温度而增加,随着电压的增加而稍微降低,这个特性随芯片不同而变化对于某种具体型号的芯片参考数据手册 图1.晶体频率和变化与温度和电压关系(ATmega169)(MHz)Vcc(V)所有带有可调整振荡器的芯片都有 OSCCAL 寄存器增加 OSCCAL 将得到一个称为“伪单调”(pseudo-monotone)增加的频率把它称为“伪单调”的原因是因为在某些情况下改变 OSCCAL 寄存器的参数将不会增加或减少频率,但是再次改变就会增加频率了换句话说,OSCCAL 寄存器加上 1 可能不增加频率,但是加上 2 一般都会使频率增加这一特点对于搜索最佳校正值很重要一个伪单调的例子可以从图2看出,它是 ATmega169 的 8MHz RC 振荡器的例子。
注意到 OSCCAL 寄存器只使用了 7 位(8 位在 ATmega169 修订版本 F 及以后版本中),这样 OSCCAL 的最大值是 128 图2. ATmega169 校正 RC 振荡器频率(MHz)晶体参数 对于所有可以调整的振荡器,不推荐调整频率超过指定基本频率的 10%,因为内部定时是依赖于 RC 振荡器的 知道了 RC 振荡器的基本特性,就可以在 10% 的范围内,在任何工作电压和环境温度下,将给定的频率校正到 +/-1% 的精度 进行校正这一节分为协议和固件程序两部分协议是为了适应任何支持校正的编程工具,如 AVR 的开发工具STK500, AVRISP, JTAGICE 和 JTAGICE mkII,这些工具校正的用法在后面说明 STK500, AVRISP, JTAGICE 和 JTAGICE mkII 目前只支持命令行版本的校正,由 AVR Studio 4.11 SP1 (及以后版本)支持最新版本的 AVR Studio 可以在 下载 校正协议校正协议是简单快速的,以保证可以用于产品中编程使用的管脚是 ISP 接口或 JTAG 接口(如果有),使其可以用于最终产品中(或PCB)。
两个管脚用于进行校正: ISP 中的 MOSI 和 MISO,或 JTAG 中的 TDI 和 TDO这里为了简单只说明 MOSI 和 MISO,TDI 和 TDO 的用法是一样的 基本概念就是编程器产生校正时钟(C-clock),单片机使用它作为参考来校正自己的内部 RC 振荡器当单片机完成校正后通过 MISO 发送 “OK”信号给编程器编程器允许 MISO 信号线上拉,而单片机允许 MOSI 信号线上拉,这是为了保证噪声不影响校正 编程器使用 1024 C-cycles (C-clock 周期)作为溢出时间,校正程序在这个时间内完成 校正程序按一下步骤运行:1. 编程器写入校正固件程序到单片机中,允许 MISO 上拉,并释放 reset 信号线校正时钟发送到 MOSI 信号线手表晶体(32.768kHz)的频率是合适的2. 单片机允许 MOSI 内部上拉,并。
