太阳能热水器软件平台设计方案.ppt_第1页
太阳能热水器软件平台设计方案.ppt_第2页
太阳能热水器软件平台设计方案.ppt_第3页
太阳能热水器软件平台设计方案.ppt_第4页
太阳能热水器软件平台设计方案.ppt_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

1、基本8位单片机的软件平台设计方案(3),太阳能热水器软件平台设计,平台目的,建立一个通用的、规范的、高效的、易读的、流程清晰的软件平台 通用性:针对太阳能热水器具有一定的通用性,太阳能热水器在此架构上修改即可 规范性:文件定义、变量定义、函数定义规范化 高效性:程序流程清晰,方便修改 易读性:大量注释保证程序的可读性好 模块化:大量程序模块化,方便其它程序调用,内容,一个标准程序,可以完成规格书所规定的热水器的基本功能。包含所有注释和说明。 编程规范:一套完整的编程规范,包括文件定义、变量定义、函数定义的规范化 文件调用关系:各文件间的调用关系图与全局变量的数据流图 程序流程图:包括程序总流程

2、图及各关键子函数流程图,与程序一一对应。,基本软件架构,外部中断,主循环,时间中断,* 三者是并行的关系 * 本质上单片机是顺序执行,只有在中断发生的时候才会进入中断执行,中断内容执行完毕后返回到主循环中 * 由主循环程序处理大部分的流程,中断内的内容要尽量少,时间中断的处理,要求代码少,效率高 除了必须使用的扫描等功能,其他和时间有关的只是设置变量标志位,并不做任何处理,所有的处理均放在主程序中处理 必要时嵌入汇编实现 实现时注意优化代码,编译后使用反汇编程序来查看对应的汇编代码 注意有些芯片计时是不准确的,所以要有定时检测方法(可通过定时控制IO口输出之后通过示波器检测) 举例:Solar

3、WaterHeatermain.c,外部中断的处理,外部中断要考虑到干扰的影响,一般会有滤波措施 必要时嵌入汇编实现,软件工程中的分层设计,硬件平台,硬件抽象层,驱动程序,应用程序,操作系统,基本软件平台,分层设计思想,硬件平台,硬件抽象层,驱动程序,主程序,负责主要结构体和变量的定义,主要功能函数的流程,随硬件更改而更改,不随硬件更改而更改,函数及变量定义,改变思路,一个源文件解决所有:可以,但可移植性和可读性不好。可以说把c程序做成一个文件的还停留在汇编程序设计的思路上,他只是换了种语言工具而已,而非改变了设计思路。 以后的系统会越来越复杂,使用成熟的代码等于站在巨人的肩膀上 从系统角度考

4、虑问题:没有最好的,只有最适合的(不要迷信规格书),事实上很多系统工程师也不知道怎么做才是最好的 软件只是系统的一部分,但是如同人的大脑,是系统的灵魂所在,尤其在涉及到控制算法的时候,模块(文件)划分,头文件:被其他文件包含的文件,包括结构体定义和常量定义文件 主文件:main.c,负责所有文件间的调度 全局变量文件:所有的全局变量及其初始化函数,尽量少的使用全局变量 硬件文件:hardware.c, 与硬件有关的文件 驱动文件:与硬件有关同时含有滤波或时序等功能的文件 流程文件:与硬件无关与流程有关的文件 其他文件:算法文件或通用函数文件,模块(文件)划分:头文件,.h文件只包含宏定义和函数

5、声明,不包含变量的定义,可以被任何.c文件包含 Io_define.h:IO口定义头文件,文件内全部使用宏定义定义IO口及与IO相关的操作等内容。会被驱动文件和主文件调用。这些定义也是和硬件息息相关的,更改MCU的时候需要全部改写此文件 MainConst.h:常数定义文件,包括程序中用到的常量和枚举类型定义 MainStruct.h:结构定义文件,包含可能用到的所有结构定义,不包含变量,模块(文件)划分:主文件,Main.c, main.h: 主文件,程序的入口(注意并不一定是芯片复位后的入口),负责所有文件间的调度 Hardware.c, hardware.h:硬件文件,负责与硬件相关的函

6、数定义,如MCU的特殊寄存器定义模块(f_InitSFR),AD检测函数f_CheckADVaule(),PWM输出函数等。这些函数都是和硬件息息相关的,更改MCU的时候需要全部改写此文件 GlobalVar.c, GlobalVar.h:全局变量文件,GlobalVar.c中定义所有的全局变量及其初始化函数,GlobalVar.h包括对全局变量的声明,使用全局变量的文件中包含GlobalVar.h即可 通用函数CommFunc.c, CommFunc.h:与硬件无关的通用函数文件,如BCD码转16进制码等函数,使用任何芯片此文件中的内容均不用修改,模块(文件)划分:驱动文件,与硬件有关或含有

7、滤波功能或含有时序等功能的文件,称为驱动文件。不负责与流程有关的内容。与硬件的接口通过hardware.c或io_define.h来实现。如: RTC_PCF8563.c,RTC_PCF8563.h:时钟芯片8563驱动,和时序有关,主程序只要调用此驱动文件的各个函数即可实现对时钟芯片的读写操作 CheckWaterPos.c, CheckWaterPos.h:脉冲宽度或个数检测模块,如水流量脉冲检测,水位检测,一般会涉及到滤波算法 ChkADKey.C, ChkScanKey.c, ChkKey.h:按键检测模块,与算法相关,需要滤波,由于可以使用多种方式检测按键,故需要通过文件名将其分开。

8、但文件里的函数名称是一样的,头文件也是一样的,这样在更改按键检测方式的时候只要更换编译的文件即可。 ChkAverageTmp.c,ChkMiddleTmp.c,ChkTmp.h:温度检测模块,一般涉及到滤波算法,同检测按键一样,可以使用多种滤波算法检测温度,故需要通过文件名将其分开。 UART_Drv.c, UART_Drv.h:UART通讯模块,负责UART通信的故障检测,冲突检测等功能,模块(文件)划分:流程文件,与功能要求有关的文件,称为流程文件。主要负责流程和逻辑相关的操作,做到与硬件无关。所有与硬件有关的输入输出都是通过驱动文件中的函数或对全局变量的操作来实现的,流程文件与驱动文件

9、的接口也主要由Display.c, DealKey.c, main.c等固定的接口文件来完成,其他流程文件尽量做到与驱动文件无关。 Display.c, Display.h:显示文件,负责获取显示缓冲和显示输出 DealKey.c DealKey.h:按键处理文件,负责处理按键功能 其他和流程有关的模块,如UpWater.c, UpWater.h, Elec_Heat.c, Elec_Heat.h,模块(文件)划分:其他,通用函数CommFunc.c, CommFunc.h:与硬件无关的通用函数文件,如BCD码转16进制码等函数,使用任何芯片此文件中的内容均不用修改 复杂的控制算法,一般会涉及

10、到算法效率及控制性能,单独使用一个文件,称为算法文件。要做到与硬件无关。,主芯片,硬件包含文件 (io_define.h文件),设备驱动文件 LCD驱动,流程相关文件,设备驱动文件 按键检测,设备驱动文件 蜂鸣器驱动,主程序(main.c) (对下面的函数进行调用),与硬件相关 内容hardware.c,驱动文件通过io_define.h与MCU交互,显示相关文件 Display.c,按键处理相关文件 DealKey.c,其他与输入/输出 无关的文件,通用函数文件,算法文件 包括滤波、控制算法,包含文件 MainStruct.h MainConst.h GlobalVar.h io_defin

11、e.h,全局变量 GlobalVar.c,与输入输出有关的内容通过驱动文件控制MCU,与输入输出均无关的文件,硬件抽象层的实现,Hardware.c文件:负责整个MCU的初始化,PWM输出,检测AD等函数的实现 举例:SolarWaterHeaterHardware.c io_define.h文件:负责驱动文件与硬件的接口 举例:与ST_MCU_EEPRom的接口 ST_MCU_EEPRom.c 目的:当更换芯片时,驱动程序的内容完全不动,只需更改io_define.h里的内容即可,驱动文件组成,RTC_PCF8563.c,记忆芯片驱动程序为例 两个头文件,一个实现文件,RTC_PCF8563

12、.c,RTC_PCF8563.h,Io_define.h,驱动文件基本功能,RTC_PCF8563.c,时钟驱动程序为例 包含所有对RTC写和读操作的时序,外部调用时只需将其当作黑匣子,读写后均有读写是否正确返回值 Io_define(硬件接口文件,包含IO口的实际硬件定义,更改MCU时修改此文件) 包括RTC_PCF8563.h(头文件,外部调用时的函数声明),主文件中包含此文件,与RTC_PCF8563.c相对应 RTC_PCF8563.c(驱动实现文件,所有函数的实现),确定后不需修改 其它硬件驱动文件与之类似,主程序流程,见main.c main.c中只保留简单的几个函数 main()

13、, timer_interrupt(); 在main.c中调用各个模块的函数,主程序流程图,包括上电初始化部分和主循环部分 初始化部分上电后只执行一次,之后一直在主循环部分循环 流程图主程序流程图1.jpg 流程图主程序流程图2.jpg,太阳能热水器基本概念,一、系统组成及工作方式: 由集热器,承压水箱、集热循环管路,控制系统组成。利用温控仪根据集热器管中温度和水位控制上水阀和电加热是否开启,从而满足用户的用水需求。 二、重要元器件 1、超导热真空集热管。 2、蓝金刚全承压搪瓷内胆水箱。 3、采用智能控制技术,全自动运行。 4、结垢与防冻设计,太阳能热水器基本概念,三、控制器主要功能 1、功能

14、齐全:满足尽可能多的太阳能热水器(多种系统模式选择) 2、智能控制技术:可选择全自动模式运行,既节能又舒适 3、安全性高:各种报警功能齐全,能检测到各个元器件是否工作正常 4、保护功能齐全:用户误操作或检测错误均不会造成系统的损坏 5、界面友好,方便操作:显示和保护一目了然,参数设置简单易学,编写软件工作进程,、熟悉规格书(三天):这段时间请不要开始编写程序(事倍功半) 、根据规格书提出疑问:几乎所有的规格书都有互相矛盾或逻辑不清晰的地方,有疑问则要与系统工程师问清楚,可能会扩展的地方也要问清楚 、根据规格书列出输入和输出负载情况 电加热、上水阀、伴热带、增压泵、循环泵、显示、蜂鸣器 时钟芯片

15、、按键、水温、水位、记忆芯片、,编写软件工作进程(续),、根据规格书判断哪些是保护功能,即优先执行的功能(安全第一),哪些是正常运行时的功能 防炸管、防干烧、加热管保护、水箱防冻、管道防冻 定时上水、定时加热、手动上水、手动加热、全天候上水、全天候电热、温控补水、恒定水位、恒定水温 、可选项确定:是否有时钟芯片,是否有记忆芯片,是否有管道防冻,定义结构tOption,程序要根据此结构来判断是否存在此功能,编写软件工作进程(续),6、排查有关联的功能模块和无关联的功能模块 无关联:自动增压、管道防冻、断电记忆、开机自检等 有关联:温控补水、手动加热、加热管保护、低水压保护等 无关联的可以单独控制

16、,好比控制理论中的单输入单输出系统 有关联的需考虑各种可能性,好比控制理论中的多输入多输出系统,复杂性上升,编程总体原则,尽量少使用全局变量 多定义结构体表示某一事件的组合 模块划分要清晰,各模块耦合尽量少 检测输入(温度,水位)需要滤波,增强程序的鲁棒性 需要报故障前一定要多检测几次,防止误报,增强程序的鲁棒性 中断程序内容尽量少 尽量用宏代替数字,增强程序的可读性,太阳能热水器功能模块划分,基本模块:主程序main.c,硬件相关程序hardware.c,全局变量GlobalVar.c 基本功能:温度检测ChkTmp.c、显示模块display.c、按键检测模块CheckKey.c、按键处理

17、模块DealKey.c 带电加热功能:漏电检测模块 CheckElecLeak.c 带时钟芯片:时钟检测模块RTC_RTC_PCF8563.c 带自动上水功能:水位检测模块CheckWaterPos.c 带蜂鸣器:蜂鸣器驱动模块BuzBeep.c 带记忆功能:记忆芯片模块ST_MCU_EEPRom.c 带液晶驱动:液晶驱动模块HL6024_Drv.c 流程文件:防冻模块Defreeze.c, 保存设定参数模块SetSavePara.c,上水模块UpWater.c,电加热模块ElecHeat.c,主要流程控制模块(难点),上水控制:根据用户设置和检测到的温度、水位判断是否需要上水,同时要考虑到各

18、种保护 电加热控制:根据用户设置和检测到的温度、水位判断是否需要启动电加热,同时要考虑到各种保护 防冻控制:与电加热和上水有关联动作 状态保存:保存用户设置的数据,保存的数据多,且与按键、显示、EEPROM,RTC均有关联,全局变量 定义,与大部分流程有关的才定义全局变量,否则尽量使用局部变量或函数调用的方式。在定义前首先问问自己这个变量是不是一定要定义为全局变量 以下为根据G04规格书定义的太阳能热水器的全局变量(不同规格书定义的全局变量可能会略有不同) option_def tOption; /* 可选功能 */ relay_def tRelay;/* 继电器输出 */ fault_def

19、 tFault; /* 故障变量 */ upwater_def tUpWater;/* 上水变量 */ elecheat_def tElecHeat;/* 电加热变量 */ defreeze_def tDefreeze;/* 防冻变量 */ hour_def tCurTime; /* 当前时间 */ enum enumSetState nSetState; /* 当前设置状态 */ unsigned char nSetValue;/* 正在设定的参数值 */ savepara_def tSetPara;/* 设定参数 */,全局变量 tOption,typedef union/* 可选功能的结

20、构定义 */ unsigned int byte; struct unsigned char bEnergySaving : 1;/* 节能 */ unsigned char bAddPressurePump : 1;/* 增压泵 */ unsigned char bSilence : 1;/* 静音 */ unsigned char bDefreeze: 1;/* 防冻 */ unsigned char bLoopPumpDefreeze:1; /* 循环泵防冻 */ bit; option_def; 值为1的时候表示此选项有效,如tOption.bit.bSilence = 1表示有静音功

21、能,全局变量 tRelay,typedef union/* 继电器输出的结构定义 */ unsigned char byte; struct unsigned char bUpWaterValve : 1;/* 上水阀 */ unsigned char bPump : 1;/* 增压泵 */ unsigned char bElecHeat : 1;/* 电加热 */ unsigned char bLoopPump : 1;/* 循环泵(电热带) */ bit; relay_def; 由流程文件(UpWater.c)来更改tRelay的值,主程序(main.c)将根据tRelay的值来判断打开或

22、关闭继电器输出。关闭全部继电器可使用tRelay.byte = 0;,全局变量 tFault,typedef union/* 故障的结构定义 */ unsigned char byte; struct unsigned char bWaterSSR : 1;/* 水温传感器故障 */ unsigned char bWaterPosSSR : 1;/* 水位传感器故障 */ unsigned char bSystemErr : 1;/* 系统故障 */ unsigned char bElecLeak : 1;/* 系统漏电 */ unsigned char bElecLeakCircuit :

23、1; /* 漏电电路 */ unsigned char bEEPErr : 1;/* 记忆芯片故障 */ unsigned char bRTCError : 1;/* 时钟芯片故障 */ bit; fault_def; 定义可能出现的全部故障,从上到下故障代码依次为E1,E2 清除全部故障可通过tFault.byte = 0;实现,全局变量: 参数设定变量(tSetPara),需要保存到记忆芯片中的参数 具体见mainStruct.h定义 共包含20个byte 包括两个引导码和一个校验码 当从EEPROM读出的时候要同时判断引导码和校验和是否正确,只有全部正确才认为是正确 与之对应的是SetS

24、avePara.c中的TBL_PARA_DEFAULT:缺省参数 TBL_PARA_RANGE:各参数的设定范围 注意tSetUpWaterTimer1是hourmin_def格式的,即包含两个byte,全局变量(上水变量tUpWater),上水控制变量,程序主要修改此变量的值,并根据此变量的各个参数来判断当前上水状态及是否打开上水阀 bNeedUpWater: 需要上水,当需要上水时将此值置1 nTargetWaterPos: 目标水位 nCurWaterPos:当前水位(通过检测水位传感器得到) nStartWaterPos;: 上水时的起始水位 nUpWaterReason:上水原因,取

25、值见下页 bAntiBombProtect:防炸管保护,有保护时不能上水 bLowPessureProtect:低水压保护,有保护时间断上水 bRunning:正在上水 tRunTime:上水运行(停止)时间 nArriveTargetTime; 到达设定水位时间(单位:秒) ,到达设定水位后10秒停止上水使用 nNoWaterTm: 无水时间(单位:秒) ,判断缺水上水时使用,上水原因取值,enum enumUpWaterReason/* 上水原因 */ ALL_DAY_TIMER,/* 全天候定时 */ TIMER_UPWATER,/* 定时上水 */ TEMPERATURE_CONTRO

26、L,/* 温控补水 */ MANNUAL_UPWATER,/* 手动 */ WATER_LOSE,/* 缺水上水 */ ELEC_HEAT/* 电加热上水 */ ; 全部使用大写字母,使用有用的名称代替0,1,2,3,4,5,全局变量(电加热变量 tElecHeat),电加热控制变量,程序将根据此变量的值来判断是否开启电加热继电器 bNeedElecHeat: 需要电加热,当需要电加热时将此值置1 nTargetTmp: 目标温度 nCurTmp:当前水温(通过检测温度传感器得到ChkTmp.c) int nStartTmp: 起始温度 nElecHeatReason:电加热原因,取值见下页

27、bHeaterProtect:加热管保护,有保护时需要间断开启电加热 bNoWaterProtect: 防干烧保护, 有保护时不能运行 bRunning:电加热正在运行 tRunTime:电加热运行时间,电加热原因取值,/* 电加热原因 */ enum enumElecHeatReason ALL_DAY_TIMER, /* 全天候定时 */, DEFREEZE, /* 防冻控制 */ MANNUAL, /* 手动 */ ;,全局变量(防冻变量tDefreeze),防冻控制变量,程序将根据此变量的值来判断是否开启防冻继电器 bNeedDefreeze: 需要防冻,当开启防冻时时将此值置1 bR

28、unning:防冻正在运行 tRunTime:防冻运行(停止)时间 防冻与电加热和上水有关联,全局变量(当前时间tCurTime),每500ms读一次时钟芯片,取得tCurTime的值 typedef struct/* 小时,分钟,秒结构 */ unsigned charhour; unsigned charminute; unsigned charsecond; hour_def;,全局变量 (当前设置状态nSetState),NO_SET,: 未设置 SET_WATER_TEMP,: 设置水温 SET_WATER_POS,: 设置水位 SET_RTC_HOUR,: 设置实时时钟小时 SET

29、_RTC_MIN,: 设置实时时钟分钟 SET_CYCLE_PUMP_TIME,: 设置循环泵时间 SET_ELEC_STRIP_TIME,: 设置电热带时间 SET_TIMER_UP_WATER_1_HOUR,: 设置定时上水时间1小时 SET_TIMER_UP_WATER_1_MIN,: 设置定时上水时间1分钟 SET_TIMER_UP_WATER_2_HOUR,: 设置定时上水时间2小时 SET_TIMER_UP_WATER_2_MIN,: 设置定时上水时间2分钟 SET_TIMER_ELEC_HEAT_1_HOUR: 设置定时加热时间1小时 SET_TIMER_ELEC_HEAT_1_

30、MIN,: 设置定时加热时间1分钟 SET_TIMER_ELEC_HEAT_1_TEMP: 设置定时加热温度1 SET_TIMER_ELEC_HEAT_2_HOUR: 设置定时加热时间2小时 SET_TIMER_ELEC_HEAT_2_MIN,: 设置定时加热时间2分钟 SET_TIMER_ELEC_HEAT_2_TEMP: 设置定时加热温度2,全局变量 (正在设定的参数值 nSetValue),nSetState的取值为枚举型,NO_SET表示当前不是设置状态,其他表示当前为设置状态 根据tSetPara的值和 nSetState的值得到,保存时将nSetValue的值保存到tSetPara

31、中去 显示时也会用到此值,平台主要文件(头文件),常量文件:MainConst.h,包括各种常量定义 结构体定义文件:MainStruct.h,定义太阳能热水器中定义的各个结构体 Io_define.h:IO口定义头文件 Table_temperature.h 温度阻值表:AD值与温度对应关系表 其他与各驱动文件和流程文件对应的.h,如hardware.h, BuzBeep.h等,平台主要文件(主文件),Main.c, main.h: 主文件,程序的入口(注意并不一定是芯片复位后的入口),负责所有文件间的调度 Hardware.c, hardware.h:硬件文件,负责与硬件相关的函数定义,如

32、使用NOP的延时函数,f_NOPDelay(),MCU的特殊寄存器定义模块(f_InitSFR),AD检测函数f_CheckADVaule()等。这些函数都是和硬件息息相关的 GlobalVar.c, GlobalVar.h:全局变量文件,负责整个系统的全局变量,GlobalVar.c中定义所有的全局变量及其初始化函数,GlobalVar.h包括对全局变量的声明,使用全局变量的文件中包含GlobalVar.h即可,平台主要文件(流程文件),特点:包含全局变量,与硬件无关 Display.c, Display.h:显示文件,负责获取显示缓冲和显示输出 DealKey.c DealKey.h:按键

33、处理文件,负责处理按键功能 UpWater.c, UpWater.h:负责和上水有关的功能函数定义 Defreeze.c, Defreeze.h:防冻模块, 负责和防冻有关的功能函数定义 ElecHeat.c, ElecHeat.h:加热模块, 负责和电加热有关的功能函数定义 SetSavePara.c, SetSavePara.h:设置参数程序,负责与保存设置参数有关的函数定义,平台文件划分(输入驱动文件),特点:与输入IO口有关,包含io_define.h(也可以与硬件无关),不包含全局变量 温度检测文件:Table_temperature.h和ChkTmp.c .h,负责根据AD值检测温

34、度及完成滤波功能,返回温度值及传感器是否故障 水位检测模块:CheckWaterPos_Int.c, 负责检测水位,返回当前水位及传感器是否故障 按键检测文件:ChkKey.c,负责检测按键 漏电检测模块:CheckElecLeak.c,负责检测是否漏电,平台文件划分(输出驱动文件),特点:与输入IO口有关,包含io_define.h,不包含全局变量 蜂鸣器驱动文件:BuzBeep.c .h,负责驱动蜂鸣器鸣叫,包括n短声、n长声等 时钟芯片驱动:RTC_PCF8563.c .h, 负责驱动8563时钟芯片 EEPROM驱动:ST_MCU_EEPRom.c .h,负责驱动ST的内部EEPRom

35、,Io_define.h,各文件间的包含关系,Main.c,Hardware.c,RTC_ PCF8563.c,BuzBeep.c,ST_MCU_ EEPRom.c, ,MainConst.h,STM8S105K.h,ChkKey.c,ChkTmp.c,Table_ Temperature.h,Check WaterPos.c,Check ElecLeak.c,Display.c,DealKey.c,UpWater.c,Defreeze.c,ElecHeat.c,GlobalVar.c,SetSave Para.c,Io_define.h,hardware.h,GlobalVar.h,hard

36、ware.h,GlobalVar.h,MainStruct.h,MainConst.h,GlobalVar.h,hardware.h,hardware.h,mainstruct.h,包含关系说明,所有的驱动程序只包含一个与硬件有关的io_define.h文件,更改硬件时只更改此.h文件即可 MainStruct.h和MainConst.h文件可以由任何文件包含,不过为提高可移植性,驱动文件一般不包含MainConst.h文件 GlobalVar.h被流程文件包含,被流程文件包含,不被驱动文件包含 Io_define.h负责普通IO口的定义,被驱动文件包含,尽量不被流程文件包含 Display.

37、c, DealKey.c, SetSavePara.c为流程文件与驱动文件的接口,可能会包含Io_define.h,各文件间的调用关系,Main.c,Hardware.c,RTC_ PCF8563.c,BuzBeep.c,ST_MCU_ EEPRom.c,ChkKey.c,ChkTmp.c,Check WaterPos.c,Check ElecLeak.c,Display.c,DealKey.c,UpWater.c,Defreeze.c,ElecHeat.c,GlobalVar.c,SetSave Para.c,595_Drv.c,调用关系说明,主文件可以调用所有模块的函数 Hardware.

38、c负责与硬件相关的操作,不调用其他文件的函数 显示模块不调用任何流程中的文件 流程文件不调用hardware.c中的函数,尽量不调用驱动程序中的函数 Display.c, DealKey.c, SetSavePara.c为流程文件与驱动文件的接口,既可能调用流程文件的函数,也可能调用驱动文件的函数,其他流程文件不调用驱动程序中的函数 流程文件各文件间可以互相调用 驱动文件不调用GlobalVar.c的函数,也不使用全局变量 所有驱动程序间没有任何的联系,但驱动程序可能会调用Hardware.c中的函数,主要是调用两个函数:f_MCU_FeedDog() 和f_NOPDelay()延时函数,各文

39、件间的数据流图,Main.c,tCurTime,RTC_ PCF8563.c,ChkTmp.c,Check WaterPos.c,Check ElecLeak.c,Display.c(使用全部全局变量,但不对全局变量更改),DealKey.c,UpWater.c,Defreeze.c,ElecHeat.c,tOption,SetSave Para.c,tSetPara nSetState nSetValue,tFault,tRelay,tUpWater tElecHeat tDefreeze,数据流说明,Hardware.c, BuzBeep.c, CheckKey.c等驱动文件不对任何全局变

40、量有影响 其他驱动文件(ChkTmp.c, ChkWaterPos.c)对全局变量的影响都是通过函数的返回值实现的,驱动文件本身不直接改写全局变量值 Display.c只读取全局变量,不改变全局变量的值 流程文件改写大部分全局变量 DealKey.c 调用流程文件的函数来设置全局变量,其本身只读取全局变量 SetSavePara.c文件只改写tSetPara变量 UpWater.c改写tUpWater变量和tRelay变量 ElecHeat.c改写tElecHeat变量和tRelay变量 Defreeze.c改写tDefreeze变量和tRelay变量 划分流程模块原则之一:每个模块只负责一种

41、功能,且每个模块基本只改写一组全局变量,模块说明:硬件模块(hardware.c .h),功能:硬件实现文件,实现和硬件有关的一些功能,主要包括延时函数,喂狗程序,初始化MCU基本设置, AD检测函数,PWM输出等 注意事项: AD检测注意延时,确保每次检测正确。 ST芯片每个循环都对IO口的输入输出进行设置 注意中断优先级,断电检测中断最优先 外部中断注意设置下降沿中断还是低电平中断 以f_MCU_做为函数的名称开头,硬件模块函数(Hardware.c),主要函数: f_NOPDelay() 延时函数,使用NOP循环 f_MCU_FeedDog() 清空看门狗 f_MCU_InitSfr()

42、 初始化MCU基本设置, 包括时钟、外部中断设置等 f_MCU_ChkJumper() 检测拨码开关(跳线)值 f_MCU_ChkADValue() 检测AD值,蜂鸣器驱动(BuzBeep.c; .h),功能:负责控制蜂鸣器是否鸣叫以及鸣叫时间,在需要鸣叫的时候只需调用此模块中的f_Beep函数即可(外部无需知道是如何实现鸣叫功能的)。 包括鸣叫1,2,3短声,1,2,3长声等。 注意事项: 与硬件的接口通过io_define.h完成 尽量不要使用中断来驱动蜂鸣器 BuzBeep.h中使用宏定义短声和长声的时间 需要其他鸣叫功能则更新此驱动程序,蜂鸣器主要函数(BuzBeep.c),主要函数:

43、 f_InitBuzPara() 初始化蜂鸣器参数(可省略) f_IncBuzTm() 增加蜂鸣器运行时间, 每10ms调用1次 f_Beep()蜂鸣器开始鸣叫, 输 入: i_BuzState(1为1短声,2为1长声,3为两短声,4为两长声,5为三短声,6为三长声,7为四短声,8为四长声,其它为不鸣叫,注意129和130,131,132,133,134为内部变量不能使用 f_StopBeep()停止蜂鸣器鸣叫, f_OutBuz() 输出蜂鸣器信号到芯片口, 在主循环或毫秒级时间中断中调用,EEPRom驱动 (ST_MCU_EEPRom.c),功能:用来驱动ST MCU自带的EEPRom,通

44、过此驱动程序可以从EEPROM中读出数据或向EEPROM中写入数据,同时可以检测EEPROM是否故障。 注意事项: 与硬件的接口通过io_define.h完成 MAX_READ_WRITE_EEPROM_NUM为故障判断次数,当连续写入(读出)错误超过此值时认为EEPROM故障 因ST自身问题,连续写入数据可能会导致程序不进中断,因此建议尽可能少向EEPROM写入数据,EEPRom驱动主要函数,需要读取数据的时候调用f_EEPRom_Read()函数, nFault = f_EEPRom_Read(unsigned char *)(i_pData), 22); 输入参数为: 数据缓冲起始地址,

45、读出的数据数量 输出参数为: 0 - 写入正常, 1 - 读出故障 需要写入数据的时候调用f_EEPRom_Write()函数 举例: nFault = f_EEPRom_Write(pData, 22); 输入参数为: 数据缓冲起始地址,要写入的数据数量 输出参数为: 0 - 写入正常, 1 - 写入故障 写入单个数据的时候调用f_EEPRom_WriteOneByte() 举例: nFault = f_EEPRom_WriteOneByte(0 x55, 3); 输入参数为: 要写入的数据,要写入的地址 输出参数为: 0 - 写入正常, 1 - 写入故障,RTC驱动 (RTC_PCF856

46、3.c),功能:用来驱动Philips 的时钟芯片8563,使用I2C总线方式,通过此驱动程序可以从RTC中读出时间数据或向RTC中写入数据,同时可以检测RTC是否故障。 注意事项: 与硬件的接口通过io_define.h完成 MAX_READ_WRITE_RTC_NUM为故障判断次数,当连续写入(读出)错误超过此值时认为EEPROM故障 因为时间一般需要几个BYTE来表示,因此需要使用结构体,包含MainStruct.h文件,RTC驱动主要函数,如果要读出小时分秒格式的数据,则调f_RTCGetHMSTime() 输入变量: hour_def格式的时间变量地址, 输出变量: 正确返回0, 错

47、误返回-1 例: nRTCFault = f_RTCGetHMSTime(,漏电检测模块(ChkElecLeac.c),电加热或防冻带开则检测是否漏电,不开的时候检测漏电检测电路是否正常 注意事项: 保证100ms内正确判断出故障 保证不会因为其他原因引起误报(射频干扰,群脉冲干扰等),温度检测模块(ChkTmp.c),使用平均值滤波:ChkAverageTmp.c 使用中值滤波:ChkMiddleTmp.c Table_Temperature.h文件中定义AD值与温度值的对应表 包含对所有传感器的温度检测,并检测传感器是否故障 根据实际情况判断多长时间检测一次温度 传感器故障要连续判断,不要

48、一次检测到错误即判故障,温度检测模块主要函数,在初始化时调用f_InitTmpPara函数初始化温度参数(可省略); 在1s中断中调用f_ChkTmp()检测温度 输入为当前温度值地址, 第几个温度值, 采样得到的AD值 ,短路故障返回1,开路故障返回2, 正常返回0 。使用平均值滤波每5次返回一次温度值。 如果需要立即返回温度值则调用f_ChkTmpAtOnce()函数,输入和输出与f_ChkTmp()函数相同。不同的是立即返回温度值和是否故障,水位检测模块(ChkWaterPos.c),使用中断检测:CheckWaterPos_Int.c 使用定时器检测:CheckWaterPos_Tim

49、er.c 如果可以尽量使用中断检测,并注意设置外部中断的滤波频率 大于等于2水位的最低频率小于等于2水位的最高频率认为是达到了2水位,其他同理 小于0水位最低频率或大于4水位最高频率则认为传感器故障 传感器故障要连续判断几次,不要一次检测到错误即判故障,水位检测模块主要函数,在初始化时调用f_InitWaterPosSensor函数(可省略); 将水位传感器脉冲中断指向f_Int_WaterPulse, 中断设置为下降沿触发 500ms秒调用一次f_CheckWaterPos()函数检测当前水位 输入为当前水位的地址, 输出为传感器是否故障 如果需要重新判断是否水位传感器故障则调用f_Rese

50、tWaterPosSensorFault函数,按键检测功能介绍(ChkKey.c),使用AD口检测按键:ChkADKey.C,不检测组合按键 连续按下80ms后按键有效 按键与AD值对应表:TBL_KEY_PRESSED_AD_VALUE 按键按下后抬起有效 按键返回值对应表 0 - 无按键按下 01 - 10KEY_1 11 - 20KEY_2 注:个位为1表示键按下后抬起, 2 表示键按下, 3表示键按下3秒 , 5表示键按下5秒, 其他预留,按键检测模块主要函数,1、在硬件实现文件中定义“KEY_TOTAL_NUM”合计按键数量; 主程序初始化时调用f_InitKeyPara()函数初始

51、化按键参数(可省略); 在10ms时间中断中调用f_ChkKey()函数;输入为检测到的AD值,输出为当前按键状态, 按键定义见上一页 如果要修改按键的AD值修改TBL_KEY_PRESSED_AD_VALUE数组;,按键处理模块(DealKey.c),功能:驱动模块与流程模块的接口,负责检测按键并处理按键,可能与所有模块都有关联 注意事项: 10ms调用一次f_DealKey() 按键处理模块本身不更改全局变量的值,但通过调用流程模块会改变全局变量的值 保证每次按键按下或抬起只处理一次,显示模块(display.c .h),功能:负责将状态输出到LCD或LED显示屏 注意事项: 只负责根据全

52、局变量判断显示输出,不包含逻辑转换功能。 输出显示如果需要扫描显示需放在时间中断中调用,不要放在主循环中,否则可能引起屏幕闪烁 扫描全部COM的时间不超过20ms ,否则会引起屏幕闪烁 扫描显示尽量使用595代替164,显示变量和函数(tDisplay),typedef struct bFullScreen : 1;/* 全屏显示时为1*/ bEngergySaving : 1; /* 节能时为1*/ bSelfTest : 1;/* 自检时为1*/ display_def; 主要函数: f_InitDisplay() 初始化显示输出 f_OutDisplay() 将显示缓冲区发送至IO端口

53、f_DeriveDisplayBuf() 获取显示缓冲,每100ms调用 f_SetFullScreenDisplay() , f_ClearFullScreenDisplay() 设置/取消全屏显示 f_SetEngergySaving(), f_ClearEngergySaving() 设置/取消节能显示 f_SetSelfTestDisplay(), f_ClearSelfTestDisplay() 设置/取消自检显示,参数设置模块(SetSavePara.c),功能:设置参数模块, 保存所有与参数设置有关的内容。包括进入设定参数模式, 进入下一个设定参数, 参数值增加(减小)保存设定参

54、数, 恢复默认参数,等功能。所有对全局变量tSetPara, nSetState, nSetValue的值的改写都在此模块中完成 注意事项: 使用数组TBL_PARA_DEFAULT 来存储 缺省参数 值,二维数组TBL_PARA_RANGE2 来存储参数设定范围,内容与savepara_def结构体相对应 只有main.c和DealKey.c调用此模块内容,其他流程文件不调用此模块内容, 本模块只调用驱动文件RTC_PCF8563.c和ST_MCU_EEPRom.c的函数来读取(保存)时钟和参数,参数设置模块主要函数,调用f_SetAllDefaultPara()函数设置默认参数, 使用TB

55、L_PARA_DEFAULT表中的值做为默认参数 例: f_SetAllDefaultPara(,参数设置模块主要函数(续),每100ms调用一次f_IncSaveParaTm()函数, 设定参数的时间+1, 按键按下时候调用f_ClearSaveParaTm函数重新计算设置的时间 准备开始设置参数的时候调用f_StartSetState()函数 输入变量: 要设置的状态 例: f_StartSetState(SET_WATER_POS);表示开始设置 参数 要将设置的参数保存时调用f_SaveSetState()函数 按下设置键时调用f_NextSetState()函数,保存当前设置参数,进

56、入下一个设置状态 按下Up键时调用f_SetValueUp()函数,增加设置值,按下Down键时调用f_SetValueDown()函数, 减小设置值, 使用TBL_PARA_RANGE表做为设定的最大最小值,流程模块,以下三个模块为UpWater.c,ElecHeat.c和Defreeze为流程处理模块,要根据规格书来进行分析和处理,注意流程处理模块间的逻辑关系,上水模块(UpWater.c),功能:上水处理模块, 负责和上水有关的功能函数定义,根据逻辑关系更改tUpWater全局变量的值。判断和上水有关的保护,并根据保护和当前状态判断是否打开上水阀 注意事项: 要区分开上水请求和上水(打开

57、上水阀)的区别 注意出现保护和故障时的处理方式,是停止上水请求还是只关闭上水阀,当故障或保护恢复时重新上水,一般规格书不会明确的说明,要和产品经理沟通后确定。本平台使用后者,只关闭上水阀,请求依然存在 有上水请求时是否还需要理会其他上水请求?本平台采用水位优先原则,即谁要求的水位高,则谁优先,水位相同,则后来者优先。,主要函数定义(上水模块),启动上水, 根据当前状态变量判断是否可以启动上水 * 调用方法: nFault = f_StartUpWater(2, 1); * 输入参数: 目标水位, 上水原因 输出参数: 可以上水返回0,因故不能上水返回1, 已达到目标水位返回2 处理过程:有保护

58、不能启动上水,水位已达到目标水位也不上水, 传感器故障和低水压保护只能手动上水, 大于当前水位更改上水水位和原因, 手动上水, 取消低水压保护, 重新计时,f_StopUpWater:停止上水:停止上水请求, 如果上水原因是电加热则停止电加热,f_SwitchUpWaterState():上水按键按下, 切换上水状态, 在上水则停止上水(因防冻引起的电加热上水不能停止) 原来未上水则开启手动上水 * 调用方法: nFault = f_SwitchUpWaterState(2); * 输出参数: 可以上水返回0,因故不能上水返回1, 已达到目标水位返回2,主要函数定义(上水模块),f_Judge

59、NoWater() 功能描述: 判断是否缺水, 缺水5分钟后启动上水 * 调用方法: nNoWaterTm = f_JudgeNoWater(); * 输出变量:无水时间(单位:秒), 无缺水上水需求返回-1,f_JudgeAntiBombProtect() * 功能描述: 判断是否防炸管保护,大于90度且无水置防炸管保护标志,f_UpWaterRoutine() 功能描述: 上水例行程序,根据保护和当前状态判断是否打开上水阀 上水中则判断是否低水压保护,传感器故障 有保护关闭上水阀,到达设定水位停止上水请求 最后判断是否打开上水阀,f_JudgeTmpControlUpWater() 判断是否温控补水,根据规格书规定的温控补水条件判断是否温控补水 如果已经温控补水则判断是否取消,f_JudgeTimerUpWater() * 功能描述: 判断是否定时上水, 包括全天候的定时上水,主要流程(上水流程),电加热模块(ElecHeat.c),功能:电加热处理模块, 负责和电加热有关的功能函数定义,根据逻辑关系更改tElecHeat全局变量的值。判断和电加热有关的保护,并根据保护和当前状态判断是否打开电加热继电器 注意事项: 要区分开电加热请求和电加热运行(打开继电器)

温馨提示

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

评论

0/150

提交评论