新闻中心

EEPW首页>嵌入式系统>设计应用> 基于AVR单片机的控制系统设计

基于AVR单片机的控制系统设计

作者: 时间:2013-12-12 来源:网络 收藏

系统软件结构

系统软件体系分为几个部分:

(1)系统的循环检测部分,用于检测各通道的系统设备工作是否正常,出现异常时则通过三色指示灯报警(绿色代表正常,红色代表异常,黄色为中间状态)。
(2)系统的设置部分,接受用户按键,用户可以在GUI上设置希望设置的参数。
(3)网络接口部分,此时单片机系统不参与设置,主要功能将网络部分获得的数据导至各通道。软件系统的核心部分在于菜单结构的设计。

本系统采用一种基于节点编号的三叉树状菜单的设计。将整个菜单看作一个菜单树,每个界面对应于树中的一个节点,父节点为当前菜单的上一级菜单;右节点为当前菜单的“兄弟”菜单,亦即上级菜单的其余子菜单。

我们采用对节点编号的方式将整个菜单树串起来,通过识别节点编号(ID)就能知道该节点处于哪一级菜单,同时也便于我们将菜单数初始化。编号方式:每级子菜单的编号为上级父菜单ID乘以10再加上该级子菜单在上级菜单中对应的子项号(1,2,3.),我们将根节点ID编号为1,则根节点菜单的子菜单对应的ID分别为11,12,13。ID为11的节点的下级菜单ID为:111,112,113。一个树型结构菜单的结构和ID编号的实例如图2所示。

Typedef structmenu{
long ID; / /当前菜单ID
void ( * disp laymenu) ( long i, unsigned char j) ; / /当前菜单对应处理函数
char cur; / /当前菜单子项
char total; / /子菜单总数
structmenu * up, * down, * right; / /毗邻子菜单
}MENU;

基于AVR单片机的控制系统设计

图2 一个菜单树的实例

对于用户按键操作切换不同的菜单时,我们只需修改一个指向对应菜单节点的全局菜单节点指针即可。当用户按下“ESC”键时,菜单指针指向当前节点的父节点,按下“Enter”键时,则指针指向对应节点的子节点。

用于的RAM空间较小,只有4KB,我们需设计一种合理而简洁的数据结构,我们将菜单的数据结构定义为(C语言实现)。

基于AVR单片机的控制系统设计

图3 menuselect函数的流程图

将菜单分为显示型菜单和功能性菜单,显示型菜单项用于切换各级菜单,功能型菜单则执行最底层菜单所对应的操作,total变量为0则表示为功能型菜单,大于0则表示选择型菜单。通过菜单的ID,即可以知道当前菜单的显示位置和内容,将此信息放在对应的displaymenu函数中可以节省数据空间,不用对于功能型菜单建立额外的ID与处理函数间的对应关系表,从而实现功能型菜单和显示型菜单的一致性操作。一个供参考的执行函数可以写作:

if(g_pmenu->total>0)
{
g_pmenu=menuselect(g_pmenu,Key);
}
else
{
(g_pmenu->displaymenu)(g_pmenu->ID,g_pmenu->cur);
}

其中menuselect函数用于切换对应的菜单子项,按键为“UP”键和“DOWN”键时,只需修改g_pmune->cur即可;按下“ENTER”键时,则g_pmenu=g_pmenu->down,再根据cur值,g_pmenu=g_pmenu->right;按下“ESC”键,则g_pmenu=g_pmenu->up。

这种设计使得代码数据量变得较小,同时增强了程序的扩展性,需要增加或修改菜单项时,不论是功能型菜单还是执行性菜单,只需要修改对应的菜单结构的数组即可,而不必修改对应的执行代码。经过这样的简化后,发现对于菜单数较多的多通道输入/输出系统,系统RAM区还是不够用。对于一个8输入通道的系统,每个通道的参数设置项可能多达40项,总菜单节点大于300个,每个节点占用14B,则整个菜单节点所占的RAM已超过4K,所以这种方式还是需要进一步改进。

陀螺仪相关文章:陀螺仪原理




评论


相关推荐

技术专区

关闭