基于RlTOS和ISP功能数字仪表系统设计实现
2.3 A/D数据采集模块
由于本系统涉及多路模拟信号,故选择了AD(20809型通用模/数转换器,它采用逐次逼近方式完成A/D转换过程,其片内带有8路模拟开关,能自动锁存信号,输入电压范围是0V~+5V,因为该器件的输出具有1TrL三态锁存缓冲器结构,所以可以直接连人单片微控制器的I/O口。相关的接口连接如图2所示。
需要说明的是,在本系统6路电源信号中只有一路负电源信号符合ADC0809 0V~5v的输入特性,因此必须配备相应的反相电路,则通过LM358型运算放大器来完成。利用LM358还可以扩展监测范围(以降低测量精度为前提),这对于精度要求不太高的场合是可行的。图2中PC817型光耦用于检测负电压信号,当IN4为低电平信号时对应负电压信号,此时在MSl2232B的相应行位置给出“-”号标志,这不仅解决了正负电压同行显示的兼容性问题,而且减少了软件设计量(由6路简化为3路),同时使系统实时性相应提升。
2.4温度传感器模块
DSl8820是Dallas公司推出的l—Wire式数字温度传感器,它能实时采集现场环境的温度数据,并将相应的值转换为数字量输出。该温度传感器与AT89S52的连接如图3所示。
2.5语音报警模块
该模块主要实现异常情况下告警信息的输出,只要配电箱电压信号的波动值超出一定的范围,音频告警装置即给出不同的频率信号使蜂鸣器发声,以提示相关操作人员注意。
3 系统软件设计
按RTOS系统的程序结构要求,软件工程主要由如下4部分组成:初始化、数据采集与A/D转换、显示子程序、温度监测与告警模块。
如果将初始化设置为任务0,那么除了要完成相应的硬件配置与变量赋初值外,还必须启动所有其他任务,另外,因为初始化过程只须进行一次,所以Task 0还应当删除其自身。具体的程序代码如下所示:
void Init(void)_task_Intial
{
variable=0;
LcdInitialO;
ClrScreenO;
0s_create_task(AI)C0809I)ata);
os_create_task(DSl8820Temperate);
0s_create_task(LCMI)isplay);
0s_delete_task(Intial);
}
其中相关的宏定义变量值为:
#define Intial O
#define ADC0809Data 1
#define DSl 8820Temperate 2
#define LCMDisplay 3
在Keil集成开发环境下调试本程序时,除了要包括相应的头文件(rtx51tny.h)外,还必须设置好相应的环境参数值。
3.1数模转换子程序
数据采集与A/I)转换子程序主要对配电箱传来的模拟信号进行采样、量化及返回值处理。软件编程时的电气时序及相关技术要求如图4所示。
在时序图中,上升沿清空量化结果寄存器内的值,下降沿启动,A/D转换;采样启动脉冲的高电平状态至少应维持100μs;EOC变为低电平表示转换过程正在进行,且启动信号的硬件迟滞效应时间至少应为10μs;MSB对应AT89S52并口的:P0.7,LSB对应P0.0。
关键部分的程序源代码及注释如下:
unsigned int AI)C0809(void)
{
unsigned int wait=3;
ChannelChooseA=1;
ChannelChooseB=0;
ChannelChooseC=0;
ADStartPulse=0;
ADStartPulse=1;//产生A/D转换的启动脉冲
(上升沿部分)
delay();//保证启动脉冲的高电平宽度
至少大于100μs
ADStartPulse=0;//产生A/D转换的启动脉冲
(下降沿部分)
wait--;
wait--; //指令延时以保证达到:EOC
变为低电平所需的硬件迟滞要求。
‘whilefADConvertEOC==0):
return(Result);/将A/[)转换后的量化值返
回到主函数中。
}
3.2液晶显示模块
MSl2232B 型图形点阵液晶显示(LCM)模块左右分为Master和Slave控制器,上下共分4页,左边列地址为0-61,右边列地址为0-61,对该器件的操作关键是按时序图正确配置好主、辅控制器的工作状态。利用AT89S52访问LCM时有二种常用的方法,即存储器映射寄存器寻址和模拟接口时序,本系统采用后一种方法。主要函数模块源代码分析:
void MasterWriteD(unsigned char Ramdata)
//向Master控制器写数据
{
ReadOrWrite=0;
InstructionOrData=1;
MasterEl=1;
P0=Ramdata;
MasterEl:0;
}
void MasterWriteI(unsigned char Ramdata)
//向Master控制器写指令
{
ReadOrWrite=0;
InstructionOrData=0;
MasterEl=1;
P0=Ramdata;
MasterE1=O;
}
void ReadState(void) //检测主、辅控制器工作状态
{
ReadOrWrite=1;
InstructionOrData=0;
MasterEl=1:
SlaveE2=1;
PO=0xff;
while(BusStateBusy==1);
}
电能表相关文章:电能表原理
评论