基于CAN总线的智能照明控制系统软件设计方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于CAN总线的智能照明控制系统软件设计方案
1.1 系统软件结构
系统软件采用广泛流行的计算机高级语言C语言编写,它具有语言简洁、紧凑,生成目标代码质量高、程序执行效率高,容易阅读、具有很好的移植性,具有较强的结构性和便于模块化设计等优点。
在本系统软件设计中采用模块化的设计思想,按照系统的功能作用进行模块划分,再依次对各功能模块进行编程设计。
这样使系统在添加新功能时变得非常容易,在建立复杂应用和提高代码的可读性、可重复利用性方面也是非常有益的。
特别是在对后续的产品更新、程序维护、升级等有极其重要的意义。
本系统软件结构主要包括主节点软件结构和从节点软件结构两部分。
1.1.1 主节点软件结构
主节点是整个CAN总线智能照明控制系统的核心单元,它管理了多达110个从节点灯设备,它要求具有强大的数据存储、运算处理能力和友好的人机界面。
因此,主节点的软
件结构设计的好坏以及其程序模块的划分是否得当,将会直接地影响着整个照明控制系统的性能优劣。
因此,合理规划主节点的软件结构和模块划分是非常有意义的。
在本设计中,经过精心的设计规划,将主节点系统软件划分为七大模块,它们分别为:系统初始化模块、CAN协议模块、TFT液晶显示模块、SD卡驱动模块、UART驱动模块、触摸屏键盘扫描模块以及蜂鸣器驱动模块。
主节点软件结构如图1.1所示:
图1.1 主节点软件结构
1.1.2 从节点软件结构
从节点是单个照明设备单元的控制中心,照明灯设备执行器的开关动作以及照明设备开关灯的时间长短完全取决于从节点的控制。
因此,照明设备是否正常工作直接取决于从节点的软件设计。
合理划分从节点的程序模块,能够有效提高软件的健壮性。
经过仔细思考后将从节点软件划分为六大模块,它们分别为:系统初始化模块、CAN协议模块、照明控制信号数据处理模块、键盘扫描及处理模块、照明灯定时控制模块以及LCD液晶显示模块。
从节点软件结构如图1.2所示:
图1.2 从节点软件结构
1.2 系统程序模块设计
1.2.1 主节点程序模块设计
由图1.1可知,主节点系统程序主要由七大模块构成,它们分别是:系统初始化模块、CAN协议模块、TFT液晶显示模块、SD卡驱动模块、UART驱动模块、触摸屏键盘扫描模块以及蜂鸣器驱动模块。
然而,节点主程序是这些程序模块的调用者,是实现主节点功能的途径,所以其他程序模块的设计,目的都是为了服务于主程序,以实现主节点监控从节点灯设备的功能。
如图1.3所示是主节点的主程序流程图。
首先,初始化主节点硬件设备如:TFT彩屏、SD卡、CAN控制器、中断系统等,接着显示监控界面1,然后进入一个无限的工作循环。
在工作循环中,处理如下工作,先判断当前模式是不是进入了灯设置模式,如果是则停止向从节点发送数据请求帧。
若不处在灯设置模式,则依次向各个从节点发送数据请求帧,请求从节点返回其灯数据。
接着,判断是否有触摸按键按下,
若有则作出相应的按键处理并刷新显示,最后检测主节点的运行、通信状况和对从节点是否离线的检测。
这样主节点就处理完成所有的从设备监测、设置、离线检测、运行指示、通信指示等主要功能。
图1.3 主节点主程序流程图
1.2.1.1 初始化模块程序设计
在主节点软件结构中,系统初始化程序是系统能够正常工作的基础,是系统在进入工作循环时首先执行的一段代码。
通过系统初始化将主节点硬件设备设置成一个确定的状态,以等待后备的使用。
其系统初始化模块主要包括5大部分:TFT液晶初始化、UART0初始化、CAN1初始化、SD卡初始化、触摸屏中断初始化。
(1)TFT液晶初始化:首先,将TFT液晶接口管脚配置好,由于液晶接口的数据线和控制线都是采用LPC2119控制器的GPIO口模拟的,故要将其数据线DATA0-DATA15、数据/命令线(LCD_RS),读/写控制线(LCD_RD/LCD_RW),使能控制线(LCD_CS)管脚配置为输出口。
触摸屏SPI通信接口也采用IO 口模拟操作,将与触摸屏控制器片选线T_CS、数据输出线T_MOSI、串行时钟信号线T_CLK相连的GPIO口设置为输出口。
与数据输入线MISO相连的IO口设置为输入,并初始化触摸屏中断系统。
紧接着开启彩屏内部时钟,配置彩屏电源,然后伽马校正并设置,最后开显示并清屏。
具体的TFT液晶
初始化程序流程图如图1.4所示。
(2)UART0初始化:先通过配置管脚连接寄存器,使LPC2119的P0.0、P0.1管脚连接到串口0模块。
再设置串口的帧结构,设置为8bit每帧,采用奇校验方式,接着设置串口波特率为115200bps.具体串口初始化流程图如图1.5所示。
(3)CAN控制器初始化:首先,配置CAN1管脚功能,设置进入CAN控制器的复位模式,设置告警上限值为0x60,设置通信波特率为约400Kbps,允许CAN接收中断,并禁止验收滤波器,接着恢复到正常工作模式,最后初始化CAN接收中断。
具体CAN1控制器初始化流程图如图1.6所示。
图 1.4 TFT液晶初始化图 1.5 UART0初始化图1.6 CAN1控制器初始化
(4)SD卡初始化:首先,配置SD管脚功能,将SD卡片选信号置高,连续发送至少74个时钟,将片选拉低(CS=0),发送复位命令CM0,使SD进入SPI操作模式。
确定SD卡正确响应后,发送激活SD卡初始化程序的命令CM1,到此则初始化SD卡完毕。
具体SD卡初始化程序流程图如图1.7所示。
(5)触摸屏中断初始化:首先,设置LPC2119的P0.3为外部中断INT0,设置外部中断0(触摸屏中断)为IRQ中断,设置IRQ中断号、激活,设置外部中断INT0为下降沿触发,清零中断标志位并使能中断。
具体触摸屏中断初始化程序流程图如图1.8所示。
图1.7 SD 卡初始化程序 图1.8
触摸屏中断程序
1.2.1.2 CAN 协议模块设计
CAN 协议模块是本设计的主要内容,也是设计中的重要内容。
CAN 协议程序模块设计的好坏对整个系统能否继续进
行起着决定性作用。
是关系到整个照明控制系统生死攸关的问题,是能否使系统健壮,通信可靠的关键。
设计中,将CAN 协议模块分成CAN驱动程序模块和CAN协议数据格式模块。
下面我将分别详细介绍这两个部分。
(1) CAN协议数据格式:主要采用源/目的协议模式以一定的格式来对所要处理的数据进行填充和解释,然后发送给各个从节点。
在CAN接收环节中CAN节点通过验收代码寄存器和验收屏蔽寄存器,采用双滤波方式确定该数据是否是本节点的数据或广播数据,从而对数据进行选择接收或丢弃,并将CAN接收缓冲区内的数据依照先前制定的协议规则进行解译接收。
下面首先介绍主从节点在应用层上共同的CAN协议规则。
本系统采用的是CAN2.0B协议,该协议支持11位ID同时也支持29位ID,目的在于兼容CAN2.0A协议。
而在本次运用中,由于系统规模还算比较小,我们采有11ID标识符已经能够满足设计上的要求。
故,在本设计中采用的是标准帧格式(即11ID标识符的帧格式)。
其帧结构如图1.9所示。
图1.9 CAN总线帧结构
11位ID分成三个域:源节点号、目的节点号、数据类型。
其中,源节点号是发送者节点号,目的节点号是接收者的节点号或者是广播ID=0xF,数据类型分为5种,①强制型灯设置数据,在强制开关灯模式下使用,发送的数据全是灯状态,不含有灯时间字节,一帧数据中携带有多个灯设备的开关信号。
②常规型灯设置数据,在常规设置模式下,每帧灯设置数据只包含一个从设备灯的控制信息,包括开关灯时间及开关状态信息。
③确认信号,确认信号帧不带灯数据段,数据长度DLC=0x0,用于同步启动整个系统的灯设备。
④数据请求帧,表示本帧数据是请求数据帧,也是没有灯数据段的,用于主节点向从节点请求灯数据。
⑤灯状态数据帧,包含着一个从设备灯的剩余时间和开关信息。
RTR位是用于区别该帧是数据帧(RTR=0)还是远程帧
(RTR=1)。
DLC为数据长度码,用于表明数据域中含有的字节数。
后面的灯设备状态数据含有5个字节,分别为时间和灯设备状态。
灯设备状态有三种:开灯、关灯和离线。
当开关状态字节为0表示节点关灯,1表示节点开灯,2表示节点离线。
数据类型与ID20-ID18值的对照表如表格4-1.
表4-1 数据类型对照表
帧类型
ID20-ID
18
000 强制型灯设置
数据
001 常规型灯设置
数据
010 确认信号帧
数据请求帧
011
CAN协议数据格式实现主要由两个函数实现,分别为数据打包函数和数据解包函数。
数据打包是将用户的数据,按照上述CAN协议数据规则,组装成数据帧发送出去。
解包程序则相反,是将CAN接收缓冲区中的数据,按照CAN协议数据规则解压理解,并产生照明控制信号,控制照明设备。
CAN 数据打包程序流程图如图1.10所示。
图1.10 CAN协议数据格式打包函数
CAN数据解包函数主要是将发送过来的数据按照CAN协议数据格式解析并接收。
在主节点的数据解包中,由于在本
设计中,从节点发送给主节点的数据只有一种即常规型灯数据,故在接收到数据后只要判断是不是该类数据即可。
所以,它与数据打包函数并不完全对称,现给出CAN数据解包函数流程图如图1.11所示。
图1.11 CAN数据解包程序流程图
(2) CAN驱动程序模块:对CAN数据的发送和接收处理。
对于主节点,发送信息有三种:①发送主节点设置信息。
②发送确定启动信号。
③发送数据请求帧。
在主节点发送设置
信息和确定信号后,接着发送数据请求帧,以请求从节点灯数据。
从节点在接收到设置信息和确定信号后,按照CAN协议数据格式规则解译,产生灯控制信号,并启动定时器,开始控制从设备照明灯。
CAN驱动程序模块主要包括帧发送函数与帧接收函数。
在帧发送函数中,首先根据用户的入口参数(目的节点号/广播ID、数据类型等),调用数据打包函数,按照用户的要求,组装成CAN数据帧,并启动发送。
而在帧接收函数中,先调用数据解包函数,提取源节点号、目的节点号、数据类型等,再根据数据类型提取数据段数据,最后释放CAN接收缓冲区,并标识接收完毕。
CAN帧发送程序流程图和CAN帧接收程序流程图分别如图1.12和图1.13所示。
N
N
图1.12 CAN帧发送程序流程图图1.13 CAN帧接收程序流程图
1.2.1.3 TFT液晶显示模块设计
TFT液晶设备是一个输出设备,是用户与系统进行交流沟通的桥梁。
而TFT液晶显示模块是实现人机接口界面,实现人机交流沟通功能的基础。
因此,良好的TFT液晶显示模块,是实现友好人机界面的关键。
设计中将TFT液晶显示模块划分为两层:TFT液晶驱动程序层和TFT液晶应用程序层。
驱动层是最底层的程序,是直接与TFT硬件打交道的程序,需要对其硬件接口及操作时序有深刻的理解。
所有的应用层函数都是基于该驱动层函数实现的。
TFT驱动层函数包括:TFT初始化函数、写字节数据函数、写字节命令函数、TFT读字节函数。
下面分别讲解驱动程序函数的实现,TFT 初始化函数已经在系统初始化模块中做过论述,在此就不再重复讲解了。
写字节数据函数:打开TFT片选(LCD_CS=0),将数据/命令端口RS置高电平,以通知液晶控制器,发送的是普通数据而不是命令数据,接着给数据总线填入要写入的数据,TFT写控制端WR先拉低再拉高,形成一个上升沿,一个上升沿后数据就写入TFT液晶了,最后再关掉片选。
写字节命令函数:打开片选,将数据/命令端口RS置低电平,以通知液晶控制器,发送的是命令数据而不是普通数据,接着给数据总线填入要写入的数据,TFT写控制端WR先拉低再拉高,形成一个上升沿,一个上升沿后数据就写入TFT 液晶了,最后再关掉片选。
TFT读字节函数:打开片选,写入要读的RAM地址,设置数据总线为输入口,设置数据/命令选择线为高电平,以说明读的是数据,接着将读控制线RD先拉低再拉高,形成一个上升沿,一个上升沿后数据就从TFT液晶输出到总线了,然后从总线上读取数据并存于变量中,最后关闭片选。
TFT 驱动程序的各函数流程图如图1.14、图1.15、图1.16所示。
图1.14 TFT写数据字节图1.15 TFT写命令字节图1.16 TFT读字节数据
应用层是基于驱动层而设计的,其主要功能是利用驱动层函数实现各种图形对象的绘制,为实现友好的人机界面做好铺垫。
其中,TFT应用层函数包括:画点函数、画线函数、
画矩形函数、画圆函数、填充矩形函数、填充圆函数、清屏函数、图片显示函数…;灯控件显示函数、总线对象绘制函数、按键控件绘制函数、软键盘绘制函数…;监控界面1绘制函数、监控界面2绘制函数、设置界面3绘制函数…。
由于函数太多下面只抽取几个给予讲解并分别给出各个程序流程图。
画点函数,画点函数是所以其他应用层函数的基础,其程序流程图如图1.17所示。
画线函数,画线函数也是为更高层运用而设计的,如为绘制矩形、填充矩形、绘制控键等使用。
其程序流程图如图1.18所示。
图 1.17 画点函数图1.18 画线函数
矩形绘制函数是绘制方形触摸屏按键的主要函数之一,设矩形绘制函数入口参数为两个对角定点(x1,y1)、(x2、y2)和矩形边框颜色color,则只需用color颜色绘制四条直线即
可。
其程序流程图如图1.19所示。
触摸屏按键绘制函数,首先根据用户提供的入口参数:控件背光部分颜色、控件躯体颜色、控件向光部分颜色、控件大小、控件位置、写入控件文字字模的指针、控件状态(按下/弹起)等,判断按键是按下还是弹起状态。
若是按下状态则绘制按下状态的控件,否则绘制弹起状态的控件。
控件绘制函数流程图如图 1.20所示。
图1.19 矩形绘制函数 图1.20 触
摸屏按键绘制函数
1.2.1.4 触摸屏模块程序设计
触摸屏模块主要包括触摸屏驱动层的A/D 转换、识键等程序和应用层的触屏按键扫描程序。
触摸屏控制器采用的是具有12位A/D 转换器的触摸屏芯片XPT2046,该芯片采用的
是SPI串行通信总线。
我们采用SPI操作方式对该触屏控制器进行操作,以转化触摸点的电压。
在这里只介绍驱动层的读取A/D函数和应用层的按键扫描函数。
读取XPT2046的A/D转换电压的流程如下,先选中XPT2046芯片,向其发送A/D转换命令,等待1ms,然后读取A/D转换值并提取低12位,最后释放片选返回A/D值。
其流程图如图1.21所示。
应用层的键盘扫描函数,主要用于用户与系统的交流,用于设置从设备的灯状态和监测灯设备。
触摸屏按键扫描程序流程图如图1.22所示。
图1.21 读XPT2046的A/D值图1.22 触摸屏键盘扫描程序
1.2.1.5 SD驱动模块设计
在本设计中SD卡采用SPI总线操作模式进行操作。
总
线分别为SPI串行时钟线SD_CLK、SPI数据输出线SD_MISO、SPI数据输入线SD_MOSI.先使SD卡进入SPI总线操作模式,再对SD进行读写操作。
在SD卡驱动程序当中,最核心的是SD初始化化函数、SD卡读字节函数和SD卡写字节函数。
SD 初始化程序在系统初始化中已经介绍过了,在这里就不再介绍了,在这里只介绍SD的另外两个最基础的函数:SD卡读字节函数、SD卡写字节函数。
SD卡读字节函数:串行时钟线SD_CLK先拉低再拉高,则在SD_CLK线上产生1个上升沿,则SD卡中的1位数据流出到输出线SD_MISO上,然后读取该位数据后左移1位,再在SD_CLK线上重新产生上升沿,读取下一位数据,直到读完一个字节。
其程序流程图如图1.23所示。
SD卡写字节函数:串行时钟线SD_CLK拉低,将要写入的字节的最高位取出,放在数据线SD_MOSI上,然后串行时钟SD_CLK拉高,数据的1位则进入SD卡了,接着要写的数据左移1位,在重复写第二位,依次循环执行8次,将整个字节写入SD卡。
SD卡写字节函数程序流程图如图1.24所示。
N
N
1.23 SD卡读字节程序图1.24 SD卡写字节程序
1.2.1.6 串口驱动模块设计
在本设计中,串口驱动模块程序主要是用于程序的调试使用。
串口驱动程序包括:串口初始化函数、串口字节发送
函数、串口字符串发送函数。
串口初始化函数在系统初始化
模块中已经介绍过,在此不再重复介绍。
下面介绍串口字节发送函数和串口字符串发送函数。
UART0字节发送函数非常简单,首先将要发送的字节填充入串口发送缓冲区U0THR中,然后请求并等待发送完毕。
UART0字符串发送函数,利用字符指针变量读取1存储单元的字节,并调用串口字节发送,然后指针变量值自加1,指向下一个存储单元,再发送指针变量指向的字节,直到指针变量指向的字节为‘\0’为止。
串口字节发送函数及串口字符串发送函数程序流程图如图1.25和图1.26所示。
图1.25 串口字节发送程序图1.26
串口字符串发送程序
1.2.1.7 蜂鸣器驱动模块设计
蜂鸣器电路由S8550三极管、蜂鸣器、电阻组成。
三极管主要是用作电子开关,用于控制蜂鸣器是否有电流流过。
S8550三极管(PNP)基极通过一个2K的限流电阻连接到LPC2119处理器的P0.2口。
当处理器P0.2输出低电平时,三极管导通,蜂鸣器有电流流过,蜂鸣器蜂鸣。
当处理器P0.2口输出高电平时,三极管截止,蜂鸣器无电流流过,停止蜂鸣。
蜂鸣驱动程序就是通过给P0.2置高低电平而控制蜂鸣器发声与停止发声的。
蜂鸣器按键发声程序流程图如图1.27所示。
图1.27 蜂鸣器按键发声程序
1.2.2 从节点程序模块设计
由图1.2可知,从节点系统程序主要包括六大模块:系统初始化模块、CAN协议模块、照明控制信号数据处理模块、键盘扫描及处理模块、照明灯定时控制模块以及LCD液晶显示模块。
这些模块是实现从节点照明灯控制功能的主要“砖瓦”,然而,必须利用某种行为将这些“砖瓦”砌起来,而主程序就是产生这种行为的程序。
下面将重点介绍从节点主程序,让我们更理解从节点软件的运行框架。
如图1.28所示是从节点的主程序流程图。
首先,进行系统初始化。
其主要工作是初始化中断系统、初始化SJA1000 CAN控制器、初始化液晶模块。
为后面系统运行时的CAN总线通信、液晶的显示和中断的响应做好准备。
接着,主程序进入1个工作循环,在工作循环里先进行键盘扫描,然后判断CAN接收标志Re_Flag=1否,如果Re_Flag为1,则说明CAN接收到数据,并进行数据处理和显示刷新并清零CAN接收标志Re_Flag。
如果Re_Flag为0则直接重新进行下一次
工作循环。
图1.28 从节点主程序流程图
1.2.2.1 初始化程序模块设计
初始化程序模块由中断系统初始化、SJA1000CAN控制器
初始化和液晶初始化组成。
中断系统初始化程序由CAN总线接收中断初始化、外部中断0(按键中断)初始化、定时器T0中断初始化组成。
CAN接收中断和按键中断利用的是外部中断,采用的是低电平触发中断,定时器中断初始化为定时方式2,即采用的定时器是16位的,设置初值,使每50ms产生一次中断,每产生20次中断,则定时1s.通过该定时器可以实现照明设备的定时控制。
从节点系统初始化程序流程图和中断系统初始化流程图分别如图1.29和图1.30所示。
图 1.29 从节点系统初始化流程图图
1.30 从节点中断系统初始化流程图
SJA1000初始化程序操作流程如下,首先设置模式寄存器MODE进入复位模式,因为很多寄存器是必须在复位模式下才能操作。
进入复位模式后设置验收代码寄存器和验收屏蔽寄存器,设置通信波特率为约400Kbps,选择双滤波验收方式,最后回到工作模式。
LCD初始化函数,选择LCD为8位位流方式,关闭显示然后清屏,设置光标移动方式为右移,不显示光标、不反白,然后开显示并显示初始界面。
从节点SAJ1000CAN控制器初始化和LCD液晶初始化程序流程图分别如图1.31和图1.32所示。
图1.31 SJA1000的初始化流程图图
1.32 LCD初始化程序流程图
1.2.2.2 CAN协议模块设计
CAN协议模块主要包括CAN应用层程序模块和CAN驱动层程序模块。
CAN应用层协议在主节点CAN协议模块设计中已经详细介绍过。
如需了解请查阅主节点软件设计中CAN模块设计部分内容,在这里不再重复讲解CAN应用层协议内容。
下面主要讲解CAN驱动层程序,CAN驱动层程序与主节点类
似,包括CAN帧发送程序和CAN帧接收程序。
由于在本设计中从节点发送给主节点的数据类型只一种,即常规的灯数据。
故,CAN帧发送程序得到了简化,首先将CAN帧设置为标准数据帧,数据字节长度为5字节。
然后将照明灯的剩余时间和灯状态填入CAN发送缓冲区,最后请求发送。
从节点CAN总线帧发送程序流程图如图1.33所示。
CAN总线帧接收程序采用外部INT1中断服务程序进行接收,当CAN控制器接收到CAN数据后,产生中断,中断信号由SJA1000的中断引脚输出,通过触发单片机的外部中断,从而通知单片机向CAN控制器SJA1000提取CAN数据。
CAN 接收中断服务程序如图1.34所示。
图 1.33 CAN帧发送程序流程图图3.34 CAN帧接收程序流程图
1.2.2.3 照明信号数据处理模块设计
照明信号数据处理模块主要是根据主节点发送过来的灯设置信息,决定何种情况打开还是关闭照明设备开关,并根据情况决定是否需要开启定时器,以及是否需要刷新显示等。
在从节点接收到灯设置信息和确定信息后,开始调用数据处理函数,首先关闭定时器,重新赋值初值和清零相关计数变量,接着根据开关状态变量刷新显示,然后判断是开灯还是关灯,再做相应的动作和启动定时器。
具体程序流程图如图3.35所示。
图1.35 照明信号数据处理程序流程图
1.2.2.4 键盘扫描及处理模块设计
键盘扫描及处理模块主要用于实现人机交互,用于设置本从节点灯设备的开关灯情况。
键盘是1个输入设备,其软件驱动方法主要是通过检查按键是否按下,当按键按下时,
该管脚将与地线GND相连为低电平,否则为高电平。
处理器就是通过检测该引脚的高低电平来判断按键是否按下的。
键盘扫描及处理模块程序流程如下:首先,判断循环选择键Key1是否按下,若按下则停止定时器,禁止CAN接收中断,循环键按下次数变量Key1num++,并在特定位置显示闪烁光标,然后等待按键Key1num松开。
接着判断加1键Key2按下否,若按下则将对应的变量加1,并刷新显示。
接着判断减1按键按下否,按下则将对应变量减1,并刷新显示。
键盘扫描及处理模块程序流程图如图1.36所示。
图1.36 键盘扫描及处理程序流程图
1.2.2.5 照明灯定时控制模块设计
照明灯定时控制主要是通过单片机定时器T0进行定时控制的。
由于每50ms产生一次定时中断,通过Count记录
中断次数,当中断次数达到20次时,表示计时1s,Count清零,Secound变量自加1,当Scound计数值达到60时,表示计数达到1分钟,则照明灯数据中的时间将减少一分钟并刷新显示,当照明灯的时间中的分个位减少到0后,分十位则减1,分个位变为9并刷新显示。
依次进行下去……就可以实现时间上分和时的定时。
当在运行中途被重新设置了灯的时间,则将要清除各个计数器。
照明灯定时控制程序流程图如图1.37.。