基于CAN总线的分布式测控系统.docx
《基于CAN总线的分布式测控系统.docx》由会员分享,可在线阅读,更多相关《基于CAN总线的分布式测控系统.docx(22页珍藏版)》请在冰点文库上搜索。
![基于CAN总线的分布式测控系统.docx](https://file1.bingdoc.com/fileroot1/2023-7/27/1dee2c13-bf34-49d1-ba06-2c21e6100a35/1dee2c13-bf34-49d1-ba06-2c21e6100a351.gif)
基于CAN总线的分布式测控系统
专业:
测控技术与仪器
班级:
姓名:
学号:
指导老师:
基于CAN总线的分布式测控系统
一、实验目的:
1.了解分布式测控的原理;
2.初步掌握用C语言开发较复杂的工程;
3.初步掌握项目了解、调试方法;
4.挫折训练
二、基本原理:
利用CAN总线串联4套实验设备,组成一分布式测控系统,其中一台一主机,另外三台为从机。
从机将检测到的温度、湿度等现场数据反馈回主机。
主机根据反馈数据,给定从机的直流电机的运行速度,从机根据此给定,控制电机运行。
要求主机能通过虚拟串口界面获取从机的现场数据,并能通过键盘控制从机的电机运行。
三、需用器件与单元:
达盛电子创新平台、CAN总线通信模块温、湿度传感器模块直流电机调压调速模块
四、实验内容:
1.根据文档“CAN模块调试说明”调试硬件;
2.对照SJA1000_cn.PDF读懂汇编工程文件CANSF.UV2;
3.将该汇编文件转换成C语言,注意封装成可以调用收发函数;
4.在从节点编写测温测湿函数;
5.熟悉虚拟串口的使用,可参照文件夹“Func_Ptr虚拟串口例程”;
6.关于键盘的使用,可参考KEIL1软件安装目录下的例程TRAFFIC。
五、硬件原理图:
6、程序流程图
(1)主节点软件流程
(2)直流电机节点流程图
(3)温度节点流程图
7、程序源码(子程序为放上)
1、主节点函数
/***********头文件定义*********************/
#include
#include
#include
#include
/***********宏定义**************************/
#defineucharunsignedchar
#defineuintunsignedint
#definecommand_T't'//获取温度数据命令
#defineget_tmp_succ'v'//获取温度数据成功
#definespeed_regulation's'//速度调节命令
#definespeed_regu_succ'k'//速度调节成功
#defineget_speed'g'//获取电机转速
#definelevel_1'a'//速度等级1
#definelevel_2'b'//速度等级2
#definelevel_3'c'//速度等级3
#definelevel_4'd'//速度等级4
#definelevel_5'e'//速度等级5
#definelevel_6'f'//速度等级6电机停转
/***********函数声明****************************/
voidcan_init(ucharID);
voidcan_send(uchar*send_table,ucharID);
ucharbus_check();
ucharcan_receive(uchar*receive_can);
voiderror_show();
//voiddelay(uintz);
/****************变量定义********************/
bitflag;
uchardata_table[8],T;
tmp_datatbl[60];
uchartemp_t,temp_m;
uinttime;
uintdatatbl_i;
ucharget_cmd;
ucharmotor_speed_lev;
uintmotor_speed;
/************主函数*******************************/
voidmain(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
can_init(0xaa);
Printf51_Init();
printf("TheCANmodelisinitializedsucessfully!
!
!
\n");
printf("inputcommand:
");
TR0=1;
while
(1)
{
if(time==10)
{
time=0;
data_table[2]=command_T;
can_send(data_table,0xcc);
temp_t=SR;
temp_t=(temp_t&0x01);
while(temp_t!
=0x01)
{
printf("don'trecivethedatafromthetemperaturenode.\n");
temp_t=SR;
temp_t=(temp_t&0x01);
}
if(temp_t==0x01)
{
bus_check();
error_show();
can_receive(data_table);
if(data_table[1]!
=command_T)
{
printf("\n");
printf("waitingforthedatas.....\n");
flag=0;
while(!
flag)
{
tmp_datatbl[datatbl_i++]=data_table[2];
if(datatbl_i==60)
{
datatbl_i=0;
}
printf("nowthetemperatureis:
%02bd\n",T);
flag=1;
}
data_table[2]=get_tmp_succ;
can_send(data_table,0xcc);
}
}
}
get_cmd=_getkey();
if(get_cmd==speed_regulation)/*速度调节*/
{
printf("Inputthespeedyouwanttoregulate:
");
flag=0;
get_cmd=0;
while(flag==0)
{
get_cmd=_getkey();
switch(get_cmd)
{
caselevel_1:
printf("Thelevelofmotorspeedisa.\n");
get_cmd=0;
motor_speed_lev=0;
data_table[0]=motor_speed_lev;/*第0单元存储速度等级*/
data_table[1]=speed_regulation;
/*第1单元存储调节命令*/
can_send(data_table,0xbb);
/*发送调节值到电机节点*/
temp_m=SR;
temp_m=(temp_m&0x01);
while(temp_m!
=0x01)
{
temp_m=SR;
temp_m=temp_m&0x01
printf("don'trecivethedatafromthetemperaturenode.\n");
}
if(temp_m==0x01)
{
bus_check();
error_show();
can_receive(data_table);
if(data_table[1]==speed_regu_succ)
/*电机节点接收主节点信息成功*/
{
flag=1;/*速度调节结束*/
}
}
printf("Inputthecommand:
\n");
break;
caselevel_2:
printf("Thelevelofmotorspeedisb.\n");
get_cmd=0;
motor_speed_lev=1;
data_table[0]=motor_speed_lev;
data_table[1]=speed_regulation;
can_send(data_table,0xbb);
/*发送调节值到电机节点*/
temp_m=SR;
temp_m=(temp_m&0x01);
while(temp_m!
=0x01)
{
temp_m=SR;
temp_m=temp_m&0x01;
printf("don'trecivethedatafromthetemperaturenode.\n");
}
if(temp_m==0x01)
{
bus_check();
error_show();
can_receive(data_table);
if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/
{
flag=1;/*速度调节结束*/
}
}
printf("Inputthecommand:
\n");
break;
caselevel_3:
printf("Thelevelofmotorspeedisc.\n");
get_cmd=0;
motor_speed_lev=2;
data_table[0]=motor_speed_lev;
data_table[1]=speed_regulation;
can_send(data_table,0xbb);
/*发送调节值到电机节点*/
temp_m=SR;
temp_m=(temp_m&0x01);
while(temp_m!
=0x01)
{
temp_m=SR;
temp_m=temp_m&0x01;
printf("don'trecivethedatafromthetemperaturenode.\n");
}
if(temp_m==0x01)
{
bus_check();
error_show();
can_receive(data_table);
if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/
{
flag=1;/*速度调节结束*/
}
}
printf("Inputthecommand:
\n");
break;
caselevel_4:
printf("Thelevelofmotorspeedisd.\n");
get_cmd=0;
motor_speed_lev=3;
data_table[0]=motor_speed_lev;
data_table[1]=speed_regulation;
can_send(data_table,0xbb);
/*发送调节值到电机节点*/
temp_m=SR;
temp_m=(temp_m&0x01);
while(temp_m!
=0x01)
{
temp_m=SR;
temp_m=temp_m&0x01;
printf("don'trecivethedatafromthetemperaturenode.\n");
}
if(temp_m==0x01)
{
bus_check();
error_show();
can_receive(data_table);
if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/
{
flag=1;/*速度调节结束*/
}
}
printf("Inputthecommand:
\n");
break;
caselevel_5:
printf("Thelevelofmotorspeedise.\n");
get_cmd=0;
motor_speed_lev=4;
data_table[0]=motor_speed_lev;
data_table[1]=speed_regulation;
can_send(data_table,0xbb);
/*发送调节值到电机节点*/
temp_m=SR;
temp_m=(temp_m&0x01);
while(temp_m!
=0x01)
{
temp_m=SR;
temp_m=temp_m&0x01;
printf("don'trecivethedatafromthetemperaturenode.\n");
}
if(temp_m==0x01)
{
bus_check();
error_show();
can_receive(data_table);
if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/
{
flag=1;/*速度调节结束*/
}
}
printf("Inputthecommand:
\n");
break;
caselevel_6:
printf("Thelevelofmotorspeedisf.\n");
get_cmd=0;
motor_speed_lev=5;
data_table[0]=motor_speed_lev;
data_table[1]=speed_regulation;
can_send(data_table,0xbb);
/*发送调节值到电机节点*/
temp_m=SR;
temp_m=(temp_m&0x01);
while(temp_m!
=0x01)
{
temp_m=SR;
temp_m=temp_m&0x01;
printf("don'trecivethedatafromthetemperaturenode.\n");
}
if(temp_m==0x01)
{
bus_check();
error_show();
can_receive(data_table);
if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/
{
flag=1;/*速度调节结束*/
}
}
printf("Inputthecommand:
\n");
break;
}
}
}
if(get_cmd==get_speed)/*获取速度值*/
{
get_cmd=0;
data_table[1]=get_speed;
can_send(data_table,0xbb);
temp_m=SR;
temp_m=(temp_m&0x01);
while(temp_m!
=0x01)
{
temp_m=SR;
temp_m=temp_m&0x01;
printf("don'trecivethedatafromthetemperaturenode.\n");
}
if(temp_m==0x01)
{
bus_check();
error_show();
can_receive(data_table);
motor_speed=(uint)data_table[0];
/*电机节点将速度存储到数组第0单元*/
printf("Nowthemotorspeedis:
%04bd",motor_speed);
}
}
}
}
voidtimer0(void)interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}
2、直流电机节点
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definespeed_regulation's'//速度调节命令
#definespeed_regu_succ'k'//速度调节成功
#defineget_speed'g'//获取电机转速
voidcan_init(ucharID);
voidcan_send(uchar*send_table,ucharID);
ucharbus_check();
ucharcan_receive(uchar*receive_can);
voiderror_show();
//voiddelay_ms(uintz);
voidmotor_regu(ucharnum);
uintmotorspeed(void);
bitflag;
ucharget_cmd;
uchardata_table[8];
ucharread_data_table;
voidmain()
{
ucharread_SR;
Printf51_Init();
can_init(0xbb);
printf("Allisinitializedsuccessfully!
!
!
\n");
while
(1)
{
get_cmd=0;
read_SR=SR;
read_SR=(read_SR&0x01);
while(read_SR!
=0x01)
{
printf("Therearenodatasinthebuffer!
\n");
read_SR=SR;
read_SR=(read_SR&0x01);
}
if(read_SR==0x01)
{
bus_check();
//主节点发送信号,进入步进电机节点总线检测以确定是否能接收信号
error_show();//总线错误显示
can_receive(data_table);//开始接收主节点信号
get_cmd=data_table[1];
//先读取命令,判断是调节速度还是获取速度
if(get_cmd==speed_regulation)
{
get_cmd=0;
read_data_table=data_table[0];
motor_regu(read_data_table);
data_table[1]=speed_regu_succ;
can_send(data_table,0xaa);
}
if(get_cmd==get_speed)
{
get_cmd=0;
data_table[0]=motorspeed();
can_send(data_table,0xaa);
}
}
}
}
3、温度节点
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definecommand_T't'//收到从主节点发送的命令
#defineget_tmp_succ'v'//主节点告知获取温度数据成功
voidcan_init(ucharID);
voidcan_send(uchar*send_table,ucharID);
ucharbus_check();
ucharcan_receive(uchar*receive_can);
voiderror_show();
uchartemperature();
voidPrintf51_Init();
voiddelay(uintz);
bitflag;
uchardata_table[8];
voidmain()
{
ucharread_SR;
Printf51_Init();
can_init(0xcc);//温度节点ID
while
(1)
{
//number=0;
read_SR=SR;
read_SR=(read_SR&0x01);
while(read_SR!
=0x01)
{
printf("Therearenodatasinthebuffer!
\n");
//delay(2000);
read_SR=SR;
read_SR=(read_SR&0x01);
}
if(read_SR==0x01)
{
bus_check();//检测温度节点总线是否正常
error_show();//总线错误显示
can_receive(data_table);//接收主节点发送的信号
//number=data_table[1];//读取接收到的信号
if(data_table[2]==command_T)//如果读取的信号确实是由主节点发送的,进入下一步处理
{
printf("sendthetemperaturevalue......\n");
fla