【分享】基于飞思卡尔9S08MZ60单片机的国网单相表设计实现

2020-02-21 21:13发布

本帖最后由 cn_x 于 2014-8-26 08:52 编辑

张明峰 飞思卡尔半导体(中国)有限公司 技术销售经理

随着中国国家电网公司于2009年年底正式推出了酝酿已久的电表设计统一招标方案之后,整个中国电表行业掀起了一轮全新的设计热潮,以求在最短的时间内设计出完全符合国网新规约的各种电表。由于此新规约较以往的设计相比增加了很多全新的技术要求,由此给不少厂家带来了设计方面的诸多挑战。面对这样的一个市场需求,飞思卡尔公司结合自己单片机产品的特点和电表设计的具体要求,及时推出了一款完全按国网单相多功能表要求设计的完整解决方案,以方便用户进行整体性能的综合评估,并以此为参考来加快自有产品的设计和开发。我们在这里就该方案做一些简要介绍。

系统实现基础

该方案的核心是飞思卡尔专门针对中国电表市场而推出的系列芯片中最主要的一款8位单片机9S08MZ60,它基于飞思卡尔目前主打的S08内核,片内有60K的程序空间和2K的RAM空间,外加功能完善的内部时钟模块;主要的片上外设包括:64引脚封装所提供的55个IO端口;2路硬件异步串口;三个16位定时计数器,总计支持多达10路引脚通道时间控制,其中任意一路均可以通过软件配置成输入脉冲沿捕捉、定时比较电平输出或PWM脉宽调制;带总共16路输入的8位ADC;另外硬件SPI和I2C模块各一个;还有一个8位的实时计数器可以在芯片休眠时维持定时计数并唤醒MCU;内部总线最高运行速度达20MHz。片上自带在线调试模块,开发调试高效方便。



本设计方案中充分利用了几乎所有上述模块的硬件固有功能,最大限度地简化外围设计,在保证整体设计功能满足性能最优的同时,降低系统成本。其中:

MCU工作于内部时钟,摒弃了传统的片外晶体振荡,简化电路,提高可靠性。内部时钟振荡的精度和稳定度通过运行过程中的动态标定来保证。
2路硬件串口分别用于485抄表和电力线载波通讯。因这两路的通讯波特率最高都是9600bps,用硬件串口实现比较容易;
16位定时器及其所附的引脚通道实现多种重要功能。首先是产生一个1ms间隔的系统时间节拍,用于所有软件任务的普通定时控制;通道的作用一是实现脉冲输入捕捉,例如检测计量芯片输出的电量脉冲;二是和软件配合模拟实现相对低速的异步串行通讯,这其中包括红外抄表通讯,ESAM和IC卡的ISO7816通讯;
ADC模块完成两个重要任务,一是对电池电压的监测,二是交流掉电和交流恢复供电的状态检测;
硬件SPI模块则用于和前端计量芯片通讯,节约软件开销;
8位的实时计数器在交流掉电后芯片进入低功耗休眠状态时维持工作,用来周期性地唤醒MCU,定时检测并记录开盖、按键、电池电压和交流恢复等状态;
唯一没有用到的是硬件I2C模块,本设计中用芯片的普通IO引脚模拟I2C通讯。这主要是考虑硬件布线的方便,同时因为当工作于主模式时,硬件I2C模块驱动和纯软件模拟的代码开销差不了多少。
当然,针对本次特定的国网单相表新规约设计,除了MCU外还需其它一些芯片配合实现一些关键功能,其中:

计量部分目前设计采用Cirrus Logic的CS5464实现,理论上也支持其它同类的带SPI接口的计量芯片;
实时时钟则采用业界流行的RTC8025T;
EEPROM为24LC512,具体容量可按实际需要选择;
液晶驱动芯片用的是BU9792。
综合考虑设计实现的方便性和灵活性,我们将整个设计分解成四个独立的硬件模块,它们分别是:

主板。包含主电源和电池供电系统;MCU、实时时钟、数据存储和ESAM等关键芯片;隔离的485抄表通讯电路;PLC模块接口;开关和按键输入等
计量板。包含计量电路和断路控制继电器。只要改动此计量板,就可以评估不同的计量芯片;
显示板。包含液晶屏及其驱动电路;电表的状态指示LED;红外抄表接口;
IC卡读卡部分。包含IC卡座及其必要的读卡电路。
主板和其他模块板之间都通过插针接口互联。

电源部分设计考虑

本设计采用变压器降压供电,次级两个绕组输出。一个绕组提供峰值电流1.5A / 12V电源。12V直接提供给PLC模块;同时经7805稳压后一路直接供无需电池备份工作的电路,例如计量芯片,红外发射,ESAM等,另一路则通过二极管D2,合并来自二极管D1的电池供电回路,供给MCU,实时时钟,EEPROM等需电池备份工作的电路。变压器次级另一个绕组则提供独立电源给隔离485通讯部分使用。

模拟计量部分和MCU电路是共地的且浮在电网上。这样做的好处是可以省去计量芯片和MCU之间繁杂的隔离,简化硬件电路设计,同时MCU可以用高速SPI和计量芯片进行数据通讯,提高了软件运行效率。但同时也带来一个安全性的问题,就是在设计IC卡读卡模块时,整个模块要和MCU部分完全隔离以保证用户人身安全。当然如果所设计的电表为非IC卡插卡预付费型,或使用非接触射频IC卡,则就无需考虑额外的电路隔离了。

12V电压通过简单的电阻分压电路R8/R9/C10,取样得到交流掉电检测信号直接送至MCU的一路AD输入端。飞思卡尔单片机的ADC模块都有一个特殊的工作模式,即后台自动连续进行AD转换并和事先设定的阈值做比较,只有超过阈值才产生AD中断。在此设计中我们设定的AD比较阈值对应的实际电压是9V,一旦12V电压降至9V以下,MCU就立即响应AD中断,保存关键运行数据后进入低功耗休眠模式,直到检测到此电压恢复至高于10V以上,系统自行硬件复位后重新运行。引入电压检测回差可以确保交流掉电和供电状态的可靠鉴别。

电池供电部分做了些特殊考虑。如果简单地通过二极管D1进行直流5V和电池3.6V供电切换的话,电池供电时普通硅二极管D1上有约0.4-0.5V的压降损失。对于标称3.6V的电池来说,0.5V的压降是相当可观的。在整个电表的使用过程中可能考虑电池电压降至3V左右系统还要维持工作,这时去掉0.5V压降后供给MCU的电压只有2.5V,已经不能满足MZ60最低2.7V供电的基本指标。所以在此设计中额外增加了一个三极管QP1,当直流5V消失后,系统在电池供电状态下处于低功耗模式,平均功耗仅为几个微安,QP1通过基极电阻R10得到少许偏置电流就足以使CE极间饱和导通,消除了D1的压降。当直流5V存在时,D1和QP1都被反向偏置,故电池不消耗任何电流。

系统本身需要检测电池电压,通过简单的R1/R2/C5电阻分压得到电池电压取样,也是直接送至单片机的一路AD输入端。单片机以一定的时间间隔检测此信号,并换算出实际的电池电压值。取样电路的工作过程由单片机的一个引脚控制,检测间隙期间取样电阻不消耗任何电流。电池电压的换算基于ADC模块内部的一个1.2V基准电压通道,无论单片机自身的供电电压如何变化,是直流5V供电还是电池本身供电,都能精确测出电池电压。

采用这样的电路设计实现掉电和电池电压检测后,完全省去了传统设计所采用的低功耗电压比较芯片,既简化了电路,又降低了成本,同时还提升了系统性能和设计灵活性:因为掉电判断阈值可以通过软件自由设定,电池电压检测结果精细而直观。

时钟芯片选用业界最常用的RTC8025T,内置晶体和温度补偿,使用方便。MCU通过I2C总线对其进行数据读些操作。

在交流供电模式下,软件配置时钟芯片输出标准秒脉冲信号,该信号有两个作用:一是通过光耦隔离输出用于外部校时;二是直接送至单片机的一路定时器通道,通过单片机检测所得的秒脉冲周期,反过来校准单片机内部的时钟振荡频率,这就是所谓的时钟频率动态标定。当处于电池供电状态时,则通过软件配置关闭秒脉冲输出,以节约功耗。光耦U11实际上对应的是一个多功能输出端子,其他的功能输出由单片机一个IO引脚控制实现,电路上和秒脉冲输出分享,可通过单片机软件切换。

数据存储

按规约要求,国网单相表设计所需的数据存储大约需32K字节。实际电路直接采用64K字节的EEPROM 24LC512,稍留余量。本方案中还预留了2M字节SPI接口的串行Flash存储芯片,需要时可用于其它应用评估。串行Flash芯片的读写和计量芯片共享同一组SPI总线,不占用单片机额外资源,只需一个独立的片选信号控制。



液晶显示电路

液晶显示为一块独立的印板模块,以插件的方式和主板相连。显示驱动芯片选用I2C接口的BU9792,和其它I2C接口芯片共享同一条I2C总线。该芯片支持36x4=144段显示驱动,正好满足国网单相表目前所需的约132段显示信息。液晶驱动电路基本按照BU9792的典型应用。值得一提的是本设计中采用的智能对比度控制电路。

当交流供电时,MCU输出一路PWM信号,经R44/C23滤波后得到一直流电压,控制液晶驱动芯片VLCD引脚电平实现对比度调整。由于MCU片内ADC模块含有一路1.2V基准通道,所以任何时候都可以通过对基准通道做一次AD转换来反推出当前实际的芯片供电电压值,然后就可以调整PWM输出占空比使得电源VDD和对比度控制VLCD两点的压差始终维持在3V左右,为3V液晶片提供最佳偏压值。此时R43对应的单片机引脚设置为高阻抗输入状态,不参与分压控制。

当处于电池供电状态时,MCU基本处于低功耗的休眠状态,无法维持PWM输出。在这种情况下,当需要液晶显示时MCU改此PWM引脚为固定低电平输出,这相当于用R44和液晶驱动芯片内置的偏压分压电阻进行分压。电池饱满时能提供3.6V的电压,此时R43一端依然设为高阻抗输入状态而不参与分压控制,液晶驱动芯片内部三个1M欧电阻和600K欧的R44分压后,继续保持VDD和VLCD两点间的3V压差;前面已经介绍了在电池供电时我们仍然可以实测出电池电压值,所以当得知电池电压降低到3.3V后,通过单片机引脚让100K欧的R43一端也接到0V低电平,从而改变偏压分压电路的分压比,继续保持电源和VLCD两点间接近3V左右的压差。这样就保证了在整个电池供电过程中从3.6V到2.8V这个变化区间内,液晶显示对比度基本恒定一致。

采用这种实测供电电压动态调整对比度的方式,电路实现简单可靠,能自动适应宽电压范围,大大简化了生产过程中的调试流程。

电量计量

国网单相表要求能检测线路电压、相线电流和零线电流,故计量芯片必须具备三路模拟信号输入。本设计选用了CS5464,因为国内电表行业对它的了解相对比较早,熟悉此芯片的人也比较多。理论上也可以选用任何其它型号的同类的计量芯片。线路电压直接通过电阻分压得到,相线电流通过分流片取样,零线电流则用电流互感器取样,经低通滤波后分别送至CS5464的一路电压和两路电流输入端。

计量芯片和MCU通过SPI口相连进行双向通讯。对于有功电量信号,配置CS5464直接以脉冲方式输出,MCU捕捉并累计脉冲;对于电压、电流和功率等各项参数,计量芯片每做完一次运算周期后就发出中断信号,单片机响应该中断,然后通过SPI口直接读出CS5464内部对应的寄存器值,软件乘以事先标定的系数,转换成实际对应的参数值后即可用于显示或控制。MCU通过软件方式对计量部分所有相关参数进行比例校准和标定,实现所需的校表工作。

ESAM和IC卡接口电路

ESAM芯片位于主板之上,和MCU直接连接并通讯。ISO-7816双向数据通讯由MCU的一路定时器通道配合软件高效模拟实现,所需的1-5MHz时钟也由MCU直接提供。MZ60的一个引脚可以直接输出分频后的内部系统时钟,软件只需事先设定一个合理的分频系数,即可控制此时钟的输出或禁止。另外ESAM的供电被设计为程控模式,平时ESAM不工作时可以通过软件切断电源,降低系统整体功耗。

IC卡读写部分通过主板提供的外扩连接端子来扩展。为了最大限度地实现不同外扩模块的设计,接口端子上提供了必要的5V电源,一路软件模拟的全双工串行通讯接口,一个1-5MHz的时钟信号,外加3个普通IO引脚功能。注意:如果是设计插卡式IC卡读写模块,则该模块必须要和所有的这些主板端子引脚实现电气隔离。为了实现这一安全隔离要求,外接模块可以利用端子提供的5V电源自己产生一组隔离电压,除高速时钟外其他的信号则可以用低速光耦隔离,因为高速光耦比较昂贵,所以可以考虑模块本地自己产生一个时钟,用于CPU卡的通讯。非接触式IC卡模块或外接无线抄表模块则无需考虑电气隔离。



RS485抄表接口

按设计要求,RS485部分完全和其他任何电路实现电气隔离。电源由变压器的一个独立绕组提供,数据收发和方向控制信号则由光耦实现隔离。本电路设计的通讯速率最高支持19200bps,虽然国网规约要求的最高速率为9600bps。为了能用低速光耦实现相对高速的数据通讯,数据接收和发送时通过三极管电路适当增加了光耦的驱动电流。收发方向控制信号则无特别的速度要求。通讯线路侧的过压安全保护采用经典的TVS二极管加PTC热敏电阻的方式实现

红外抄表接口

红外发射调制直接由单片机的一路定时通道产生38KHz载波,对发送码流中的数据位0和1进行发送调制;红外接收则用一体化红外接收头AT138解调红外信号,输出的是TTL标准串行码流至MCU的一路定时通道,配合软件完成串行接收。
本设计支持红外通讯的数据波特率为1200或2400bps。目前电路设计暂时没有考虑电池供电状态下的红外唤醒电表功能,但整个系统在布局上已经保留了相关的控制信号,必要时可以考虑增加实现。



载波通讯接口

按照国网新规约,对于电力线载波通讯只需在电表固定位置提供标准的插槽接口。载波模块和MCU以固定的9600bps波特率进行通讯,这通过MCU的一个硬件串口实现。同时MCU还负责提供和处理所有相关的通讯握手信号,这些握手信号都连接至MCU的普通IO引脚。由于载波模块为独立的插件,故所有的这些信号连接都考虑了必要的ESD防护,以免插拔时造成ESD损坏。

按键和开盖检测电路说明:

本参考设计中提供了两个按键输入检测和两个开盖信号检测。在电路实现上是一致的,都是机械开关的开闭检测。采用单片机的一个IO引脚控制检测电路的启闭,只在需要对开关进行检测时才输出低电平驱动信号,平时该引脚则保持高电平。这样在电池供电状态下可以防止任意开关信号长时间处于闭合状态而损耗额外的电流。电路中除了上拉电阻外的其它阻容元件则起到ESD保护作用



软件编程要点

软件编写采用模块化结构,除了底层MCU硬件驱动部分,其它模块尽量做到和MCU固有资源无关,方便系统移植。
单片机被配置为片内时钟工作模式,系统总线频率为11MHz。用内部时钟振荡的好处是无额外成本开销且工作稳定可靠,但相比外部晶体振荡而言其频率精度和一致性较差。在没有做其它特殊校准的前提下,MZ60内部时钟频率在全温度和全电压范围内的误差不超过2%,实际上这一指标也已经满足电表设计所需。为了能更好地保证大批量产品长时间工作的一致性和稳定性,软件上利用外部实时时钟芯片所提供的现成秒脉冲信号对单片机的片内时钟频率进行动态微调,通过简单高效的算法可以保证总线频率误差不超过0.5%,进一步提高了任务定时和串行通讯波特率的精度指标。

MZ60单片机内部有2K字节的RAM,对于现在功能复杂的国网单相表设计,需要善加规划合理利用这些有限的RAM资源。其中RAM开销最大的是三个通道的自动抄表和ESAM/IC卡读写,他们都需要足够大的缓冲区来接收和处理一个完整的报文,如果为他们分配各自独立的静态缓冲区,2K字节的RAM可能比较紧张。考虑到各通道抄表和ESAM/IC卡读写几乎不可能在同一时间段同时发生,本设计另辟蹊径,除了程序模块必需的全局或静态变量和系统堆栈分配,全部剩余的RAM空间被划分为一个完整的数据堆(实际设计中约为1.3K字节左右),通过必要的底层驱动软件,对这一部分采用内存动态分配和管理,只在任务实际需要时才申请得到一定长度的内存块,用完即释放回数据堆,以便其它任务继续申请使用。当然在任务软件编制时必须考虑申请内存块失败时的处理,虽然这几乎不可能发生。

电表在运行时需要同时考虑很多任务并发执行。在软件编制时采用事件驱动,基于分时轮循和状态机控制的方式,让多个任务同步协调运行,确保各任务间无阻塞。特别编制了相关的底层驱动软件,针对那些偶发运行的任务,例如抄表,读卡或电池检测等,实现了任务队列的动态建立和删除,避免过多不必要的轮循,集中MCU的处理能力来运行关键任务。

交流掉电后MCU进入电池备份供电下的低功耗休眠模式。通过内部实时计数器定时唤醒,唤醒时间间隔软件可编程,在本设计中为64ms。每次唤醒后进行开关和交流恢复检测,累计间隔5分钟左右做一次电池电压检测。此时整个系统的平均功耗约为7uA。一旦检测到交流恢复供电,MCU自身强制发生一次硬件复位过程,整个系统在复位刷新后重新运行。

在本参考设计中为了调试改动方便,附带了一个Boot-loader功能,通过485抄表口可以在线升级软件。但正式产品中规定禁止使用Boot-loader。

整个软件为C语言编写。

系统升级和移植考虑

飞思卡尔针对单相电表设计的整个MZ系列产品,从最小的8K/20引脚的RS08MZ8到最大256K/80引脚的51MZ256,很好地覆盖了从简单单相表到复杂单相多功能表甚至三相多功能表的设计所需。对于此次国网单相表的设计,初步估计60K程序空间的S08MZ60应该基本满足设计要求。如果用户的设计增加功能需要编写更多代码的话,该系统可以在不改变任何硬件设计的前提下,直接换用性能和引脚完全兼容的S08MZ96(96K Flash)或S08MZ128(128K Flash)的芯片。另外,飞思卡尔还可以提供引脚完全兼容的32位内核芯片51MZ256(256K Flash)。因此,整个系列的可扩充性和可移植性得到了最大的体现。

结论

通过上述设计方案的简要介绍,充分证明了飞思卡尔的MZ系列单片机能完全满足国网新规约要求下的单相电表设计。飞思卡尔可以提供上述相关的所有硬件和软件设计参考资料,并辅以完善的现场技术支持,帮助用户快速完成最终产品的设计实现。若需了解更多细节,可以和本文作者进一步联系 (r64570@freescale.com) 。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
jiang887786
1楼-- · 2020-02-22 00:44
 精彩回答 2  元偷偷看……
浪里白条
2楼-- · 2020-02-22 04:42
感谢分享,内容太多,需要的时候慢慢看
wangpengcheng
3楼-- · 2020-02-22 09:52
Mark一下!
829xuming
4楼-- · 2020-02-22 15:36
只是MZ60已经不供货了
sunnyqd
5楼-- · 2020-02-22 21:29
多谢楼主分享
cn_x
6楼-- · 2020-02-22 23:22
 精彩回答 2  元偷偷看……

一周热门 更多>