基于CAN总线的汽车空调软硬件系统设计(5)

2019-08-02 00:36

启动代码内核文件根文件系统驱动程序应用程序

图 5.1 主节点程序开发流程

由于Linux的代码开源特性以及其在网络上的广泛传播 ,因此流程的前几步基本可以通过网络或其他途径来实现,其方法也已经形成统一的模式,因此在这里对于这几步就不多做介绍,而把重点放在最后两步:驱动程序和应用程序。由于Linux操作系统的特性,应用程序不能直接访问底层硬件模块,而只能通过驱动来提供读写访问接口,为了读写CAN总线的信息,必须为CAN收发模块实现驱动程序;而应用程序的设计是主节点的核心,主节点的大部分工作由应用程序来完成。

5.2.1 主节点CAN收发模块驱动程序设计

Linux的驱动程序主要分为字符设备驱动、块设备驱动、网络设备驱动等几

大类。字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点。内核与网络设备的通信和内核与字符设备、块设备的通信方式完全不同。显然,本设计中CAN收发模块更符合字符设备的定义,且字符设备驱动实现方式简单明了,因此,这里我们打算以字符设备的方式来实现CAN模块的驱动。

在Linux系统中应用程序对字符设备的访问都是以文件的形式存在,因此驱动程序需为该设备创建一个文件节点并实现文件访问函数open()、read()、write()、 ioctl()等。Linux驱动程序与应用程序以main函数作为入口函数不同,它的入口函数以内核函数module_init来指明,通常入口函数都以设备名称命名为xxxx_init的形式,因此在这里我们可以将驱动程序的入口函数声明为如下形式: static __init can_init(void);

在入口函数中,要实现的工作包括字符设备号的申请、字符设备结构体的初始化、设备注册、文件节点的创建。在Linux 2.6.32版本内核中,该实现过程如

下:

(1)首先调用register_chrdev_region或者alloc_chrdev_region函数申请设备号的使用,两者的区别在于前一个函数申请的设备号由用户,后一个函数则由内核分配一个未使用的设备号。

(2)初始化字符设备描述结构体cdev,主要是为其成员变量赋值,从而使该结构体与申请到的设备号关联,并且和用户指明的文件操作结构体指针关联。 (3)调用cedv_add函数向内核注册设备。

(4)使用class_create和device_create函数在文件系统的dev目录下创建对应该设备的文件节点。

完成以上过程之后,还需要实现文件操作结构体file_operations中的文件操作函数,这里主要实现open、read、wrie函数,对于设备的打开和读写操作。

在打开设备的操作open函数中,首先将与S3C2440与CAN模块连接的IO进行地址映射,然后完成CAN收发器SJ1000的初始化工作,其流程如下:

初始化开始置工作方式为复位模式置通信模式为PeliCAN设置验收屏蔽码设置验收代码值设置正常输出模式设置RX缓冲起始地址清除TX错误计数清除错误代码捕获寄存器置工作方式为工作模式初始化结束

图 5.2 CAN收发控制器初始化程序

完成初始化之后,便可用read和write函数读写CAN模块,考虑到数据的传输可靠性,这里读写函数都以阻塞的方式实现。在读函数read中,只需读SJA1000的状态寄存器,若没有,则等待一段时间后重新读状态寄存器,若有数据接收,

则将接收的数据读出并通过调用从内核向用户空间拷贝的函数copy_to_user把接收的数据返回给用户程序。具体的流程如下图所示:

开始读SJA1000状态寄存器N接收缓冲区是否收到信息?Y从缓存区读出信息释放接收缓存区拷贝信息到用户空间返回到用户程序

图 5.2 CAN主节点接收程序

发送过程只需要把数据写到CAN控制器的发送缓存区,启动发送数据命令后CAN控制器会自动完成向CAN总线的数据发送,其程序流程图如下所示:

开始读SJA1000状态寄存器N发送缓存区是否被锁Y写入发送信息置发送请求位N是否发送完成Y返回到用户程序

图 5.3 CAN主节点发送程序

5.2.2 主节点应用程序设计

5.2.2.1 主节点标定程序设计

在汽车行驶当中,车外空气和太阳辐射都会向汽车乘用仓传递热量,由于这部分热量较小,在本设计中简单地以模糊控制的思想对这部分热量利用内外风门开度进行补偿 。在这里将车外温度分为寒冷、凉快、舒适、暖和、炎热五个等级,将太阳辐射也分为微弱、适度、强烈三个等级。标定程序开始后,车外温度测量节点采集车外空气的温度并将数据传递给主节点。此时标定程序在显示屏上提示用户选择当前车外温度的等级,根据用户的选择,确定每个温度等级对应的温度范围。同样,太阳辐射节点将太阳辐射对应的电压值F传递给主节点后,主节点也会要求用户选择当前的辐射等级,若用户选择的是微弱级,则电压0-2F对应的太阳辐射是微弱,2F-4F是适度,大于4F则是强烈;若用户的选择是适度,则将0-0.5F定义为微弱,0.5F-2F定义为适度,大于2F定义为强烈;若用户选择的是强烈,则0-0.25F定义为微弱,0.25F-0.5F定义为适度,大于0.5F定义为强烈。车外温度以及太阳辐射决定了内外循环风门的开度,如下表所示:

开度 寒冷 凉快 舒适 暖和 炎热

微弱 0% 30% 60% 50% 20% 适度 10% 40% 70% 40% 10% 强烈 20% 50% 60% 30% 0% 5.2.2.2 主节点其他程序设计

主节点应用程序要同时运行人机交换、CAN节点通信和运算等多个任务。

因此在这里采用Linux的多线程编程首先运行主线程,在主线程成创建执行其他任务的子线程。主线程的运行过程如下:

(1)打开CAN模块的设备文件节点来完成CAN模块的初始化。

(2)打开配置文件,根据配置文件设置设定温度、风速、各风门开度等信 息,若打开失败,则开始标定工作,确定车外温度和太阳辐射的补偿数,并创建配置文件。

(3) 创建用于保存接收信息的全局缓存区,分别保存车内温度、车外温度、 发动机水温、冷凝器温度、太阳辐射强度。

(4)创建子线程,完成恒温控制的主要工作。 (5)等待子线程退出。

主线程创建的第一个线程为人机交换线程,用于接收用户的按键。主要有功能键、确认键和“+”键、“-”键。功能键用于用户选择要执行的操作,当用户按下功能键之后,在液晶屏上会弹出一个列出用户所以可以执行的操作的菜单。包括温度设定、内外循环风设定、空调开关、出风口风向设定、风速设定。用户通过“+”和“-”来选择,并用确认键来确认选择。选择某一菜单之后,可以通过“+”和“-”以及确认键来进行具体的设定。例如需要调节风速,则在选择风速设定菜单后使用“+”来增大风速,使用“-”来减小风速,这里将风速分为5级,调节到不同的等级后,会调用控制传输子函数,控制传输子函数向鼓风机控制节点发送控制信息,鼓风机节点则调整电机的转速,从而实现风速的调节。当调节完毕,按下确认键就会返回到显示主界面。

主线程创建的第二个线程为信息采集子线程,用于读取CAN控制器的接收数据缓存区,由于CAN驱动的读操作是阻塞读的方式,因此,当没有数据可读时,


基于CAN总线的汽车空调软硬件系统设计(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2015-2016年广州越秀区四年级下数学期末考试试卷

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: