基于QT的实验平台模块控制设计.docx
- 文档编号:11347648
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:38
- 大小:209.58KB
基于QT的实验平台模块控制设计.docx
《基于QT的实验平台模块控制设计.docx》由会员分享,可在线阅读,更多相关《基于QT的实验平台模块控制设计.docx(38页珍藏版)》请在冰豆网上搜索。
基于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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 QT 实验 平台 模块 控制 设计