同步电动机运行稳定性和可靠性对工业生产有重要的影响。单片机用于同步电动机励磁控制,由于软件丰富,能使励磁装置结构简化、功能增多且易于实现复杂的控制规律,同时还具有参数整定灵活,使用维护方便和故障自诊断功能。目前,国内许多基于单片机的同步电动机励磁控制系统与传统的模拟励磁控制系统相比性能有很大的提高,但因为采用的单片机内部资源较少使得单片机外围电路复杂,其内部控制程序采用查表的方法,这样影响了整个励磁控制系统的精度、快速性和稳定性。PIC16F877单片机内部资源丰富,广泛应用于工业控制领域。我们研制了基于PIC16F877单片机的同步电动机新型智能励磁控制系统,控制程序可以实时计算,利用内部的捕捉单元可以很容易实现自动投励、全压投切电路。同时我们通过控制晶闸管移相整流模块的控制端电压来控制整流模块的输出,使得整个系统硬件电路简单、调试维护方便、系统性能较高。
PIC单片机简介
1.PIC单片机(Peripheral Interface Controller)是一种用来开发和控制外围设备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。与人类相比,大脑就是CPU,PIC 共享的部分相当于人的神经系统。
2.PIC单片机是一个小的计算机。
3.PIC单片机有计算功能和记忆内存像CPU并由软件控制运行。然而,处理能力—般,存储器容量也很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。
时钟频率与扫描程序的时间和执行程序指令的时间有关系。但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变(1*)。如果是同样的体系结构,时钟频率较高的处理能力会较强。
PIC单片机详细介绍
这里用字来解释程序容量。用一个指令(2*)表示一个字。通常用字节(3*)来表示存储器(4*)容量。一个字节有8位,每位由1或0组成。PIC16F84A单片机的指令由14位构成。当把1K个指令转换成位为:1 x 1,024 x 14 = 14,336位。再转换为字节为:14,336/(8 x 1,024) = 1.75K。在计算存储器的容量时,我们规定 1G 字节 = 1,024M 字节, 1M 字节 = 1,024K 字节, 1K 字节= 1,024 位. 它们不是以1000为倍数,因为这是用二进制计算的缘故。
1*计算机的物理结构,包括组织结构、容量、该计算机的CPU、存储器以及输入输出设备间的互连。经常特指CPU的组织结构,包括它的寄存器、标志、总线、算术逻辑部件、指令译码与执行机制以及定时和控制部件。
2*指出某种操作并标识其操作数(如果有操作数的话)的一种语言构造
3*作为一个单位来操作(运算)的一个二进制字符串,通常比计算机的一个字短。
4*处理机内的所有可寻址存储空间以及用于执行指令的其它内存储器。
在计算存储器的容量时,我们规定 1G 字节 = 1,024M 字节, 1M 字节 = 1,024K 字节, 1K 字节= 1,024 字节. 它们不是以1000为倍数,因为这是用二进制计算的缘故。
用PIC单片机使电路做的很小巧变得可能。
因为PIC单片机可以把计算部分、内存、输入和输出等都做在一个芯片内。所以她工作起来效率很高、功能也自由定义还可以灵活的适应不同的控制要求,而不必去更换不同的IC。这样电路才有可能做的很小巧。
PIC单片机命名规则
PIC XX XXX XXX (X) -XX X /XX
1 2 3 4 5 6 7 8
1.前缀: PIC MICROCHIP 公司产品代号,特别地:dsPIC为集成DSP功能的新型PIC单片机
2.系列号:10、12、16、18、24、30、33、32,其中
PIC10、PIC12、PIC16、PIC18为8位单片机
PIC24、dsPIC30、dsPIC33为16位单片机
PIC32为32位单片机
3.器件型号(类型):
C CMOS 电路
CR CMOS ROM
LC 小功率CMOS 电路
LCS 小功率保护
AA 1.8V
LCR 小功率CMOS ROM
LV 低电压
F 快闪可编程存储器
HC 高速CMOS
FR FLEX ROM
4.改进类型或选择
54A 、58A 、61 、62 、620 、621
622 、63 、64 、65 、71 、73 、74
42 、43 、44等
5.晶体标示:
LP 小功率晶体,
RC 电阻电容,
XT 标准晶体/振荡器
HS 高速晶体
6.频率标示:
-02 2MHZ,
-04 4MHZ,
-10 10MHZ,
-16 16MHZ
-20 20MHZ,
-25 25MHZ,
-33 33MHZ
7.温度范围:
空白 0℃至70℃,
I -45℃至85℃,
E -40℃至125℃
8.封装形式:
L PLCC 封装
JW 陶瓷熔封双列直插,有窗口
P 塑料双列直插
PQ 塑料四面引线扁平封装
W 大圆片
SL 14腿微型封装-150mil
JN 陶瓷熔封双列直插,无窗口
SM 8腿微型封装-207mil
SN 8腿微型封装-150 mil
VS 超微型封装8mm×13.4mm
SO 微型封装-300 mil
ST 薄型缩小的微型封装-4.4mm
SP 横向缩小型塑料双列直插
CL 68腿陶瓷四面引线,带窗口
SS 缩小型微型封装
PT 薄型四面引线扁平封装
TS 薄型微型封装8mm×20mm
TQ 薄型四面引线扁平封装
pic单片机选型技巧
(1)“芯片含有(功能或数量)略大于设计需求”,“设计需求尽可能(用)芯片完成(少用外围器件)”; (2)“选大(大厂)不选小,选多(供应量多)不选少,选名(名牌)不选渺(飘渺,不知详情的厂子),选廉(廉价)但要好(质量保证)”。具体要从单片机应用的技术性、实用性和开可发性等方面来考虑:
1、内存
单片机FLASH的容量根据程序的大小确定,FLASH容量必须大于代码量。举例来说,如果你的代码量大约50 KB,那么建议你选择FLASH容量为64 KB或128 KB的单片机。
2、速度
单片机的运行速度首先看时钟频率,一般情况对于同一种结构的单片机,时钟频率越高速度越快。如果你的设计对速度要求很高,那么要选择一个运行速度较快的单片机。例如,一般情况下,电机控制应用大多采用100ksps或更高的采样速率,因此当单片机用于电机控制时,时钟频率要足够高。总之,在选用单片机时要根据产品需要选择时钟频率,不要片面追求高速度,时钟频率越高功耗也就越大。此外,单片机的稳定性、抗干扰性等参数基本上跟单片机的运行速度成反比。因此,要尽量寻找可以在很高的时钟频率下运行而功耗又不高的单片机。
3、外设需求
如果你的设计需要ADC、SPI、GPIO、USB等之类的外设,那么你需要寻找一款集成所有这些外设的单片机。因为,使用一个具有上述外设的单片机显然比使用一个普通的单片机及外围加一个单独的ADC更为经济。此外,外设集成于单片机同时也意味着更低的功耗,因为没有可以产生功耗的外围电路,也没有用于连接外围电路的能产生功耗的敷铜,只有单片机本身产生功耗。
4、方便的开发工具
这是个非常重要的方面,因为开发工具可以极大地影响你所设计的产品的功耗。很多公司都已经开发出了具有代码优化功能的编译器,所以当你编译代码的时候,编译器会告知具体编译信息,你可以根据编译信息优化代码以降低功耗。举例来说,如果你的设计需要用到ADC、UART和GPIO等外设,你就需要初始化这些器件,但是设计中使用UART是有条件的(仅用于调试时显示结果),此时编译器会提示你禁用这个外设以降低功耗。必须得说这种智能化的开发工具对开发者来说是一种福音。
5、未来需求和兼容性
设计者在设计产品时需要考虑产品未来可能需要升级等之类的问题。例如,若需要给设计增加某些功能,那么可能需要增加内存、外设等,还可能需要加提高单片机的运行速度。因此,在单片机的选型上需要在当前设计需求以及未来设计上寻找平衡,以满足不同程度的要求。
6、成本
一个好的设计不仅要功能完善,而且要满足成本要求,如果无法控制成本,再好的设计也是枉然。因此,需要尽可能地降低单片机甚至整个产品的成本。
7、工作电压(VCC)
单片机的工作电压是指可以让其正常工作所需要提供的电压。工作电压越高,单片机的功耗也就越大。因此,为了降低产品功耗,必须要尽可能地降低工作电压。
除此之外,我还要建议设计者根据具体产品需求选择合适芯片架构。若仅是个简单的控制应用(如照明系统、电子玩具等),那么并不需要一个像ARM那样具有复杂架构的芯片。此外,对于低功耗设计,单片机必须具有睡眠模式,基于中断操作的睡眠模式/低功耗模式的使用是降低功耗的一个标准的行业惯例。
最后再来一句老生常谈:不要拘泥与芯片是否先进,单片机只是一个工具,真正的功夫在于你的专业知识,要用最合适的芯片做出最合适的产品。
PIC单片机常用指令
#include 或 include
#include 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM 能够识别的。最经常被“include”的是针对 PIC 单片机内部特殊功能寄存器定义的包 含 头 文 件 , 在MPLAB安 装 后 它 们 全 部 放 在 路 径 “ C:Program FilesMPLAB IDEMCHIP_Tools”下,每一个型号的 PIC 单片机都有一个对应的预定义包含头文件,扩展名是“.inc”。除了一些符号预定义文件,你也可以把现有的其它程序文件作为一个代码模块直接“包含”进来作为自己程序的一部分。见例 3-01。
#include 把预定义的 PIC16F877A 寄存器符号包含到此处
#include ”math.asm” 把现有的程序文件包含进来作为自己代码的一部分
例 3-01
请注意被包含文件的引用方式。一种是《》尖括号引用,这种引用意味着让编译器去默认的路径下寻找该文件,MPASM默认的寄存器预定义文件存放路径即为上面提及的MPLAB 安装后的目录;另一种是””双引号引用,这种引用方式的意思是指示编译器从引号中指定的全程文件路径下寻找该文件。例 3-01 中”math.asm”没有指定路径,即意味着在当前项目路径下寻找 math.asm 文件。如果编译器找不到被包含的文件,将会有错误信息告知。请在你的源程序中尽量用 MPLAB 标准头文件定义的寄存器符号。一来这些被定义的寄存器符号和芯片数据手册上的描述一一对应,理解起来即直观又容易;二来如果用你自己定义符号就缺乏一个大家能一起交流的标准平台,其他人要解读你的代码时将费时费力。故例3-01 中的首行#include 包含引用伪指令可以说是 PIC 单片机程序编写时的标准必备。
list
list 伪指令可以设定程序编译时的一些信息,例如所选单片机的型号,编译时选择的缺省数制等。例如:
list p=16f877a, r=DEC 单片机型号为 PIC16F877A,无特别指明的数字为十进制数
例 3-02
如果程序开发时使用项目管理的模式,则所有 list 伪指令可以描述的参数项都可以在项目的设定选项中通过对话框的形式设定并保存。在此只需对 list 伪指令稍作了解即可。
__config
此伪指令的重要作用是把芯片的配置字设定在源程序中,请参阅 2.5 节的详细说明。建议大家尽量用此伪指令把芯片的配置字写在程序中。
__idlocs
PIC 单片机中有一处非常特殊的标记单元。它独立于任何其它存储器,唯一的作用就是作为一个标记。此标记值无法用软件读到,读取和写入的方法只有通过编程器实现。此标记值没有读保护,你可以利用它存放程序的版本或日期等信息。如果需要,则可以用伪指令 __idloc 在程序中定义具体的值。
__idloc 0x1234
设定芯片的标记值为 0x1234,注意前面有两个下划线符
例 3-03
和__config 伪指令定义的配置字一样,用__idloc 定义的芯片标记值在最后也会存放在HEX 文件中,这就要求编程器能够解析它。
errorlevel
errorlevel 的用途是控制编译信息的输出显示。编译器在编译你的源程序时会提供很多信息,有些信息是你必须要处理的,例如错误信息(Error),只要有错误信息存在,你的程序将永远无法完成编译;有些可能只需要关注,例如警告信息(Warning);也有一些可能你根本就不感兴趣,它们只是一些提示信息(Message)而已。注意出现警告和提示信息时将不会中止编译器的编译工作,你的程序将被编译并最终产生 HEX 文件。图 3-14 中显示了一个程序编译后的各种信息实例,其中既有错误信息,也有警告和提示信息。我们可以用errorlevel 伪指令来控制输出信息的级别,或刻意关闭/打开一些提示信息。
编译信息的输出显示级别有三种,分别是 0、1 和 2。级别 0 代表显示所有信息,包括各种错误、警告和提示信息,如图 3-14 所示;级别 1 代表显示错误和警告信息,忽略提示信息;级别 3 代表只显示错误信息而忽略警告和提示信息。在任何一个大的级别上还可以对某些信息单独设定显示或关闭。每个信息都有一个识别标号,见图 3-14 中信息项“[]”中的数字,打开或关闭某类信息只需在 errorlevel 伪指令中引用信息识别标号,并在其前面用“+”或“-”号,即代表打开或关闭这一类信息,例如:
errorlevel 0, -302, -305 显示所有信息,但不需要 302 和 305 这两类提示信息
errorlevel 1, +305 显示错误和警告信息,但同时还要关注 305 类的提示信息
#define / #undefine 例 3-04
#define 的作用是定义常数符号,即用一个符号变量替换另一个符号串或变量。被替换的可以是任意字母数字组成的符号但替换者本身不能是一个纯数字。例如:
#define DELAY_TIME 1000 定义常数符号,即用 DELAY_TIME 符号代替 1000
#define KEY1 PORTB,7 用 KEY1 符号代替端口 PORTB 的第 7 引脚 例 3-05
用#define 伪指令定义符号后,可使程序中的变量或指令变得更具实际意义,也使程序变得更易维护。
指令“btfss PORTB,7”和“btfss KEY1”在事先用了例 3-05 中的#define 后编译的结果是一样的,但明显地后者看起来更容易理解,一看就知道这是在测试编号为KEY1 的一个按键。
PIC指令功能分类表
类型 助记符 操作说明 命令说明
传 送 类 MOVF F,dF→d 将F寄存器的内容传送到F本身(d=1)或W(d=0)(影响状态位)Z
MOVWF FW→F 将W寄存器的内容传送到F,W内容不变-
MOVLW KK→W 将8位立即数传送到W寄存器-
SWAPF F,dF半字节交换→dF寄存器的高4位和低4位交换位置后,结果存入F本身(d=1)或W(d=0)中-
算 术 运 算 类 ADDWF F,dF+W→dW寄存器的内容和F寄存器的内容相加,结果存入F(d=1)或W(d=0)中C,DC,Z
ADDLW F,dK+W→WW寄存器的内容和8位立即数相加,结果存入WC,DC,Z
INCF F,dF+1→dF寄存器的内容加1后,结果存入W(d=0)或F(d=1)中Z
SUBWF F,dF-W→dF寄存器的内容减去W寄存器的内容,结果存入W(d=0)或F(d=1)中C,DC,Z
SUBLW KK-W→W8位立即数减掉W寄存器的内容,结果存入WC,DC,Z
DECF F,dF-1→dF寄存器的内容减1后,结果存入W(d=0)或F(d=1)中Z
逻 辑 运 算 类 ANDWF F,dF∧W→dW寄存器的内容和F寄存器的内容相与,结果存入F(d=1)或W(d=0)中Z
ANDLW KK∧W→WW寄存器的内容和8位立即数相与,结果存入WZ
IORWF F,dF∨W→dW寄存器的内容和F寄存器的内容相或,结果存入F(d=1)或W(d=0)中Z
IORLW KK∨W→WW寄存器的内容和8位立即数相或,结果存入WZ
XORWF F,dF⊕W→dW寄存器的内容和F寄存器的内容相异或,结果存入F(d=1)或W(d=0)中Z
XORLW KK⊕W→WW寄存器的内容和8位立即数相异或,结果存入WZ
COMF F,dF取反→dF寄存器的内容取反后,结果存入F(d=1)或W(d=0)中Z
CLRF F0→F,寄存器复位F寄存器的内容被清为全0Z
CLRW -0→W,寄存器复位W寄存器的内容被清为全0Z
RLF F,dF带C循环左移→d将F寄存器带C循环左移,结果存入F本身(d=1)或W(d=0)。C
RRF F,dF带C循环右移→d将F寄存器带C循环右移,结果存入F本身(d=1)或W(d=0)。C
BCF F,B将F中第B位清0将寄存器的第B位清为0-
BSF F,B将F中第B位置1将寄存器的第B位置1-
程 序 跳 转 类 INCFSZ F,dF+1→d,结果若为0则跳一步F寄存器的内容加1后,结果存入F本身(d=1)或W(d=0)。如结果为0则跳过下一条指令,否则顺序执行-
DECFSZ F,dF-1→d,结果若为0则跳一步F寄存器的内容减1后,结果存入F本身(d=1)或W(d=0)。如结果为0则跳过下一条指令,否则顺序执行-
BTFSC F,BF中第B位为0,则跳一步测试F寄存器的第B位。若F(B)=0,则跳过下一条指令,否则顺序执行-
BTFSS F,BF中第B位为1,则跳一步测试F寄存器的第B位。若F(B)=1,则跳过下一条指令,否则顺序执行-
CALL K调用子程序首先将PC+1推入堆栈,然后将11位常数K送入PC(10~0),同时将PCLATH(4,3)→PC(12,11),从而使PC=子程序入口地址-
GOTO K 无条件跳转将11位常数K送入PC(10~0),同时将PCLATH(4,3)→PC(12,11),从而使PC=新地址-
RETURN -从子程序返回将堆栈顶端单元的内容弹出并送入PC,从而返回主程序断点处-
RETLW KW带参数子程序返回将堆栈顶端单元的内容弹出并送入PC,同时8位常数K→W,从而带着参数返回主程序断点处-
RETFIE -从中断服务子程序返回将堆栈顶端单元的内容弹出并送入PC,从而返回主程序断点处,同时将全局中断使能位GIE置1,从新开放中断-
控 制 类SLEEP -进入睡眠方式该指令执行后,单片机进入低功耗睡眠模式,时基电路停振TO,PD
CLRWDT -0→WDT将WDT寄存器和分配给它的预分频器同时清为全0TO,PD
NOP -空操作空操作