PIC单片机的内部RC振荡器的校准

发布者:polkmm最新更新时间:2016-11-07 来源: eefocus关键字:PIC单片机  内部RC振荡器  校准 手机看文章 扫描二维码
随时随地手机看文章
在PIC的单片机中有多种型号有内部RC振荡器的功能,从而省去了晶振,不但节省了成本,并且我们还多了两个IO端口可以使用。

但是,由于RC振荡器中电阻、电容的离散性很大,因此,在有内部RC振荡器的单片机中,它的内部RAM中都会有一个名为OSCCAL的校准寄存器,通过置入不同的数值来微调RC振荡器的振荡频率。并且,单片机的程序存储器中,也会有一个特殊的字来储存工厂生产时测得的校准值。下面我以常用的12C508A和12F629为例加以说明。

12C508A的复位矢量是程序的最高字0x1FF,这个字节生产商已经固定的烧写为MOVLW 0xXX,指令执行后,W寄存器中即为校准值XX,当我们需要校准时,那么,在紧接着的地址0x0应该是一条这样的指令:MOVWF OSCCAL。接下去RC振荡器就会以标准的振荡频率运行了。

12F629的校准值也存放在最高字--0x3FF中,内容是RETLW 0xXX,但它的复位矢量却是0x0。这样,在我们需要校准RC振荡器时,在初始化过程中要加上下面两句:

    CALL  0x3ff
    MOVWF OSCCAL

当然,你还要注意寄存器的块选择位。

以前,我在做项目时,没太注意这个问题,这是因为在使用12C508A时,HI-TECH在进行编译时已经偷偷地替我们做了这项工作。它会在程序的0x0处自动加一条MOVWF OSCCAL。用12F629做接收解码代替2272时也没发生什么问题,但是在用被它作滚动码解码器时却发现接收距离的离散性很大。经多次试验终于找出是没对振荡器的振荡频率进行校正所至。

因此,需要另外编写用于校正的语句,我用了两种方法来实现这个目的:

1、用内嵌汇编的形式

#asm   //此段汇编程序用于将位于程序段3FFH的
  call 3ffh  //内部RC振荡器的校准值放入校准寄存器,
  bsf _STATUS,5  //在进行C语言调试时应屏蔽这段程序
  movwf _OSCCAL
#endasm

2、用C语言标准形式

const unsigned char cs @ 0x3ff; //在函数体外
...
OSCCAL=cs;   //仿真时屏蔽此句

用这两种方法都有一个小缺陷--仿真时,程序无法运行,这是由于C编译器并没有为我们在0x3FF放置一条RETLW 0xXX的语句。因此,程序运行到这里之后,并没有把一个常数(校准值)放入W寄存器然后返回,而是继续执行这条语句的下一句--0x0及其之后的程序,也就是说程序到此就乱了。因此如程序后面注释所示,在仿真时,应先屏蔽这几句程序。在程序调试完成后,需要烧写时,把注释符去掉,再编译一次就可以了。

我还有一种想法,不用屏蔽语句,那就是用函数来实现,就是在0x3FF起建立一个函数,函数体内只有一条语句,如下:

char jz()
{
 return 0;
}

当然,还要考虑C函数返回时,一定会选择寄存器0,实际上这个函数的起始地址应小于0x3FF。但是我找了我所能找到的参考资料,并上网找了多次,也没找到为函数绝对定位的方法,希望有知道的朋友指点一下。

还有,12C508A是一次性编程的,并且0x1FF处的内容,我们是无法改变的,也就是说你在此处编写任何指令,编程器都不会为你烧写,或者说即使烧写了也不会改变其中的内容。

可12F629是FLASH器件,可多次编程,如果你没有故意选择,正品的编程器(如Microchip的PICSTART  PLUS)是不会对存有校准值的程序空间进行编程的。即使你无意中对这个程序空间进行了编程,你也可以用一条RETLW 0xXX放在0x3FF处再编程一次就可以了,但这个XX值可能是不正确的,需经实验确定(请参考后面说明)。

为了检验OSCCAL的值对振荡器频率的影响,特编写了下面一个小程序进行验证:

#include
//*********************************************************
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BOREN & PROTECT & CPD);
//内部RC振荡器普通IO口;无效看门狗;上电延时;内部复位;掉电复位;代码保护;数据保护
//*********************************************************
#define out GPIO0  //定义输出端
#define jc GPIO3  //定义检测端
//*********************************************************
void interrupt zd();  //声明中断函数
//主函数***************************************************
void main()
{
 CMCON=7;
 OPTION=0B00000011; //分频比为1:16,
 TRISIO=0B11111110;
 GPIO=0B00000000;
 WPU=0;
 T0IF=0;
 GIE=1;
 T0IE=1;
 while(1){
   if(jc)OSCCAL=0xFF;
   else OSCCAL=0;
 }
}
//中断函数*************************************************
void interrupt zd()
{
 T0IF=0;
 out=!out;
}

程序其实很简单,就是在中断中让out脚的电平翻转,翻转的时间为4096个指令周期,电平周期为8192个指令周期。而指令的周期又决定于RC时钟频率。在主程序中,不断的检测JC端口的电平,然后根据此端口电平的值修改OSCCAL寄存器的值。当然,最后从OUT脚的波形周期上反映出了OSCCAL寄存器的值改变。

经用示波器测量(抱歉,手边没有频率计),JC端接地时,OUT端的电平周期为9.5毫秒左右;而JC端接正电源时,OUT端的电平周期为6毫秒左右。也就是说OSCCAL的值越大,单片机的时钟频率越高。并且,这个变化范围是很大的,因此,如果使用PIC单片机的内部RC振荡器时,对其振荡频率进行校正是十分必要的。这也是我在做滚动码接收解码器时,产品离散性很大的原因。望大家以后使用内部RC振荡器时能够注意到此点。

但还有一点要注意,即使你对RC振荡器进行了校正,你也别指望这个4MHz的RC振荡器肯定会很标准,实际上它还是一个RC振荡器,它的振荡频率是电压、温度的函数,也就是说这个振荡频率会随着电压和温度的变化而变化,只是经校正后的值更接近4MHz罢了,这在产品开发的一开始就要注意的。
关键字:PIC单片机  内部RC振荡器  校准 引用地址:PIC单片机的内部RC振荡器的校准

上一篇:PIC18F97J60 TCP/IP改了IP后重连问题
下一篇:PIC单片机端口电平变化中断使用必须注意的问题

推荐阅读最新更新时间:2024-03-16 15:19

基于PIC16F877A单片机的一种车载红外夜视仪设计
0 引言 随着汽车市场的快速发展和安防意识的日益强化,人们对汽车安全保障技术的要求越来越高,而现有汽车照明系统在雪夜、雪天或大雾等能见度较低情况下视距不远、效果不佳的弊病成为汽车行驶的安全隐患之一。更严重的是在夜晚行车时,驾驶员通常会被对方车辆的灯光干扰出现盲区,容易发生车祸。夜视系统却可以在黑暗中帮助驾驶员导航,使驾驶员在有灯光和黑暗两种情况下都能看清驾驶环境。因此开发一种结构简单、性能稳定、可靠性好、适用性强的汽车红外夜视系统,具有重要的市场应用前景。 1 系统总体设计 1)系统原理 根据工作原理的不同,红外夜视系统分为被动红外夜视系统和主动红外夜视系统。主动红外夜视系统利用其所携带的红外光源主动照射目标,由光学系
[单片机]
基于PIC16F877A单片机的一种车载红外夜视仪设计
如何使用PIC单片机扩展8255A并口
#include __CONFIG(0x3B31); #defineA0RB0 #defineA1RB1 #define CSR B2 #defineLERD0 #defineWRRD6 #defineRDRD7 constunsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//0-F-全灭-共阳极数码管 unsignedchartmp[]={0,0,0,0,0,0,0,0}; voiddelay1ms(unsignedintx) { unsignedchari; f
[单片机]
如何使用<font color='red'>PIC单片机</font>扩展8255A并口
PIC单片机之PWM原理
1,什么是PWM 什么是PWM,专业点说脉宽调制,通俗点说 就是不断的输出高低电平。 比如 单片机 40ms的时间 输出高电平然后60ms的时间 输出低电平接着一直不断周期性的交替输出高低电平 这就是典型的PWM波。高电平输出的时间40ms就是传说中的脉宽,40ms+60ms=100ms 便是PWM的周期。假定我们把周期定为100ms.我们可以根据我们的需要 把高电平的时间加大或者减小,比如 高电平输出时间加大为80ms.那么低电平的时间就变为20ms. 也可以 高电平输出时间减小为20ms.那么低电平的时间就变为80ms.这即是脉宽调制 调的便是这高电平的时间。 而高电平(脉宽)在周期中,所占用的时间比例 就被称为占空比。用
[单片机]
触摸传感器QST108与PIC单片机的接口设计
触摸传感器QST108与PIC单片机的接口设计 1 概 述 QST108是意法半导体公司针对人机界面的触摸按键控制而推出的电容触摸传感器。 其工作原理采用了美国昆腾公司的电荷转移电容专利技术(QProx),支持8个独立按键,且可选择按键状态检测输出或I2C总线控制2种正常工作方式;同时,通过软件命令可使其进入低功耗模式,当有按键按下时可被唤醒。QST108特有的相邻按键抑制算法使得一个按键在按下未松开时,其他按键处于无效状态;自校准和自动漂移补偿功能使其无须人工校准,从而进一步降低了QST108的应用难度。引脚配置如图1所示,各引脚功能如表1所列。 2 QST108的工作方式 2.1 按键状态检测输出方式
[单片机]
触摸传感器QST108与<font color='red'>PIC单片机</font>的接口设计
PIC单片机键盘扫描汇编程序
;本程序用于PIC单片机外接键盘的识别,通过汇编程序,使按下K1键时第一个数码管显示1,按下K2键时第一 ;个数码管上显示2,按下K3键时第一个数码管上显示3,按下K4键时第一个数码管上显示4, ;汇编程序对键盘的扫描采用查询方式 LIST P=18F458 INCLUDE "P18F458.INC" ;所用的寄存器 JIANR EQU 0X20 FLAG EQU JIANR+1 ;标志寄存器 DEYH EQU JIANR+2 DEYL EQU JIANR+3 F0 EQU 0 ;FLAG的第0位定义为F0 ORG 0X00 GOTO MAIN ORG 0X30 ;*************以下为键盘码值转换表**********
[单片机]
YOKOGAWA 发布高精度、高效率压力校准器CA700
Yokogawa Meters & Instruments Corporation发布压力校准器CA700。此款校准器可以高效校准差压压力变送器等现场设备,在同类便携式校准器中拥有最高的测量精度。 开发背景 工厂通常会用到大量的差压压力变送器和压力开关等现场设备,为了保持这些设备的测量精度,必须进行定期校准。在现场校准这些设备时,需要使用压力校准器。 随着稳定和安全运营意识的日益增强,工厂越来越关注现场设备的日常维护和检修,要求压力校准器既能高效完成校准作业,又能保持作业水准。另外,现场设备的精度越来越高,工厂希望压力校准器本身能拥有更高的精度和更好的性能。为了满足这些需求,横河公司开发了压力校准器CA700。 产
[测试测量]
PIC单片机红外遥控编码与解码的问题分析
一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样 PIC单片机接收时: 如果用54,57这类片子做的话有一定的难度(假如要做成实时控制的;比如说你还要驱动显示,驱动步进电机,在加上几个按键)原因就是这类片子没有中断 例程如下(用来解6221;分频比为256) RF: BTFSC PORTB,2;;B2口用做接收口 GOTO RF1 BTFSS DOWNBIT;;检测下降沿标制 CLRF RTCCOUNT BSF DOWNBIT;制下降沿标制 BTFSS UPBIT;;检测上升沿标制 RETLW 0 BTFSC IDBIT;;检测码头标制 GOTO RF3 MOVLW 2AH SUBWF RTCCOU
[单片机]
基于PIC单片机花样彩灯控制器程序设计
1.带进位位(C)的寄存器f内容左移循环指令 格式: RLF f.d 其中d=1,结果→f;d→0,结果→w,功能如下图所示。 2.带进位位(C)的寄存器f内容右移循环指令 格式:RRFf.dd的取值同上,功能如下图所示。 利用循环指令和多种送数和延时循环程序,设计PIC单片机的花样彩灯控制器,是最容易和最简单的事例。 鉴于花样彩灯的软件设计简单,这里例举的花样彩灯控制器的源程序,自定义文件名为PIC07.ASM,其源程序清单如下: 说明: (1)上述花样彩灯的源程序约80余条,用PIC16F84A单片机B口上的LED作模拟显示,产生不同花样共5种的LED闪亮。 (2)若要将该花样彩灯制成产品
[单片机]
基于<font color='red'>PIC单片机</font>花样彩灯控制器程序设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved