操作理论 – 内部 RC 振荡器
在产品中内部 RC 振荡器在 5V 或 3.3V 下校正。工厂校正的精度在 +/-3 或 +/-10% (参考数据手册)。如果一个设计需要比工厂标准校正更高的精度,就需要再次校正 RC 振荡器,这样可以得到大约 +/-1%(对于工厂校正精度是+/-10%的器件是 +/-2%)的精度。
时钟选择
AVR 熔丝的设置控制了系统使用的时钟源。为了使用内部 RC 振荡器,需要选择正确的熔丝。数据手册中说明了可以使用的熔丝设置。
晶体参数
对于所有可以调整的振荡器,不推荐调整频率超过指定基本频率的 10%,因为内部定时是依赖于 RC 振荡器的。
知道了 RC 振荡器的基本特性,就可以在 10% 的范围内,在任何工作电压和环境温度下,将给定的频率校正到 +/-1% 的精度。
进行校正
这一节分为协议和固件程序两部分。协议是为了适应任何支持校正的编程工具,如 AVR 的开发工具STK500, AVRISP, JTAGICE 和 JTAGICE mkII,这些工具校正的用法在后面说明。
STK500, AVRISP, JTAGICE 和 JTAGICE mkII 目前只支持命令行版本的校正,由 AVR Studio 4.11 SP1 (及以后版本)支持。最新版本的 AVR Studio 可以在 http://www.atmel.com/avr/ 下载。
校正协议
校正协议是简单快速的,以保证可以用于产品中。编程使用的管脚是 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 内部上拉,并开始监听 MOSI 上的校正时钟信号。
3. 当单片机检测到用于二进制搜索的校正时钟达到 1% 精度,如果不是需要的参数值,那么就把邻近值作为结果,并进行验证
4. 校正值存放到 EEPROM 中(在校正失败时,忽略这个步骤)。
5. 当成功完成校正后,翻转 MISO 信号 4 次。在 MOSI 时钟下降沿时执行 MISO 翻转 5 到 10 个 CPU 周期(C-clock)。在校正失败时,不进行这一步。
6. 如果单片机没有 EESAVE 熔丝,编程器必须取回 EEPROM 中的校正值以便恢复,因为稍后固件程序将被从 Flash 中擦除。如果有 EESAVE 熔丝,就设置这一位,这样在擦除 Flash 时就不会擦除 EEPROM 了。
必须在运行时从 EEPROM 复制校正参数到 OSCCAL 寄存器,为此需要在最终的固件程序中执行它。
校正固件程序
校正代码是用汇编写的,对于 AVR Studio 4.11 已经安装了带有校正包的汇编。
校正固件程序是按照方便修改为任何型号的单片机(表1中)来组织的。同样,校正的接口也可以被修改。如果使用 AVR 的开发工具,所有需要进行的修改都在文件 “RC_Calibration.asm”中。
文件包括下面内容:
1. 指定芯片文件(选择和你的系统对应的),如 “m16.asm”是 Atmega16 的。芯片指定文件包括下面内容:
a. AVR Studio 的寄存器和位定义。
b. 定义的内存映射文件,指定代码的位置和存放在 EEPROM 的校正数据的位置。
c. OSCCAL 访问的宏,控制怎样对 OSCCAL 寄存器进行访问。访问 OSCCAL 寄存器的方法与 IO 文件和 OSCCAL 寄存器的位置有关。
d. 振荡器版本文件。这个文件定义了二进制搜索的初始化步骤,因为一些 OSCCAL 寄存器是 7 位,另外的是 8 位的。
e. 返回堆栈初始化宏文件。一些芯片有硬件堆栈,另外的使用软件堆栈,需要进行初始化。
f. 端口访问宏文件,定义了怎样访问与校正相关的端口的相关寄存器。需要这个文件是因为一些寄存器在 IO 文件的高端部分,而其它的在低端部分。
g. 重定义位和寄存器名。
请注意使用 ATmega169 修订版F 的芯片时需要修改芯片的特殊文件,在“m169.asm”文件中振荡器版本要设置成 5。
2. 校正接口文件。这个文件指定使用 ISP 或 JTAG 端口,以及使用的管脚名。校正时钟频率也在这里指定。
3. 包含使用宏定义的文件 - “macros.inc”。
4. 公共的校正代码文件 “main.asm”。
校正代码的结构是按照易于修改而设计的,可以更简单的适应目标系统的单片机和接口。此外,广泛使用了宏定义保证了代码可以只要最小的改动。最后,芯片和校正接口的设计使得只需很小的改动就可以支持新的器件。
编译校正固件
校正固件的主程序是 RC_Calibration.asm。这个文件需要在AVR Studio中添加到一个汇编工程里。在这个文件中指定了单片机型号和使用的校正接口:STK500, AVRISP, JTAGICE 或 JTAGICE mkII。甚至还可以指定校正的精度。
一旦修改这些选项,编译工程产生一个二进制文件 “rc_calib.hex”,就是使用这个文件进行校正。
注意正确设置熔丝很重要:如果选择了 1MHz RC 振荡器,就不能校正为单片机 8MHz。