蓄电池管理设计毕业论文.doc_第1页
蓄电池管理设计毕业论文.doc_第2页
蓄电池管理设计毕业论文.doc_第3页
蓄电池管理设计毕业论文.doc_第4页
蓄电池管理设计毕业论文.doc_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

蓄电池管理设计毕业论文目 录中文摘要IAbstractII第一章 绪论11.1 任务背景11.2任务内容11.3 工具软件介绍11.3.1 集成开发环境MPLAB IDE v8.6311.3.2 C语言编译器 HI-TECH C for PIC10/12/16 v9.821.3.3 在线调试烧写器 PICkit 32第二章 系统方案及设计42.1不间断高频直流开关电源系统方案42.2 不间断高频直流开关电源控制方案4第三章 程序设计规范63.1 代码规范63.2 模块化思想63.3 分层思想6第四章 基本功能模块设计84.1 单片机的系统初始化84.1.1单片机的工作速度选择84.1.2 内部振荡器速度的设置方法94.2 AD模块104.2.1 ADC时钟周期(TAD)的设定104.2.2 AD转换时间计算114.2.3 ADC的控制寄存器124.2.4 ADC初始化程序134.2.5 ADC 采样一个通道的函数设计134.3 TC1047A模块144.3.1 TC1047A采样结果转换为实际温度值144.4 RS485通讯模块154.4.1 RS232介绍154.4.2 RS485介绍174.4.3 EUSART通讯的程序设计194.5 蜂鸣器模块264.5.1 蜂鸣器的程序设计27第五章 内阻检测模块设计305.1测试原理305.2测试电路305.3测试流程315.4 结果计算325.5 仿真测试33结论35参考文献36谢辞37附录1 主要的初始化程序38附录2 内阻检测仿真用程序41附录3 内阻检测仿真用电路4343智能电网分布式直流开关电源研制-蓄电池管理第一章 绪论1.1 任务背景蓄电池在工业领域使用广泛,尤其在对供电要求严格的场合。蓄电池主要有四类:密封铅酸电池(SLA)、镍镉电池(NiCd)、镍氢电池(NiMH)、锂电池(Li-Ion)。锂电池与其他电池相比有能量密度高、电池寿命长、单体额定电压较高、具备高功率承受能力、自放电率低、无记忆效果、不含汞铬等有毒元素的环保电池。但是锂电价格较昂贵,充电要求严格的因素,在工业上的使用比较少。生活中锂电池常用于笔记本电脑、手机等便携设备中。随着技术的发展,研究的深入,锂电池的成本一定会在不久的未来降下来,将成为蓄电池的主流。锂电池不能耐受过充,过充不仅会损坏电池,而且会发生爆炸。所以锂电池对充电要求比较严格,必须对充电过程进行精确的控制。使用数字化控制的方法,有助于锂电池的推广使用。使用单片机作为控制系统的核心,实现数字化管理的项目越来越多。这里也将使用PIC单片对系统部部份模块实现数字化管理。1.2任务内容本设计课题要求设计一个智能电网用分布式高频开关电源的锂电池电源管理模块。主要是实现电池内阻的检测,然后分析内阻与电池容量的关系。电池的内阻和容量检测需要使用单片机来实现,这里使用了PIC16F1934单片机,通过对电池内阻检测模块的控制,实现电池内阻的检测。这款单片机作为控制电路的一个重要部份要对控制电路其他的功能模块进行管理,也是这次这重要任务之一。最终实现了大部分功能模块的功能,并对蓄电池内阻检测进行了仿真。1.3 工具软件介绍1.3.1 集成开发环境MPLAB IDE v8.63MPLAB IDE是Microchip公司官方研发的单片机集成开发环境。它提供建立工程、编写程序、调试程序和烧写程序等众多功能。最新的版本能够支持该公司所有发行的单片机。该软件可以免费使用,并且内置的汇编编译器也是免费的。为使用者提供了巨大的方便。图1-1 MPLAB IDE 软件界面1.3.2 C语言编译器 HI-TECH C for PIC10/12/16 v9.8过去单片机的开发都是使用汇编语言,编程前需要学习汇编指令。用汇编写程序非常繁琐。不仅程序可读性差,且不容易查错,开发效率较低。C语言相比汇编语言有着很多的优点,代码量少、可读性强、移植性好,越来越受使用者欢迎。C语言编译器的性能好坏,直接影响到C语言在单片机程序开发上的应用程度。C语言编译器的出现有多年了,现在HI-TECH C编译器的性能已经能够满足大部分程序开发的需求,逐渐的取代了汇编语言。用它编译出的程序的效率能够达到汇编程序效率的90%以上,有些代码编译后效率超过汇编程序也是有可能的。因为C编译器提供了对代码优化的功能。HI-TECH C提供了免费版本,用户不用花一分钱就可以使用到如此强大的编译器。本文将使用最新的v9.8版本来开发程序。1.3.3 在线调试烧写器 PICkit 3PIC系列的单片机提供在线调试的功能,但必须使用调试器。Microchip公司开发了ICD2、ICD3、PICkit2、PICkit3、REAL ICE等在线调试器。不同调试器支持的芯片各有不同,性能价格也不同。ICD2使用的人数较多,但是目前已经停产了且不支持本文中使用的PIC16F1934单片机,所以选择了能够支持这款单片机且价格较便宜的PICkit3。在MPLAB IDE软件打开时连上调试器,可以对调试器固件进行更新,使其能够支持后期推出的单片机。图1-2 PICkit3外形图第二章 系统方案及设计2.1不间断高频直流开关电源系统方案本课题的智能电网分布式高频直流开关电源总体结构如图2-1。系统方案工作原理为:当电网正常供电时,先经过AC/DC转为母线电压为36V直流电,母线路直接输至DC/DC模块,另一路通过DC/DC降压单元给24V蓄电池充电。当电网断电时,母线电压将跌落,当母线电压小于蓄电池电压时,蓄电池与母线间的二极管导通,蓄电池给DC/DC模块供电,由于转换过程无延迟时间,从而可实现不间断供电。蓄电池(24V)AC/DCDC/DCDC/DC负载(24V,48V,110V,220V)DC/DC降压母线:36V单片机模块报警、人机界面、液晶显示等RS485电网充电管理均流、保护通讯图2-1 智能电网分布式高频直流开关电源总体结构图2.2 不间断高频直流开关电源控制方案本系统需要实现的功能比较多,部份功能将使用单片机来实现。单片机模块主要用于蓄电池管理、DC/DC降压充电管理、DC/DC输出均流和保护、通讯、告警、人机界面和液晶显示等功能。实现这么多功能需要一款高性能的单片机,这里选择了Microchip公司的PIC16F1934单片机。这是一款8位单片机,工作速度最高达32MHz,外部有44引脚,14路10位A/D转换通道,1个EUSART。基本能够满足本系统的控制要求。本课题主要研究的内容有以下几个方面。蓄电池管理:用单片机对对蓄电池内阻进行测试,然后设计实验测试单片机内阻与容量的关系,最终能够通过检测蓄电池内阻得出他它相应的剩余电量值。DC/DC降压充电模块:这个DC/DC模块用专门电源管理芯片控制,单片机对其工作状态进行监控,若发现故障,要能够实现保护和报警。DC/DC输出均流和保护:该模块要检测各个DC/DC输出模块发现故障能进行报警,并且在故障时能够实施保护。对并联输出的DC/DC模块实现均流控制。RS485模块:使用单片机自带的串口模块,实现将重要数据发送给上位机。人机交互模块:用单片机实现LCD的显示,并通过按键实现多个数据的查看切换。第三章 程序设计规范3.1 代码规范在程序中每一个变量和函数都有其特别的意义。为了防止变量名、函数名的命名冲突和名称没有特别含义,就必须有一个特别的命名规范。这样在一个大的系统中,使用的大量变量时能够做到不混淆,望名生义。这对程序的开发有非常重要的意义。变量命名:使用与变量作用相关几个单词拼接而成,单词的首字母大写。函数名的命名:由3部份组成。前面部分统一的模块名称,全部大写。中间用下划线连接。后面部分用与函数功能相关的单词连接而成,单词首字母大写。3.2 模块化思想模块化就是把一个模块的的代码独立出来。对模块的功能进行分析,对模块的最基本功能进行封装。对外提供几个功能单一的函数,但这些函数又能完成这个模块的所有操作。当其他模块要用到这个模块时可以直接调用,而不需要对代码进行修改,或者只是少量的修改。模块的封装可以得到一劳永逸的好处。3.3 分层思想如图3-1 在PC上开发一个大型的程序通常把程序分为三层:DAL数据访问层、BAL业务逻辑层、UI表现层。分层有利于系统的开发、维护、部署和扩展。通过分析这三层结构来推出适合于单片机上的分层结构。表示层:负责直接跟用户进行交互,一般也就是指系统的界面,用于数据录入,数据显示等。意味着只做与外观显示相关的工作,不属于他的工作不用做。 业务逻辑层:用于做一些有效性验证的工作,以更好地保证程序运行的健壮性。通过以上的诸多判断以决定是否将操作继续向后传递,尽量保证程序的正常运行。 数据访问层:就是用于专门跟数据库进行交互。所有的数据对象只在这一层被引用,除数据层之外的任何地方都不应该出现数据对象的引用。分层结构的优势就是只有相邻层的代码是相互关联的,而非相邻层的代码是没有关联的。比如UI层的开发与DAL层的开发无关,BL层与使用什么样的数据库无关。当更换数据库时,只需要修改DAL层的代码,BL层的代码无需做任何更改。这样可以方便移植。但是修改某一层的代码时必须保证其与相邻层的接口不能变,就是该模块能实现的功能和以前一样。所以分层程序设计需要先设计层与层之间的接口。分层结构也适合多人协作开发,因为每一层是相对独立的。如图3-2单片机系统的基础是硬件。要使用各个硬件模块,必须先对这些模块初始化,即进行驱动。在驱动层上面是应用层,应用层调用驱动层的函数,来实现对硬件的控制。如果驱动层能提供一致的向上接口。那么应用层的程序开发就可以不用考虑硬件的差异性。这样就开发出的代码可以轻松的移植到不同的单片机上。交互层在单片机系统中显得比较薄弱。因为单片机系统常设计成自动控制系统,通常不需要人对单片机的工作进行干预。主要是显示数据采样得到的电压、电流和工作状态等。如果要实现交互功能,就必须有LCD和按键配合使用。UIDAL数据库交互层应用层驱动层单片机图3-1 PC程序3层结构图3-2 单片机程序3层结构第四章 基本功能模块设计4.1 单片机的系统初始化4.1.1单片机的工作速度选择这款单片机的振荡器/时钟输入的频率为32 MHz,指令周期为125 ns。也就是它最大的工作速度为32MHz。在PIC16F系列的单片机中大部分单片机最大速度不到20MHz。这款单片机有着高达32MHz的速度,这是选择这款单片机的重要原因之一。为了充分发挥它速度的优势,我们就需要把它的工作速度设定为32MHz。如图4-1将速度设置为32MHz有两种方案:方案一:使用外接晶振在OSC1和OSC2之间接上8MHZ的晶振,然后通过内部4PLL倍频,使得系统的工作频率为32MHz。这种方法很通用,在过去大部分单片机系统中都是使用这种方案。外接晶振选择不同,可以使系统工作在不同的速度下。因为单片机的功耗与工作速成正比,所以在对功耗要求很严格,但对速度要求不高的场合,可以外接一个频率较小的晶振,来降低功耗。外接晶振不仅使得系统的工作频率变得很灵活,还可以提高定时器的精度。石英晶振有频率稳定这一特点。外接一个高精度的8MHz晶振。可以使得定时器定时精度更高。在系统使用了时钟功能时,长期工作也能保证时钟的准确。方案二:使用内部振荡器模块拥有有内部振荡器,是这款单片机的一大特色。内部振荡器提供三种频率16MHz、31KHz、500KHz。通过三个振荡器和后面的分屏器、倍频器可以输出31KHz到32MHz之间共13个频率供用户选择,分别是31KHz、31.25KHz、62.5KHz、125KHz、250KHz、500KHz、1MHz、2MHz、4MHz、8MHz、18MHz、32MHz。我们要要选择32MHz,但是这个频率比较特殊,它超过了内部振荡器的最高频率16MHz,必须通过倍频才能实现。但是整个振荡器模块只有一个4倍的倍频器。所以需要把16MHz的输入先2分频为8MHz,然后再通过4PLL倍频模块,最终实现使用内部振荡器为内部提供32MHz的工作频率。内部振荡器在出厂的时候已经被校正过,振荡器的误差都控制在1%以内,而且还提供了校正寄存器。用户在条件允许下可以自行校正。内部振荡器不仅频率丰富可供用户选择,而却精度也能够满足要求,更重要的是可以节省外部晶振,可以很有效的降低成本。总和以上两种方法,最终选择第二种方法。图4-1 时钟源简化框图4.1.2 内部振荡器速度的设置方法相关寄存器有两个:OSCCON(振荡器控制寄存器)和CONFIG1(其中的FOSC部分)。R/W-0/0 R/W-0/0 R/W-1/1 R/W-1/1 R/W-1/1 R/W-0/0 R/W-0/0 R/W-0/0SPLLENIRCF3IRCF2IRCF1IRCF0-SCS1SCS0 bit7 bit0图注:R = 可读位 W = 可写位 -n/n = POR 和BOR 时的值所有其他复位时的值1 = 置1 0 = 清零图4-2 OSCCON:振荡器控制寄存器CONFIG1是单片机的控制寄存器,在烧写程序的时候会把它的值写入对应的寄存器中,是在程序运行前就写好了,程序运行的时候是不可以修改的。其中的FOSC要设置为HFINTOSC,表示要使用内部振荡器作为系统的时钟频率来源。OSCCON震荡控制寄存器,与CONFIG寄存器不同,不可以在烧写程序时设定。若要修改它的值就必须在程序运行的时候进行修改。从图4-2的设置可以看出该寄存器在默认值时输出的频率不是32MHz,所以要在程序的运行时进行修改。(1) SCS:设置为0B00 表示时钟由CONFIG1FOSC 决定(2) IRCF:设置为 0B1110 使得振荡器分频后为8MHz(3) SPLLEN:设为 0B1 使用4PLL倍频模块即OSCCON=0B11110000这样就可以使内部振荡器为系统提供32MHz的频率源了。如图4-2默认时PLL为无效,通过设置SPLLEN=0B1,使得4PLL被启用。默认时IRCF=0B0111 此时系统工作频率为500KHz,设置为IRCF0B1110 后振荡器输出8MHz。如此实现了振荡器频率的变换。但是振荡器频率的变换不是一瞬间就可以完成的。通过查数据手册可以找到切换时间大约为2ms,所以在设置完这个寄存器后需要先关闭中断,延时个3ms。这样就能保证后面工作在32MHz的频率下。到此完成了系统初始化。4.2 AD模块 模数转换器(Analog-to-Digital Converter,ADC)可以将模拟输入电压值转换为一定位数的二进制数。如图4-3ADC框图。4.2.1 ADC时钟周期(TAD)的设定TAD 是用来控制ADC转换的基本时间单位。一个AD转换,是由若干个TAD周期来控制完成的。ADC转换的精度和速度与TAD的值密切相关。所以TAD的设置需要按照一定的要求。为了保证转换精度需保证TAD1.0us,为了保证速度建议TAD4.0us。为了提高速度,这里选择TAD1.0us。系统工作频率为32MHz选择TAD1.0us,则ADC时钟频率为1MHz(Fosc/32)。查表得设置ADCS=0B010 即可。图4-3 ADC框图4.2.2 AD转换时间计算AD转换在整个控制系统中占有重要的地位,通常AD转换后还要对得到的结果进行处理。所以AD模块对系统资源的消耗比较大。计算AD转换花费的时间,有利于对系统时序的把握,对整个系统的设计非常重要。完成一次ADC包含一下几段时间:采样时间、保持电容与模拟输入断开时间、准备转换时间、转换中时间。这四部份耗费的时间分别为:约100ns、1TAD、1TAD、10TAD。这是10位ADC模块,结果有10位,每转换1位需要耗费1个TAD,所以转换中耗费了10个TAD,且每次转换都是从高位开始转换,当最低位转换结束后,将结果转存到ADRESH:ADRESL寄存器中。完成1次AD转换时间:TADC=100ns+1TAD+1TAD+10TAD=12.1us4.2.3 ADC的控制寄存器R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0-CHS4CHS3CHS2CHS1CHS0GO/ADON Bit7 bit0图4-4 ADCON0:A/D控制寄存器0要使用ADC模块就要先设置 ADON=0B1 来开启ADC模块。这款单片机提供了14个对外ADC通道,要选择某一个通道进行AD转换,就要把CHS设置为对应的值。GO/设置为 0B1 时就会启动一次AD转换,但转换结束时GO/位将被自动清零。R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0ADFMADCS2ADCS1ADCS0-ADNREFADPREF1ADPREF0bit7 bit0图4-5 ADCON1:A/D控制寄存器1ADFM设置为 0B1,因为ADC的结果有10位所以结果存在ADRESH:ADRESL两个8位寄存器中,因为计算精度的需要,需要10位精度进行计算,所以选择右对齐。这样所得的结果就可以直接赋值给一个int型的变量进行计算。ADCS 设置为0B010 ,是这样使得TAD=1us。可以使ADC工作子在最快的速度。ADNREF 设置为 0B0 ,ADPREF设置为 0B00 ,这样采样模块的正负参考电压为单片机的VDD和VSS,这样不仅可以节省2个IO引脚还可以节省2个ADC通道。因为使用的参考电压来自单片机自身,而参考电压的稳定和精确度直接关系到采样结果的准确性,所以要求单片机有独立的供电,且有较高的稳定精度。单片机自身工作电压范围比较宽,但为了保证转换精度,这里选择5.0V作为单片机的工作电压。4.2.4 ADC初始化程序表4-1 ADC初始化程序设计函数名void ADC_Init( void ) 说明完成ADC转换的初始化输入参数无返回参数无AD的初始化有以下几个步骤要做:(1) 设定各个使用了AD功能的引脚的IO方向设为输入。如TRISA0=1。(2) 将各个使用了AD功能的引脚设置为模拟类型。如:ANSELA0=1。注意所有AD复用引脚默认都被设置为模拟类型,因为模拟类型比数字类型功耗更低。所以当要用于其他功能时一定要先设置为数字类型。(3) 设定ADCON1寄存器。ADCON1=0B10100000;(4) 设定ADCON0寄存器。ADCON0=0B00000001;这样初始化就完成了4.2.5 ADC 采样一个通道的函数设计表4-2 ADC的采样程序设计:函数名unsigned int ADC_One( unsigned char ch) 说明实现一次AD转换输入参数通道号返回参数10位ADC结果ADC采样一个通道的步骤:1) 将通道号ch设置到CHS。2) GO 位置1 ,开始采样。3) 检测ADIF位,等待转换结束。4) 将ADC得到的结果ADRES 返回。4.2.6 采样结果与实际电压的关系采样结果为10位二进制值,范围为:01023。输入电压为0V时,ADRES=0;输入电压为5V时,ADRES=1023; 输入电压为V时, 同时得到 4.3 TC1047A模块TC1047和TC1047A是线性电压输出温度传感器,其输出的电压与与实际温度有着线性关系。TC1047与TC1047A可以精确地测量从-40到+125之间的温度。TC1047的电源电压范围为2.7V至4.4V,然而TC1047A的电源电压范围为2.5V至5.5V。因为控制系统中提供的工作电压为5.0V,所以选择TC1047A作为温度检测芯片。TC1047A的典型输出电压为100mV( -40时) 、500mV( 0时) 、750mV (+25时) 和1.75V (+125时 )。10mV/的输出电压的斜率响应允许在宽温度范围内对预计温度进行测量。这个工作范围,适合测量控制电路板、蓄电池的温度,但不适合测量开关管的温度。TC1047A有3个引脚:VDD、Vss、Vout 。VDD、Vss为芯片提供工作电压。Vout为电压输出端,输出电压与温度成比例。TC1047A单片机ADCLCD显示VDDVOUTVss 图4-6 TC1047A温度检测拓扑如上图TC1047A模块的工作框图,工作步骤如下:(1) TC1047A 的Vout端输出与温度相对应的电压。(2) 单片机的ADC模块对这个电压进行采样。(3) 对采样的结果进行转换得到温度值。(4) 将温度发送给LCD进行显示。4.3.1 TC1047A采样结果转换为实际温度值TC1047A的输出电压随着以摄氏度为单位的温度变化而呈线性变化。温度斜率固定为10mV/并且在0时输出电压为500mV。如下图。图4-7 TC1047A输入电压与温度的关系得到计算公式:推出:又推出:为了提高运行速度,定义的各个变量都是整形,这样得到的温度就没有小数位,如果要保留一位小数,就要把Temp扩大10倍来计算:单片机在进行乘除运算的速度非常慢,这里决定把除以1023,变成除以1024。这样变换对结果的准确性影响很小。而除以1024,就可以用移位来计算。这样除以1024就变成了右移10位。除运算,会导致余数被舍去,这样精度就下降了,为了提高精度,还需要把移位放到最后进行运算。最终得到下面的公式:最后就是将这个数进行显示了。把10Temp的值进行BCD转换,输给LCD就行。4.4 RS485通讯模块4.4.1 RS232介绍RS-232是串行数据接口标准。通讯距离:9600波特率下建议在13米以内。RS232的抗干扰能力比较弱,传输距离短是RS232的一大缺点。所以要想提高传输距离就需要使用别的传输方式。RS485和RS232的基本的通讯机理是一致的,他的优点在于弥补了RS232 通讯距离短,而且还能进行多台设备同时进行联网管理。一般单片机都提供了串口模块通用同步/异步收发器(USART)。PIC16F1934提供了一个增强型通用同步/异步收发器(EUSART)。它包含用来完成与器件程序执行无关的输入或输出串行数据传输所需的所有时钟发生器、移位寄存器和数据缓冲区。可配置为全双工异步系统或半双工同步系统。全双工模式可用来与 CRT 终端和个人计算机等外部系统通信。半双工同步模式用于与A/D或D/A集成电路、串行EEPROM或其他单片机等外部器件通信。这些器件通常不具备用以生成波特率的内部时钟,并需要由主同步器件提供外部时钟信号。RS232的物理接头有公头和母头(插头上带针的俗称公头,带针孔的俗称母头)两种,如图4-8和图4-9。 图4-8公头 接线端子排序图 图4-9母头 接线端子排序图 插头上有9针,但是通常只用到3跟线。引脚2 RxD 接收数据引脚引脚3 TxD 发送数据引脚引脚5 GND 接地因为有RxD、和TxD两根数据线,两根线可以同时进行数据的传输互不影响,所以能够工作在全双工模式。4.4.2 RS485介绍因为RS232和RS485的基本的通讯机理是一致的,所以可以把RS232通讯接口转换为RS485。利用RS485的优点来提升传输的性能。将RS232转换为RS485需要用到专门的芯片。这里使用MAX485芯片。下面是MAX485的原理框图。 图4-10 MAX485原理框图RO:接收端,与RxD相连。DI:数据发送端,与TxD相连。:接收使能端,低电平有效。DE:发送使能端,高电平有效。A:接收器同向输入端,与另一个MAX485的A端相连。B:接收器反向输入端,与另一个MAX485的B端相连。Vcc:正电源:4.75VVCC5.25V。GND:地图 4-10 中R和D是两个差分放大器。将A、B两引脚上的电压进行差分放大。所以A和B两个引脚共同传输1组数据。同一时刻只能进行接收或发送数据。这样MAX485总线是工作在半双工模式下的。为了防止接收与发送数据发生冲突。需对和DE的电压进行控制,使MAX485工作在发送或接收状态。表4-3 MAX485工作状态设置引电 电平 引脚 10接收禁止接收使能DE发送使能发送禁止分析表4-3得到当和DE引脚上的电压相同时,MAX485只工作在接收或发送状态,不存在工作状态的冲突。所以为了方便在电路设计时把引脚和DE引脚相连,然后连到单片机上,这里定义这个控制引脚名为TREN。单片机通过控制这个引脚的电平高低来切换工作状态。当TREN=1时,工作在发送状态,当TREN=0时,工作在接收状态。图4-11 RS485的工作电路如图4-11 为RS485的工作电路。左边与单片机USART模块的TxD、TxD引脚和一个普通IO引脚相连。然后通过光耦隔离与MAX485芯片相连。然后右边通过A、B与RS485总线相连。单片机PC机USART光耦隔离MAX485RS232转RS485串口RS485总线图4-12 RS485模块电路拓扑单片机和PC机都是提供RS232的通讯接口,为了提高传输的距离等性能,把RS232通讯总线转为RS485通讯总线。但是传输的效果是一样的。4.4.3 EUSART通讯的程序设计4.4.3.1 EUSART控制寄存器设置EUSART相对于USART功能上有所增强,为此先从相应的控制寄存器入手一步步解析特性。主要的控制寄存器有TXSTA(发送状态控制寄存器)和RCSTA(接收状态控制寄存器)。R/W-/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R-1/1 R/W-0/0CSRCTX9TXENSYNCSENDBBRGHTRMTTX9D bit7 bit0图4-13 TXSTA寄存器参照图4-13对TXSTA寄存器进行的设置如下:(1) CSRC:时钟源选择位。与上位机通讯工作在异步模式,与这位无关。(2) TX9:9为发送使能位。设为0,选择发送8位数据。(3) TXEN:发送使能位。设为1,使能发送。(4) SYNC:工作模式选择位。设为0,与上位机通讯工作在异步模式。(5) SENDB:发送间隔字符。(6) BRGH:波特率选择位。设为1,高速。在后面将进行说明和计算。(7) TRMT:发送移位寄存器状态位。此位只读,1表示TSR为空,0表示TSR已满。通过检测此位来判断发送是否结束。(8) TX9D:发送数据的第九位,因为发送的是8位数据,所以此位无关。综上得:要设置TXSTA=0B00100100;R/W-0/ 0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R-0/0 R-0/0 R-x/xSPENRX9SRENCRENADDENFERROERRRX9Dbit 7 bit0图4-14 RCSTA寄存器参照图4-14对RCSTA寄存器进行的设置如下:(1) SPEN:串口使能位。设为1,使能串口的发送和接收。(2) RX9:9位数据接收使能位。设为0,因为采用8位数据通讯。(3) SREN:单字节接收使能位。工作在异步模式,此位无关。(4) CREN:连续接收使能位。设为1,使能连续接收。(5) ADDEN:地址检测位。只有使用9位数据时才有效。这里无关。(6) FERR:帧错误位。1表示接收发生错误。0表示接收正确。(7) OERR:溢出错误位。1表示溢出错误。0表示无溢出错误。(8) RX9D:接收数据的第9位。采用8位数据通讯,此位无关。综上得:要设置RCSTA=0B10010000;4.4.3.2 波特率的设置与计算计算机通讯是标准化的,为了使通讯能够正常有序的进行,通讯双方必须使用相同的速度。而控制通讯速度的量就是波特率。波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示,其单位是波特(Baud)。串口通讯中常用的波特率有4800、9600、19200等,这里选择常用的9600。PIC单片机没有专门产生波特率的振荡器,而是对系统时钟时钟进行定时产生的。 图4-15 波特率发生器框图图4-15为波特率发生器框图,其作用就是对系统时钟Fosc进行计数。计数的次数是由一个8位或16位的定时间器和它后面的倍频器组成的。定时器默认工作在8位模式,则SPBRG有效,SPBRGH无效,一次最多计数256个。若把BRG16位置1,则可以工作在16位模式,SPBRGH:SPBRG共同作用。计数最长为65536个。为了提高精度可以选择16位工作模式,所以这里把BRG16设为1。后面的倍频器有三种倍频模式:4、16、64。要想提高精度,就要选择尽可能小的倍频。系统的时钟Fosc=32MHz,要产生的波特率为9600。其中Fosc的分频比n为:n=32M9600=3333.33使用4的倍频模式将得到最高的精度,我们就先用最小的倍频4模式进行计算,看是否能够符合要求。n4=833.3推出:256833.365536所以要选用16位定时模式,符合要求。因为SYNC=0,所以设置:BRGH=1,BRG16=1。从图中看出:SPBRGH:SPBRG=833-1=832=0x0340设置:SPBRGH=0x03,SPBRG=0x40实际定时个数为833个,而准确的定时需求是833.3个,存在一定的误差,这个是难免的。误差:(833.3-833)833.3=0.04%误差很小异步通讯中没有影响。4.4.3.3 EUSART的初始化程序设计表4-4 EUSART初始化程序函数名void USART_Init( void )说明完成UASRT模块的初始化输入参数无返回参数无初始化步骤如下:(1) 定义TxD、RxD、TREN三个引脚的方向。(2) 设置波特利率(SPBRGH:SPBRG)和波特率控制寄存器(BAUDCON)。(3) 设置发送状态和控制寄存器(TXSTA)和接收状态和控制寄存器(RCSTA)。(4) 使能接收中断。4.4.3.4 RS232发送模块图4-16 EUSART发送框图 图4-16 为EUSART发送框图。当使能发送功能时,只需将要发送的数据写入TXREG寄存器,系统就自动会把数据发送出去。但是写入数居前必须先确定TXREG寄存器是否为空。当数据发送完毕后TRMT将被清空,可以通过检测这位来判断数据发送是否结束。为了保证前一次数据发送完后才进行下一次发送,就要在发送数居前先对发送模块的工作状态进行检测。实现方法有一下两种方法:方法一:发送前检测可通过向 TXREG 寄存器写入一个字符来启动发送。假如这是第一个字符,或前一个字符被完全从 TSR 中送出,TXREG中的数据就立即被传送到TSR寄存器。如果TSR仍包含前一个字符的全部或部分, 则新字符数据保存在TXREG中, 直到前一个字符的停止位发送完毕。然后,在停止位发送后经过1个指令周期TXREG中待处理的字符被传送到TSR。也就是说在TXREG有缓冲作用,即使现在向TXREG写入数据不能马上发送,只要前一个数据发送完后就会进行发送,而不用刻意去等待前个数据发送完后再写入TXEG,可以节省等待时间。这样就可以节省系统的处理时间。把更多的时间用来处理别的,更紧急的代码。那么是哪一个标志位是用来标志TXREG为空的状态呢?这个标志位比较特殊是,TXIF是一个只读的位。检测此位当TXIF=1时就可以向TXREG写入要发送的数据了。TXIF(R-0/0):USART 发送中断标志位1 表示 USART发送缓冲区为空(写 TXREG 时清零)0 表示 USART发送缓冲区已满图4-17 TXIF标志位方法二:返送后检测这种方法也叫等待法,也就是说向TXREG写入要发送的数据后,发送模块开始进行发送。然后对TRMT位进行检测。TRMT:发送移位寄存器状态位1 =TSR为空0 =TSR已满图4-18 TRMT标志位当TRMT=1时表示 TSR为空,即这次的数据发送完毕了。这里使用一条while(0=TRMT);语句就可以进行等待,直到本次发送完毕才会执行其他语句。这样下次发送数据时,发送模块必定工作在空闲状态,就可以直接发送数据。等待语句在程序设计中经常用到,但是等待时间太长必定影响到程序的正常执行。哪么发送一个8位数据到底等待了多长时间呢?串行通讯发送的每个数据前都有1个起始位,数据末尾有1个结束位,那么这里发送一个8位数据,实际上发送了10位二进制数。在波特率为9600下,发送1个二进制数据消耗的时间是1/9600s。 那么进行一次数据发送消耗的时间是: 1ms看似很小那对单片机系统的影响有多大呢?单片机的工作频率为32MHz时,执行一条单周期指令消耗的时间是125ns,那么1ms时间内可以执行8000条单周期指令。可见其影响是很大的。如果在中断使用了这么一条等待指令,必然导致其他中断无法及时进入,将导致程序无法正常执行。虽然这个方法用的人挺多的,但只适合于实验,不适合与实际应用。综合以上两种方法,这里选择方法一。4.4.3.5 RS232发送模块程序设计表4-5 USART发送函数函数名void USART_Send( unsigned char ch )说明用USART模块发送一个8位数据输入参数要发送的8位无符号字符数返回参数无图4-19 USART发送流程图图4-19 USART的发送流程图,可见程序步骤为:(1) 设置MAX485为输出模式。(2) 检测TXIF标志位,为0等待,为1向下执行。(3) 把要发送的数据写入TXREG。(4) 返回。代码如下:void USART_Send( unsigned char ch )TREN=1;while(TXIF=0);TXREG=ch;return;这个发送程序只实现了发送一个8位数据的功能,当要发送更多数据时,还需要编写其他函数来准备要发送的数据,然后调用此函数进行发送。4.4.3.6 RS232接收模块图4-20 EUSART 接收框图如图4-20 EUSART 接收框图,数据从RX引脚接收,每位接收到的数据将被存到RSR寄存器。当RSR寄存器接收到停止位后,如果RCREG寄存器为空,RSR寄存器中的数据将立即被写入RCREG寄存器,同时RCIF位被置1。RCIF为只读标志位,只当RCREG为空时RCIF将被自动清零。而RCREG清空的方法就是读RCREG寄存器。所以当RCIF被置1时读取RCREG就行了。RCIF(R-0/0):USART 接收中断标志位1 = USART接收缓冲区已满(读 RCREG 时清零)0 = USART接收缓冲区未满图4-21 RCIF标志位RCREG寄存器比较特殊,他是一个双缓FIFO(先进先出)冲寄存器。因此可以连续接收两个字节的数据。但是接收完两个数据没能及时,总线上又发来第三个数据,则第三个数据就被丢失了。为了防止这种情况,就要使用时效性快的中断来调用读取。接收数据的前提是MAX485设置为输入模式。所以在发送完数据后要及时把MAX485芯片设置为输入模式。4.4.3.6 RS232接收模块程序设计因为接收模块比较简单所以没必要写成一个函数先定一个全局帧缓存数组和数组引索变量:unsigned char RCbuf10=0;unsigned char RCbuf_Index=0;在中断函数中的接收代码如下:if(RCIE=1 & RCIF=1)RCbufRCbuf_Index=RCREG;RCbuf_Index+;上面这段代码只是实现了接收数据,并把接收到的数据存入缓存数组中,每接收到一个数据后要对RCbuf数组进行解析。根据解析的结果再对上位机进行应答。4.5 蜂鸣器模块蜂鸣器是一种常见的电子元件。在各种控制电路中,常用来做发声报警器。蜂鸣器按其是否带有信号源又分为有源和无源两种类型。如果使用无源蜂鸣器,显然要使用一个PWM模块来产生不间断的驱动信号。PWM的频率不同可以发出不同的音调的声音。可以发出丰富的声音,甚至用来播放音乐。这是它的优势,但是PWM模块在电力电子控制系统中有着非常重要的地位,用一个就少一个。如果用PWM来驱动蜂鸣器,实在是浪费资源。为此这里选用的是有源蜂鸣器。如图4-22 是一个有源蜂鸣器的驱动电路。这个蜂鸣器需要12V的电压来驱动。ALARM与单片机的一个普通IO引脚相连。当单片机向ALARM输出高电平时Q3导通蜂鸣器发出响声,同时LED1灯发亮。向ALARM输出低电平时Q3关断,声音停止,LED1也灭掉。图4-22 蜂鸣器驱动电路4.5.1 蜂鸣器的程序设计4.5.1.1 蜂鸣器的初始化程序表4-6 蜂鸣器的初始化函数函数名void ALARM_Init( void )说明蜂鸣器的初始化输入参数无返回参数无首先是对蜂鸣器模块进行初始化。初始化比较简单,步骤如下:(1) 设置ALARM引脚为输出。(2) 初始ALARM电平为低,即初始不发声。4.5.1.2 蜂鸣器的发声程序设计有源蜂鸣器只能发出一种声音,但如何让它也能发出丰富的声音呢。可以用间断发声的方法,当系统处于重要故障时,蜂鸣器长响,当处于一般故障时,采用1秒响1秒不响的相互间隔。这里的时间间隔需要使用一个定时器来定时。当时间到1秒就调用一次蜂鸣器发生函数,该函数会根据发生类型自动改变ALARM引脚上的电平。表4-7 蜂鸣器的发生函数函数名void ALARM_Sound( unsigned char type )说明控制蜂鸣器的发声输入参数要发出声音的类型返回参数无其中发声类型定义了三种如下:表4-8 蜂鸣器的发声类型发声类型(type)声音描述0不响1长响21秒响1秒不响4.6 LCD显示模块LCD在单片机系统中使用非常广泛,本文使用的是1602型号的LCD,可以显示162个字符。为人机交互提供了很大的方便。表4-9 1602型号的LCD引脚说明引脚名功能RS命令/数据选择位。1:数据,0:命令R/W读/写选择。1:读,0:写E数据使能。下降沿送入有效DB7DB0数据总线。为了节省单片机的IO引脚,这里将使用4位数据总线,只用DB7DB4。传输数据时先发送高4位,然后发送低4位。4.6.1 LCD基本函数设计要使用LCD需要设计以下3个函数:初始化函数、写4位命令函数、写8为命令或数据函数。表 4-10 LCD初始化函数函数名void LCD_Init( void )说明LCD初始化输入参数无返回参数无表 4-11 LCD写4位命令函数函数名LCD_W4( unsigned char dat )说明向LCD发送一个4位命令输入参数unsigned char dat :4位命令返回参数无表 4-12 LCD写8为命令或数据函数函数名LCD_W8( unsigned char dat, unsigned flag )说明向LCD发送一个8位的数据或命令输入参数unsigned char dat:要发送的内容;uns

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论