基于QT的实验平台模块控制设计.docx

上传人:b****4 文档编号:6014109 上传时间:2023-05-09 格式:DOCX 页数:38 大小:209.58KB
下载 相关 举报
基于QT的实验平台模块控制设计.docx_第1页
第1页 / 共38页
基于QT的实验平台模块控制设计.docx_第2页
第2页 / 共38页
基于QT的实验平台模块控制设计.docx_第3页
第3页 / 共38页
基于QT的实验平台模块控制设计.docx_第4页
第4页 / 共38页
基于QT的实验平台模块控制设计.docx_第5页
第5页 / 共38页
基于QT的实验平台模块控制设计.docx_第6页
第6页 / 共38页
基于QT的实验平台模块控制设计.docx_第7页
第7页 / 共38页
基于QT的实验平台模块控制设计.docx_第8页
第8页 / 共38页
基于QT的实验平台模块控制设计.docx_第9页
第9页 / 共38页
基于QT的实验平台模块控制设计.docx_第10页
第10页 / 共38页
基于QT的实验平台模块控制设计.docx_第11页
第11页 / 共38页
基于QT的实验平台模块控制设计.docx_第12页
第12页 / 共38页
基于QT的实验平台模块控制设计.docx_第13页
第13页 / 共38页
基于QT的实验平台模块控制设计.docx_第14页
第14页 / 共38页
基于QT的实验平台模块控制设计.docx_第15页
第15页 / 共38页
基于QT的实验平台模块控制设计.docx_第16页
第16页 / 共38页
基于QT的实验平台模块控制设计.docx_第17页
第17页 / 共38页
基于QT的实验平台模块控制设计.docx_第18页
第18页 / 共38页
基于QT的实验平台模块控制设计.docx_第19页
第19页 / 共38页
基于QT的实验平台模块控制设计.docx_第20页
第20页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于QT的实验平台模块控制设计.docx

《基于QT的实验平台模块控制设计.docx》由会员分享,可在线阅读,更多相关《基于QT的实验平台模块控制设计.docx(38页珍藏版)》请在冰点文库上搜索。

基于QT的实验平台模块控制设计.docx

基于QT的实验平台模块控制设计

基于QT的实验平台模块控制设计

1、设计任务

以S3C2410处理器为核心,以博创试验箱为依托平台,编写相应的外围硬件驱动等,完成一个基于QT界面的嵌入式系统搭建。

基本要求:

(1)编写LED、电机、串口、CAN总线设备驱动程序;

(2)能完成界面设计和编程;

(3)实现试验箱间的互相通信;

(4)实现试验箱间的设备控制。

2、总框图及总体软件设计说明

(1)程序总框图

程序功能模块图

(2)软件设计说明

设计分为驱动和应用两个模块,分别对应LED、电机、CAN总线、串口通讯。

在软件设计过程中,采用多线程的设计方法,通过分别运行电机线程,uart线程,Can通信线程,实现相关的功能。

使用QTEmbedded做为UI界面设计的工具,在Linux环境下,基于S3C2410开发平台,并通过Minicom作为宿主机与目标机的调试工具,实现软件的开发。

3、局部程序框图及其设计说明

(1)驱动模块

驱动代码主要有出口、入口函数和file_operations结构体等组成。

该结构体有open函数和realse函数进行初始化设备文件和卸载设备文件,还有read、write、ioctl函数等组成。

(2)应用模块

LED控制模块,电机控制模块

LED控制模块先检测按钮信号,后在槽函数中通过对LED灯驱动的调用实现对LED灯的亮灭控制。

电机控制模块中,通过对相关按钮信号的处理来控制电机的运转方向和运转速度。

Uart通信模块

Uart通信模块实现两台S3C2410实验箱之间的通信,采用串口2进行数据的发送和接收,两台实验箱之间可以控制彼此的LED灯。

CAN总线通信模块

CAN总线通信模块,创建了两个canThread类的线程对象,用于接收数据和发送数据,并对其处理实现对彼此LED灯的控制。

4、源程序清单(详细注释)

/*=====================================\

*FILENAME:

led.h

*FUNCITON:

自定义QWidget类,实现对LED,MOTOR,UART,CAN的控制

*=======================================*/

#ifndefLED_H

#defineLED_H

#include

#include

#include

#include

#include

#include

#include

#include"PWMthread.h"//包含PWM线程类的声明

#include"uartThread.h"//包含UART线程类的声明

#include"canThread.h"//包含canThread线程类的声明

/*IOCTLcommands*/

#defineLED_IOC_WR_ON1//LED灯亮

#defineLED_IOC_WR_OFF0//LED灯灭

#defineDCM_IOCTRL_STARTPWM(0x10)//PWM开始工作

#defineDCM_IOCTRL_SETPWM(0x20)//设置PWM

#defineDCM_IOCTRL_STOPPWM(0x30)//停止PWM

#defineDCM_TCNTB(16384)

#defineDCM_FACTOR(DCM_TCNTB/1024)

namespaceUi

{

classLed;

}

classMyLed:

publicQWidget

{

Q_OBJECT

public:

MyLed(QWidget*parent=0);

~MyLed();

protected:

voidchangeEvent(QEvent*e);

private:

Ui:

:

Led*ui;

intfd1;//用于LED设备文件

intfd2;//用于CAN总线设备

PwmThread*pwm;//定义pwm线程对象

uartThread*uart;//定义uart线程对象

canThread*canSend;//定义CAN总线接收线程对象

canThread*canRec;//定义CAN总线发送线程对象

//槽函数

privateslots:

voidchange_tab(intindex);//切换TAB

//LED控制

voidon_led3_off_clicked();//按钮led3_off按下LED3灭

voidon_led3_on_clicked();//按钮led3_on按下LED3亮

voidon_led2_off_clicked();

voidon_led2_on_clicked();

voidon_led1_off_clicked();

voidon_led1_on_clicked();

//DC-MOTOR控制

voidon_dc_off_clicked();//按钮dc_off按下电机停止运转

voidon_dc_right_clicked();//按钮dc_right按下电机顺时针转

voidon_dc_left_clicked();//按钮dc_left按下电机逆时针转

voidon_dc_cycle_clicked();//按钮dc_cycle按下电机先顺时针转后逆时针转

//uart通信控制

voidon_s_led1_on_clicked();//按钮s_led1_on按下发送信号,接收方LED1亮

voidon_s_led2_on_clicked();//按钮s_led2_on按下发送信号,接收方LED2亮

voidon_s_led3_on_clicked();//按钮s_led3_on按下发送信号,接收方LED3亮

voiduart_receive(QString);//串口接收到数据的处理

voidon_all_off_clicked();//按钮all_off按下发送信号,接收方所有LED灭

voidon_text_clear_clicked();//按钮text_clear按下清除显示文本

//CAN总线通信控制

voidon_leds_on_clicked();//按钮leds_on按下发送信号,接收方所有LED灯亮

voidon_leds_off_clicked();//按钮leds_off按下发送信号,接收方所有LED灯灭

voidon_hello_clicked();//按钮hello按下发送"Hello"

voidcan_receive(QString);//接收到数据的处理

voidon_can_clear_clicked();//按钮can_clear按下清除CAN总线通信的显示窗口

};

#endif//LED_H

/*=========================================\

*FILE:

PWMthread.h

*FUNCITION:

定义PWM线程类,实现PWM的控制

\*============================================*/

#ifndefPWMTHREAD_H

#definePWMTHREAD_H

#include

#include

#include

#include

classPwmThread:

publicQThread//继承QThread类

{

public:

PwmThread();//构造函数

~PwmThread();//析构函数

voidrun();//重载run()函数,实现自定义功能

voidThreadStart();//启动线程

voiddelay(intt=0);//延时

intmode;//电机的转动模式控制:

0停止,1正转,2反转,3正反

intdcm_fd;//设备文件

intsetpwm;//定义占空比

intflag;//标志:

0退出线程,1正常

};

#endif//PWMTHREAD_H

/*=========================================\

*FILENAME:

canThread.h

*FUNCITION:

定义CAN总线通信线程类,实现CAN总线通信的控制

\*============================================*/

#ifndefCANTHREAD_H

#defineCANTHREAD_H

#include

#include

#include

#include

#include

#include

#include

#include

#include

#defineUPCAN_IOCTRL_SETBAND0x1//设置波特率

#defineUPCAN_IOCTRL_SETID0x2//设置CAN总线的ID

#defineUPCAN_IOCTRL_SETLPBK0x3//设置CAN总线的工作模式:

1自循环模式,0正常模式

#defineUPCAN_IOCTRL_SETFILTER0x4//设置CAN总线的过滤器

#defineUPCAN_IOCTRL_PRINTRIGISTER0x5//输出SPI和portE的寄存器信息

#defineUPCAN_EXCAN(1<<31)//设置外部CAN标记flag

#defineMAX_CANDATALEN8//定义CAN总线数据的最大长度

#defineCAN_DEV"/dev/can/0"//定义CAN总线设备文件

//定义波特率枚举变量

typedefenum{

BandRate_125kbps=1,

BandRate_250kbps=2,

BandRate_500kbps=3,

BandRate_1Mbps=4

}CanBandRate;

//定义CAN总线数据结构体

typedefstruct{

unsignedintid;//CAN总线ID

unsignedchardata[8];//CAN总线数据

unsignedchardlc;//数据长度

intIsExt;//是否扩展总线

intrxRTR;//是否扩展远程帧

}CanData,*PCanData;

/*********************************************************************\

CAN设备设置接收过滤器结构体

参数:

IdMask,Mask

IdFilter,Filter

是否接收数据按如下规律:

MaskFilterRevIDReceive

0xxyes

100yes

101no

110no

111yes

\*********************************************************************/

typedefstruct{

unsignedintMask;

unsignedintFilter;

intIsExt;//是否扩展ID

}CanFilter,*PCanFilter;

//canThread类的定义

classcanThread:

publicQThread

{

Q_OBJECT//申明为包含自定义信号槽的类

public:

canThread(intfd=0);//构造函数

voidrun();//重载run()函数

voidThreadStart();//启动线程

voidcanRev();//接收数据

voidCanSendString(char*pstr);//发送数据

intflag;//线程标记,1工作,0停止

intcan_fd;//CAN总线设备文件

intrecv_status;//接收0停止,1开始

intsend_status;//发送0停止1开始

intstatus;//0接收,1发送

QStringsendbuf;//待发送的数据

signals:

voidrecv_can(QStringstr);//自定义的接收数据信号

};

#endif//CANTHREAD_H

/*********************************************************************\

FILENAME:

uartThread.h

FUNCTION:

定义uart通信线程类

\*********************************************************************/

#ifndefUARTTHREAD_H

#defineUARTTHREAD_H

#include

#include

classuartThread:

publicQThread

{

Q_OBJECT

public:

uartThread();//构造函数

~uartThread();//析构函数

voidrun();//重载run()函数

voidThreadStart();//启动线程

intflag;//线程标记:

0停止,1运行

intuart_fd;//uart设备文件

intrecv_status;//uart接收标记

intsend_status;//uart发送标记

QStringsendbuf;//uart发送的数据

signals:

voidrecv_uart(QStringstr);//接收到数据发出信号

publicslots:

};

#endif//UARTTHREAD_H

/*********************************************************************\

FILENAME:

PWMThread.cpp

FUNCTION:

PWM线程类的实现

\*********************************************************************/

#include"PWMthread.h"//PWM线程类的定义

#defineDCM_IOCTRL_STARTPWM(0x10)

#defineDCM_IOCTRL_SETPWM(0x20)

#defineDCM_IOCTRL_STOPPWM(0x30)

#defineDCM_TCNTB(16384)

#defineDCM_FACTOR(DCM_TCNTB/1024)

//构造函数

PwmThread:

:

PwmThread()

{

this->flag=1;//线程工作标记为1

this->mode=0;//电机动作模式为0,即停止

this->setpwm=0;//占空比为0

}

//析构函数

PwmThread:

:

~PwmThread()

{

:

:

close(dcm_fd);//关闭设备文件

}

//重载线程类的run()函数,实现自定义的功能

voidPwmThread:

:

run()

{

intstatus=1;//用于控制反向

inti;

dcm_fd=open("/dev/dcm/0raw",O_WRONLY);//打开设备文件,写方式

if(dcm_fd<0)//打开设备文件失败

{

qDebug("cannotopendevice/dev/dcm/0raw");

}

while(flag)//如果线程为工作状态

{

if(this->mode==0)//方式0工作,电机停转

{

ioctl(dcm_fd,DCM_IOCTRL_STOPPWM,mode);

}

elseif(mode>=1&&mode<=3)//方式1-3工作

{

ioctl(dcm_fd,DCM_IOCTRL_STARTPWM,mode);

for(i=512;i>=-512;i--)//控制速度从低到高

{

if(status==1)setpwm=i;

elsesetpwm=-i;

ioctl(dcm_fd,DCM_IOCTRL_SETPWM,setpwm*DCM_FACTOR);

delay(500);

}

status=-status;

}

}

}

//启动线程

voidPwmThread:

:

ThreadStart()

{

this->start();

}

//延时函数

voidPwmThread:

:

delay(intt)

{

inti;

for(;t>0;t--)

for(i=0;i<400;i++);

}

/*********************************************************************\

FILENAME:

canThread.cpp

FUNCTION:

canThread线程类的实现

\*********************************************************************/

#include"canThread.h"

//构造函数

canThread:

:

canThread(intfd)

{

flag=1;//工作标志置1

status=0;//接收状态

this->recv_status=0;//接收状态停止

this->send_status=0;//发送状态停止

can_fd=fd;//打开设备文件

}

//重载run()函数

voidcanThread:

:

run()

{

intid=0x123;//CanID

qDebug("CANThreadstart:

");

ioctl(can_fd,UPCAN_IOCTRL_PRINTRIGISTER,1);//输出SPI和portE的寄存器信息

ioctl(can_fd,UPCAN_IOCTRL_SETID,id);//设置CAN总线的ID

#ifdefDEBUG

ioctl(can_fd,UPCAN_IOCTRL_SETLPBK,0);//设置CAN总线的工作模式:

1自循环模式,0正常模式

#endif

/*Createthethreads*/

while(flag)//线程工作

{

if(this->recv_status==1)//如果为接收状态

{

canRev();//接收数据

}

if(this->send_status==1)//如果为发送状态

{

CanSendString(sendbuf.toLatin1().data());//发送数据

this->send_status=0;//发送状态置0,防止重复发送

}

}

close(can_fd);//关闭设备文件

}

//接收数据

voidcanThread:

:

canRev()

{

CanDatadata;

intcount;

QStringstr;

count=read(can_fd,&data,sizeof(CanData));//接收数据到data,并用count接收read()返回的接收到的数据长度

if((data.dlc>0)&&(count>0))//若接收到有效数据

{

str=str.sprintf("%s",data.data);//将unsignedchar*数据转换为QString类数据

emitrecv_can(str);//发出接收信号

}

}

//发送数据

voidcanThread:

:

CanSendString(char*pstr)

{

CanDatadata;

intlen=strlen(pstr);

memset(&data,0,sizeof(CanData));//初始化data

data.id=0x123;//设置dataid

data.dlc=8;//设置数据长度

for(;len>MAX_CANDATALEN;len-=MAX_CANDATALEN)

{

memcpy(data.data,pstr,8);//复制数据到Pstr

write(can_fd,&data,sizeof(data));//写数据到文件

pstr+=8;//写下一字节数据

}

data.dlc=len;//设置数据长度

memcpy(data.data,pstr,len);//写数据文件

write(can_fd,&data,sizeof(CanData));//写数据

}

//启动线程

voidcanThread:

:

ThreadStart()

{

start();

}

/*********************************************************************\

FILENAME:

led.cpp

FUNCTION:

实现程序中LED的控制及PWM线程,can线程,uart线程的控制

\*********************************************************************/

#include"led.h"

#include"ui_final.h"

externintstatus;//防止电机开机运行

MyLed:

:

MyLed(QWidget*parent):

QWidget(parent),ui(newUi:

:

Led)

{

ui->setupUi(this);

fd2=open("/dev/can/0",O_RDWR|O_NONBLOCK);//CAN

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2