摘 要: 基线PIC单片机多数都有内部振荡器。对于时间敏感型应用,如果丢失内部振荡器校准值,就必须对振荡器进行重新校准。本文以PIC10F202为例,研究了一种基于异步串行通信原理,利用接收端的时钟信号,对基线PIC单片机的内部振荡器进行重新校准的方法。该方法简单实用,不用设计复杂的外部电路,也不需要使用信号源、示波器或频率计。实际测试表明,校准精度满足出厂参数要求。此外,该方法还可在单片机的允许振荡频率范围内将振荡器频率标定为某一特定频率值。
关键词: 基线PIC单片机;内部振荡器;重新校准
0 引言
大部分基线PIC单片机都具有一个4 MHz或8 MHz的内部振荡器,出厂时精度校准为±1%[1-6]。为保证单片机时钟信号的精度,使用时应将出厂时内部时钟振荡器校准值(Internal Clock Oscillator Calibration Value)写入振荡器校准寄存器OSCCAL中。内部时钟振荡器校准值存放在单片机程序存储器的最后一个单元中,在对器件擦除、编程、调试过程中,可能造成出厂校准值丢失。这种情况下,对于时间敏感型的应用,必须要对振荡器进行重新校准。
在公开的文献中有一种通过单片机内部定时/计数器测量外部输入的标准时钟信号周期实现对单片机内部振荡器进行重新校准的方法[7]。这种方法需要设计一个外部振荡电路及显示电路,而且受基线PIC单片机较少的程序存储器空间(如PIC10F200只有256个程序存储单元)的限制,编写该测试程序需要一定的技巧性,实现起来比较困难。另外,用4个LED实现的显示电路,也存在着记录数据麻烦、容易出错,甚至需要辅助频率计或示波器才能确认数据的问题。下面介绍一种基于单片机的校准方法,该方法编程简单,不需要设计硬件电路,也不需要信号源、频率计或示波器来对基线PIC单片机内部振荡器进行重新校准。这种方法基于异步串行通信原理,利用接收端的时钟信号实现(注:本文作者已经把该方法申请了发明专利,专利申请号:201410027051.3)。
1 内部振荡器校准的依据
含有内部振荡器的基线PIC单片机大多数都有一个振荡器校准寄存器OSCCAL,这个寄存器的高7位是内部振荡器的校准位,其最低位对于不同的单片机,有的定义为1/4振荡频率(INTOSC/4)输出使能位,有的没有定义。高7位校准位的取值范围是0000000 ~ 1111111,与振荡器输出频率的关系如图1所示[1-6]。改变这7位的值,就能改变振荡器输出的频率。
2 基于串口的重新校准方法
将需要重新校准内部振荡器的单片机作为异步串行通信的发送端,计算机作为接收端。在设定的波特率和数据帧格式下,每改变一次写入单片机校准寄存器OSCCAL的值,即每改变一次单片机内部振荡器的振荡频率,就将特定字符0x55、0xAA以及当前OSCCAL寄存器中的值通过串口发送出去。当写入校准寄存器OSCCAL的值让单片机内部振荡器工作频率满足通信波特率要求时,在接收端就能获得所发送的特定字符0x55、0xAA和校准值。
根据异步串行通信原理,当一帧数据为10 bit时,理论上发送和接收波特率最大允许误差是5%[8]。如果考虑到传输导线引起的信号畸变,实际上发送和接收波特率能够允许的最大误差要小于5%,在EIA-232标准中限定为4%[9]。因为测试时的传输导线很短,传输导线引起的误差可以忽略。假定所用计算机的串口时钟信号是精确的,则异步串行通信所允许的误差,体现在测试过程中就是,当单片机以标称频率为中心的±4%频率范围内的多个频率点发出数据时,在计算机端都能正确接收。因此,只要保证在连续改变单片机振荡频率时,是由小到大或由大到小顺次变化的,则在计算机端能够正确接收到的多组数据中的校准值(校准值是二进制补码,见图1)出现的次序也是由小到大或由大到小顺次排列的。这些由小到大或由大到小顺次排列的校准值所对应的单片机内部振荡器工作频率范围是以标称频率为中心,-4% ~ +4%或+4% ~ -4%。显然,这些能够在计算机中正确接收,顺次排列的多组数据中,中间那组数据里的最后一个数值就是找到的校准值。
3 重新校准方法的软件设计
重新校准方法的程序设计主要是指单片机的程序设计,因为多数的基线PIC单片机没有集成硬件串口组件,所以采用单片机I/O引脚通过软件实现模拟串口。计算机端的串口调试助手软件使用任何一款现成的串口调试软件即可,不需要也没必要自行编写。
下面的程序设计是以PIC10F202为例,其他基线PIC单片机的程序设计与此类似。
3.1 主程序设计
在主程序中为方便测试,配置字的设置是missing image file引脚为主复位,代码保护关闭,禁止看门狗。主程序流程图如图2所示,GP0引脚为模拟串口的发送引脚。因为OSCCAL寄存器的高7位才是校准位,所以OSCCAL寄存器的值每次加2才使内部振荡器工作在下一个相邻的频率值。频率值是由小到大顺次改变的。
3.2 子程序的设计
串行口发送子程序流程图如图3所示。设计的通信波特率是9 600 b/s,则每发送一位数据的持续时间是missing image file。数据的帧格式是1 bit起始位、 8 bit数据位、1 bit停止位。
因为涉及到精确的串口发送时序,整个测试程序用汇编语言编写,在MPLAB IDE V8.92下编译,仅占用68个程序存储单元和5 B数据存储器。
4 测试数据及结果分析
4.1 测试流程
为了便于比较测试结果,测试的流程如下:首先,取一个全新的PIC10F202,通过PICkit 3读出出厂校准值是0x16,并记录下来;然后,将测试程序通过PICkit 3下载到这个PIC10F202中。在5.0 V工作电源下,将PIC10F202通过MAX232电平转换模块与计算机串口相连,在计算机中运行串口调试助手软件,选择相应的端口,设置与PIC10F202相同的波特率、帧格式,并设置接收显示为十六进制模式,观察接收到的数据,如图4所示。在图4中用横线标出了显示55、AA、XX(XX为当前频率的校准值)的连续数据块,校准值为0x02~0x2A,其中中间的0x16就是找到的标称校准值。
4.2 实测数据
测试时采用一台带原生串口的DELL D400笔记本计算机(数据表中的计算机1)和一台普通台式计算机(数据表中的计算机2)。按上述测试流程将PIC10F202输出的TTL电平转换为RS232电平后与计算机原生串口相连。每台计算机均随机测试10次,获得的测试数据如表1所示。表中14/16是指校准值是0x14或0x16,这是因为接收到的正确数据组数是偶数,所以取中间的两个校准值中的任意一个。
为验证基于串口的基线PIC单片机内部振荡器的重新校准方法是否可以使用USB转串口模块代替原生串口,还对常用的CP2102和PL2303两种USB转串口模块进行了测试。表2、表3分别是使用CP2102 USB转串口模块和PL2303 USB转串口模块随机进行10次测试获得的数据。
4.3 结果分析
由表1、表2、表3可知,使用原生串口,计算机1获得的校准值与事先读取的PIC10F202出厂校准值一致,都是0x16;计算机2获得的10次随机测试结果是0x14或0x16,如果取10次测试中出现次数多的值作为最终结果,则校准值为0x14。使用CP2102模块,计算机1得到的校准值可取0x14或0x16;计算机2的校准值是0x14。使用PL2303模块,计算机1获得的校准值是0x18或0x1A,10次中出现次数多的是0x18;计算机2获得的校准值也是0x18或0x1A,10次中出现次数多的同样是0x18。为验证获得的校准值是否在允许精度范围内,采用100 MHz示波器TDS 220,对标准校准值附近0x0C ~ 0x20范围内的12个校准值的振荡器输出频率进行了测量,结果如表4所示,其中INTOSC/4是用示波器测得的从PIC10F202的GP2引脚输出的1/4内部振荡频率,INTOSC是计算值。
从表4可知,对于实验所用的PIC10F202,校准值在0x10 ~ 0x18范围内均满足校准精度为±1%的出厂要求。出厂校准值0x16的输出频率与标称振荡频率的误差为0.5%。对于计算机1和计算机2,获得校准值的振荡频率与标称振荡频率的误差分别是:使用原生串口为0.5%和0%;使用CP2102 USB转串口模块为0%或0.5%和0%;使用PL2303 USB转串口模块都是1%。因此,无论是使用原生串口还是USB转串口模块都能实现对基线PIC单片机内部振荡器的重新校准,而且满足校准精度±1%的要求。推荐使用计算机原生串口或CP2102模块。由于条件所限没有对其他USB转串口模块进行测试。
5 结束语
综上所述,使用串口,利用异步串行通信接收端的时钟信号进行基线PIC单片机内部振荡器的重新校准方法,满足校准精度的要求。该方法的新颖之处在于:既不需要构建外部电路,也不需要使用信号源、示波器或频率计,只需编写一个单片机内部的重新校准测试程序,使用计算机串口调试助手软件及附加一个电平转换电路模块或常见的USB转串口模块即可实现。因此,在基线PIC单片机内部振荡器的重新校准上具有广泛的使用价值。另外,这种方法还可以将基线PIC单片机内部振荡器的频率在允许频率范围内重新标定为非出厂标称频率值。同时,可以推广到其他具有内部振荡器单片机的类似应用中。
参考文献
[1] Microchip Technology Inc.PIC10F200/202/204/206 6-Pin, 8-Bit Flash Microcontrollers Data .http://ww1.microchip.com/downloads/en/DeviceDoc/40001239E.pdf.
[2] Microchip Technology Inc.PIC10F220/222 6-Pin, 8-Bit Flash Microcontrollers Data Sheet[EB/OL].[2014-02-16].http://ww1.microchip.com/downloads/en/DeviceDoc/41270E.pdf.
[3] Microchip Technology Inc.PIC12F508/509/16F505 8/14-Pin, 8-Bit Flash Microcontrollers [2014016].http://ww1.microchip.com/downloads/en/DeviceDoc/41236E.pdf.
[4] Microchip Technology Inc.PIC12F510/16F506 8/14-Pin, 8-Bit Flash Microcontroller Data Sheet[EB/OL].[2014-0216].http://ww1.microchip.com/downloads/en/DeviceDoc/41268D.pdf.
[5] Microchip Technology Inc. PIC12F519 8-Pin, 8-Bit Flash Microcontroller Data Sheet[EB/OL].[2014-02-16].http://ww1.microchip.com/downloads/en/DeviceDoc/41319B.pdf.
[6] Microchi[20140216].http://ww1.microchip.com/downloads/en/DeviceDoc/40001652B.pdf.
[7] Benabadji N.基线PIC微控制器的内部振荡器的重新校准[J].电子设计技术,2008,15(8):100.
[8] 李朝青.PC机及单片机数据通信技术[M].北京:北京航空航天大学出版社,2001.
[9] ANSI/TIA/EIA-232-F-1997. Interface between data terminal equipment and data circuit-terminating equipment employing serial binary data interchange[S].1997.