CANBUS 甲烷高低浓度传感器.docx
《CANBUS 甲烷高低浓度传感器.docx》由会员分享,可在线阅读,更多相关《CANBUS 甲烷高低浓度传感器.docx(152页珍藏版)》请在冰豆网上搜索。
CANBUS甲烷高低浓度传感器
//***********************************************
//CAN_BUS甲烷高低浓度传感器
//PUMAOFONTARIO
//***********************************************
//************************************************说明***************************************************
//MCU:
PIC18F4580(自带CAN控制器)
//编译器:
HI_TECHPICC18V8.35
//CH4_45802006.4.3
//高级中断:
红外键入
//低级中断:
2秒TIMER_0;CAN接收;
//每2秒经比较后向主机发送CH4值,若6秒未发则必须发一次
//TXB0---向主机送数据,源节点为SID=LOCALAD,目标节点为DID=0X101,数据在TXB0D0:
1=fs_data中,2个字节
//TXB1---横向送数据,源节点为SID=LOCALAD,目标节点为DID,据在TXB1D0:
1中,2个字节
//TXB2---向主机送参数表,源节点为SID=LOCALAD,目标节点为DID=0X101,数据在TXB2D0:
7中,8个字节,字节长度=9
//CH4经与报警、断电门限比较后向控制器发控制信号,放在TXB1中
//每隔4秒钟向控制器(横向)发一次联络信号(数据长度=0),表示CH4传感器通讯正常
//TRKVOLT可测得
//控制目标(也是数据发送目标)可有4个:
DID1、DID2、DID3、DID4
//**********************************************************************************************************
#include"stdlib.h"
#include"math.h"
#include"stdio.h"
#include"pic18.h"
#include"delay.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineushortunsignedshort
#defineulongunsignedlong
#defineCANCONCANCON_0//pic18f4580.h中定义CANCON_0,CANSTAT_0
#defineCANSTATCANSTAT_0
//常数(CAN-->OPERATIONMODE:
)
#defineCONFIG0X80//CANBUS配置模式
#defineLISTEN0X70//CANBUS监听模式
#defineSELF_CHK0X40//CANBUS自检模式
#defineSHUT_OFF0X20//CANBUS关闭模式
#defineNORMAL0X0//CANBUS正常模式
#definebitset(var,bitno)((var)|=1<<(bitno))
#definebitclr(var,bitno)((var)&=~(1<<(bitno)))
#defineled_offRE1//LED电源开关
#defineled_csRE2//LED驱动芯片14489片选端
#defineir_inRB1//红外接收
#defineds1820_inRA4//DS18B20数据线
#defineds1820_in_ioTRISA4//DS18B20数据线I/O方向设置
#defineb25_1RB4//B25输出1(beeper)
#defineb25_2RB5//B25输出2(常闭)
#defineb25_3RB6//B25输出3(常开)
#defineb25_4RB7//B25输出4(保留)
#definex9c102_cs1RD0//X9C102片选1(FOR低浓CH4)
#definex9c102_ud1RD1//X9C102方向选择1(FOR低浓CH4)
#definex9c102_inc1RD2//X9C102脉冲输入1(FOR低浓CH4)
#definex9c102_cs2RD3//X9C102片选2(FOR高浓CH4)
#definex9c102_ud2RD4//X9C102方向选择2(FOR高浓CH4)
#definex9c102_inc2RD5//X9C102脉冲输入2(FOR高浓CH4)
#definepwr_3v_cs1RD6//3v开关电源使能1(FOR低浓CH4)
#definepwr_3v_cs2RD7//3v开关电源使能2(FOR高浓CH4)
#defineHALF0X0//常数(FORdelay_ir())
#defineFULL0X01
#defineFAN_LOCK_VAL3.0//CH4风机闭锁
#defineFAN_LOCK_VAL_DOWN1.51//CH4风机闭锁下限(解锁!
)
#definePROTECT_VAL4.0//CH4探头保护值
#defineZERO_AD_UP20//CH4自动调零AD码值上限=20
#defineZERO_AD_DOWN10//CH4自动调零AD码值下限=10
#defineLtoH_SWT_VAL3.8//ch4l-->ch4h切换点
//#defineWARM_UP_VAL3.5//切换预热点
#defineHtoL_SWT_VAL2.8//ch4h-->ch4l切换点
//******************************数据表定义(ROM)*************************************
//constucharTAB_MMSR[]={0XC3,0XDC,0XC2,0XEB,0XCA,0XE4,0XC8,0XEB};//密码输入
//******************************全局变量定义(RAM)*********************************
structchillon
{ucharcunt;
uintlocal_sid_1st;//本机SID_1:
(0xxxH,12位HEX)
uintch4_low_alm;//ch4报警下限值(16位BCD)
uintch4_high_alm;//ch4报警上限值(16位BCD)
ucharwork_mode;//工作模式(0=CH4,1=CH4/T)
ucharlocal_type;//本机TYPE(01H=CH4,13H=CH4/T)
ucharch4l_zero;//低浓ch4零位值(8位HEX)
uintch4l_k;//低浓ch4k系数(16位HEX)
uintlocal_sid_2nd;//本机SID_2:
(保留:
for基带干线!
)
ucharch4h_zero;//高浓ch4零位值(8位HEX)
uintch4h_k;//高浓ch4k系数(16位HEX)
uintctrl_id1;//控制目标地址1(12位HEX)
uintctrl_id2;//控制目标地址2(12位HEX)
uintctrl_id3;//控制目标地址3(12位HEX)
uintctrl_id4;//控制目标地址4(12位HEX)
uintch4_res_alm;//ch4复电限(16位BCD)
floatcoeff;//修正因数(onlyforch4l!
)
};
unionbrisbane//包含结构体的共用体!
{ucharram_blk[64];
structchillonram_var;
};
unionbrisbaneram_para;//flash参数在ram中的映射
uintmaster_sid=0X0101;//中心站SID
uintrev_sid;//can_bus:
RXB0接收到的SID
uintrev_did;//can_bus:
RXB0接收到的DID
ucharrev_dat[8];//can_bus:
RXB0接收到的数据域
ucharsimul_test_set=0X0;//'模拟断电/报警命令'设置变量
uintch4l_calib_gas;//低浓ch4标定气样值(16位BCD)
uintch4h_calib_gas;//高浓ch4标定气样值(16位BCD)
ucharch4_alarm_flag;//ch4报警标志:
(D0=1:
报警,D1=1:
断电)
ucharkout_flag;//开出控制重复确认标志:
(D0=1:
报警,D1=1:
断电)
ucharkout_cunt;//开出控制重复确认计数变量
ucharch4_state_flag;//ch4状态标志(for横向发送命令)
//ucharprotect_proc=0X0;//探头保护进程标志变量
//ucharprotect_tmr=0X0;//探头保护定时计数变量
//ucharwarm_up_cunt;//ch4切换预热计数
ucharswt_cunt;//ch4切换计时
ucharch4_switch_state;//ch4切换状态变量:
00h=低浓测量,01h=低->高过渡
//02h=高->低过渡,03h=高浓测量
uintupload_ch4l_data;//ch4l:
0~4%-->0~4095
uintupload_ch4h_data;//ch4h:
0~40%-->0~4095
uintupload_ch4;//FORCAN_BUS上传!
(统一量程ch4:
0~40%-->0~4095)
//uintch4_data;//FORCAN_BUS上传!
(ch4:
0~4%-->0~4095)
uintreal_ch4;//ch4实测值!
uintoriginal_ch4;//未经修正因数校正的ch4l值!
(0~40%-->0~4095)
uintvtrk_data;//Vtrk*(R/4R)分压-->ADC(0~5v-->0~1023)
persistentuintmid_fil_cache[5];//中值滤波缓存
uintrank_cache[5];//排序缓存
uintpeak_fil_cache;//峰值滤波缓存
ucharpeak_fil_cunt;//峰值滤波计数变量
uintepm_cfrm_cache[5][2];//EEPROM数据校验缓存
ucharir_data;//红外接收数据
ucharkey_cache[6];
uchar*key_ptr=key_cache;
ucharkey_proc;
uintfun_code;//功能代码=0xxx(2字节)
ucharkey_comb;//组合键标志
ucharkey_tmr_cunt;//键盘超时检测定时计数变量(与定时中断配合!
)
ucharled_byte[4];//LED显示缓存
uchardsp_work_cunt;//LED翻屏显示定时计数变量
uchardsp_work_item;
ucharpara_send_cunt=0X1E;//参数帧上传定时计数变量(定时=30s)
ucharupload_cunt;//CAN_BUS数据上传定时计数变量
ucharfout_cunt;//fout刷新计数变量
//******************************位变量定义**********************************
bitir_ok=0;//1:
红外接收到有效值(红外中断+查询组合)
bitkey_working=0;//1:
键盘操作进程中
bitkey_tmr_on=0;//1:
键盘超时检测定时启动
bitfix_on=0;//1:
检修状态启动
bitch4l_zero_on=0;//1:
低浓ch4自动调零开始
bitch4h_zero_on=0;//1:
高浓ch4自动调零开始
bitch4l_calib_on=0;//1:
低浓ch4自动标定开始
bitch4h_calib_on=0;//1:
高浓ch4自动标定开始
bitsend_ok_0=0;//1:
CAN_BUS/TXB0组发送成功
bitpara_send_ok=0;//1:
CAN_BUS/参数帧发送成功
bitmaster_ack_ok=0;//1:
CAN_BUS/正确收到中心站ACK
bitcan_cmd_rev=0;//1:
CAN_BUS接收到新命令帧(CAN/RXB0接收中断+查询组合)
bitalarm_flash=0;//报警时LED闪烁
//bitpeak_fil_start=0;//1:
峰值滤波开始
//bitir_beeper;//Ir-->Beeper控制标志位
bitsend_flip=0;//横向发送切换标志位
//******************************函数声明************************************
voidport_initial(void);//I/O口初始化函数
voidad_initial(void);//ADC模块初始化
voidwdt_initial(void);//WDT模块初始化
voidtmr0_initial(void);//TMR0模块初始化
voidspi_initial(void);//SPI模块初始化
voidpwm_initial(void);//PWM模块初始化
voidcan_initial(void);//CAN模块初始化
voidpwm_fout(void);//频率输出
voidch4_alarm_chk(void);//报警断电门限检测
voidkout_clr(void);//开关量输出:
清0
voidkout_control(void);//开关量输出控制
//voidprotect(void);//探头保护
voidch4_switch_ctrl(void);//高低浓切换控制
voidget_flash(void);//读取flash_para-->ram_para
voidflash_update(void);//保存ram_para-->flash_para
voidflash_wr_cycle(void);//flash写时序周期
voidflash_erase(ulongflash_add);//flash擦除操作
voidflash_wr(ulongflash_add,uchar*ram_data);//flash写操作
ucharflash_rd(ulongflash_add);//flash读操作
voidled_config(void);//LED驱动芯片14489配置寄存器设定
voidled_dsp(void);//LED驱动芯片14489显示寄存器设定
voiddsp_work(void);//工作画面显示(温度/开入-->切换显示)
voiddsp_ch4(void);//ch4测量值显示
voiddsp_ok(void);//显示:
YYY
voiddsp_nod(void);//显示:
ppp
voiddsp_fail(void);//显示:
FFF
voidir_rev(void);//红外接收
voidkey_manage(void);//键盘逻辑管理
voidkey_sync_execute(void);//键盘命令处理及显示(同步于键盘操作中断)
uintadc_sample(ucharchannel);//ADC采集
uintmid_filter(uintm);//中值滤波
uintpeak_filter(uintn);//峰值滤波
voidch4l_zero_auto(void);//低浓ch4自动调零(900)
voidch4l_calib_auto(void);//低浓ch4自动标定(909)
voidch4h_zero_auto(void);//高浓ch4自动调零(910)
voidch4h_calib_auto(void);//高浓ch4自动标定(919)
voidcan_send(ucharn);//can_bus数据发送
voidsend_to_master_para(void);//向中心站上传参数帧
voidsend_to_master_dat(void);//向中心站上传ch4数据
voidsend_to_controller_dat(void);//向断电控制器发送数据
voidsend_id_set(uintsend_sid,uintsend_did,ucharsend_type,ucharn);
//发送ID寄存器SFR设定
voidcan_send_LOW_ISR(uintsend_sid,uintsend_did,ucharsend_type,ucharn);
//自动标定同时can_bus数据发送(TMR0中断调用!
)
voidcan_opt_mode(ucharm);//CAN:
改变CAN模块operationmode
voidcan_cmd_execute(void);//CAN:
命令帧处理
voidcan_cmd_ack(void);//CAN:
命令帧应答
ucharcompatible_state_code(ucharm);//横向命令发送的第3字节兼容代码转换
voiddelay_ms(uintt);//延时函数(单位:
ms)
voiddelay_us(uchart);//延时函数(单位:
us)
voiddelay_ir_us(uchart);//延时函数(单位:
us,红外接收中断专用)
voiddelay_ir(uchart);//延时函数(单位:
us,红外接收中断专用)
voiddelay_LOW_ISR_ms(uintt);//延时函数(单位:
ms,TMR0中断专用)
//*********************************************************
//主函数
//*********************************************************
voidmain()
{
uintm,n,t;
ulongp;
ulongtmp1,tmp2;
port_initial();//I/O口初始化
kout_clr();//4路开关量输出:
清0
ad_initial();//ADC模块初始化
wdt_initial();//WDT模块初始化
tmr0_initial();//TMR0模块初始化
spi_initial();//SPI模块初始化
pwm_initial();//PWM模块初始化
get_flash();//读取flash预存参数->RAM变量
can_initial();//CAN模块初始化
//是上电复位!
if(((RCON&0X1F)==0X1C)&&(STKFUL==0)&&(STKUNF==0))
{asm("clrwdt");//WDT清0
delay_ms(500);//延时500ms
asm("clrwdt");//WDT清0
delay_ms(500);//延时500ms
asm("clrwdt");//WDT清0
led_byte[0]=0XFF;//显示:
O
led_config();
led_byte[1]=0X80;
led_byte[2]=0X00;
led_byte[3]=0X70;
led_dsp();
asm("clrwdt");//WDT清0
delay_ms(500);//延时500ms
asm("clrwdt");//WDT清0
delay_ms(500);//延时500ms
asm("clrwdt");//WDT清0
led_byte[0]=0XD1;//显示:
ch41,2,3...
led_config();
led_byte[1]=0X0C;
led_byte[2]=0X24;
led_byte[3]=0X00;
t=(uchar)(ram_para.ram_var.local_sid_1st)+60;
for(n=0;n开启3v开关电源
{asm("clrwdt");//WDT清0
//再延时60*500ms-->等待ch4l探头上电稳定
if((n%2)==0)
{led_byte[3]=led_byte[3]+0X10;
led_dsp();
}
//ch4l3v开关电源=开启
if(n>=(uchar)(ram_para.ram_var.local_sid_1st))
{pwr_3v_cs1=1;}
delay_ms(500);
}
for(n=0;n<5;n++)//中值滤波缓存清0!
{mid_fil_cache[n]=0x0;}
}
RCON=RCON|0X1F;