⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 pic单片机工程
💻 C
字号:
/*
** Copyright (C)1999 KVASER AB, http://www.kvaser.com
** This code may be freely distrubuted and used if the source is indicated.
**
       modi                date
增加协议处理            06-10-24
过欠压处理              06-10-24
*/
#ifdef __WIN32__
#include <vcl.h>
#pragma hdrstop

#include <canlib.h>
#include "mainUnit.h"
#include "mcThread.h"
#include "inc\canUnit.h"
#include "util_w32.h"
#include "inc\ad.h"
#else
#include <string.h>
#include "inc\util_mc.h"
#include "inc\spi_mcp.h"
#include "inc\eeprom.h"
#include "inc\ad.h"
#include <pic.h>
#include <stdio.h>
#endif

#include "inc\main.h"
#include "inc\ck.h"
#include "inc\ad.h"


bank1 unsigned char gVoltFilCnt;  //电压滤波计数器,用以抑制脉冲电压
bank1 unsigned char gOffLineCnt;  //离线计数器,与中心断开的时间

bank1 unsigned char mcptBUF[9];
bank1 unsigned char mcprBUF[9];
////////////////////////////////////
bank1 uchar can_msg[8];
bank1 unsigned int k;
////////////////////////////////
bank1 char gVFilCnt;    //电压滤波器均值计数
bank1 unsigned int gVoltsum;//电压10次总和
bank1 float gACaverage;  //电压均值 
bank1 unsigned int gVolt;//临时电压变量
bank1 unsigned char gVoltSta;//工作状态

void paraProtocol(unsigned char *buf,unsigned char len)
{
    //unsigned char command;
    int  i,j;
    //command = buf[0];
    //if((command>>4)==0x04)
    if((buf[0]>>4)==0x04)	
    {
        switch((buf[0]&0x0f))
        {
            case 1:    //设置过欠压值
            {
            	  i = buf[1];
            	  i <<=8;
            	  i |= buf[2];
            	  j = buf[3];
            	  j <<=8;
            	  j |=buf[4];
            	  if((i>220) && (j<220))
            	      set_voltrange(i,j);
            }
            break;
            case 2:    //主控取过欠压值命令
            {
            	  mcptBUF[0]= C_VOLTRANGE;
            	  mcptBUF[1]= gMax_Volt>>8;
            	  mcptBUF[2]= gMax_Volt;
            	  mcptBUF[3]= gMin_Volt>>8;
            	  mcptBUF[4]= gMin_Volt;
            	  canWrite(MainAddr, mcptBUF, 5, 0);
                  printf("%x %x\n",gMax_Volt,gMin_Volt);
            }
            break;
            //case 3:  //响应主控的取过欠压命令
            case 4:    //设置温度临界值
            {
            	  if(buf[1]>min_deftemp)  //温度下限为20度
            	      set_maxtemp(buf[1]);
            }
            break;
            case 5:    //取温度临界值
            {
            	  mcptBUF[0]= C_MAXTEMP;
            	  mcptBUF[1]= gMax_Temp;
            	  canWrite(MainAddr, mcptBUF, 2, 0);
            }
            break;
            //case 6:  //响应主控的取温度临界值信息
            case 7:    //取当前电压值 
            {
            	  
            	  mcptBUF[0]= C_CURVOLT;
            	  mcptBUF[1]= gCurVolt>>8;
            	  mcptBUF[2]= (unsigned char)gCurVolt;
            	  canWrite(MainAddr, mcptBUF, 3, 0);
            }
            break;
            //case 8:  //响应主控的取当前电压值信息
            case 9:    //取当前的温度值
            {
            	  mcptBUF[0]= C_CURTEMP;
            	  mcptBUF[1]= gCurTemp;
            	  canWrite(MainAddr, mcptBUF, 2, 0);
            }
            break;
            //case 0x0A: //响应取当前温度值信息   
            case 0x0B:   //连接帧
            {
            	  gOffLineCnt = 0;
            	  if(gVoltSta==0)//处于正常状态
            	  {
            	  	  ynSWITCH=NORMAL; //切换到正常状态
            	  }
            	  else if(gVoltSta==1)//处于过欠压状态
            	  {
            	  	
            	  }
            	      
            }
            break;
            case 0x0C:   //正常黄闪设置命令
            {
                  if(buf[1]==1)
                  {
                      gOffLineCnt = 0;
            	        ynSWITCH=NORMAL; //切换到正常状态
                  }
                  else
                  {
                      gOffLineCnt = 0;
            	        ynSWITCH=YFLASH; //切换到正常黄闪状态
                  }
            }
            break;
        }
    }
    buf[0] = 0;
}

/*
 * Check if a message is received; if so, act on it.
 */
void checkMsg(void) 
{
    int id;
    unsigned char dlc;
    
    unsigned int flags;
    canStatus stat;

    stat = canRead(&id, mcprBUF, &dlc, &flags);
    if (stat == canOK)
    {
          printf("\nMessage rcvd: id=%x, dlc=%x, {%x,%x,%x,%x,%x,%x,%x,%x...}\r\n", (int)id, dlc, mcprBUF[0], mcprBUF[1], mcprBUF[2],mcprBUF[3],mcprBUF[4], mcprBUF[5], mcprBUF[6],mcprBUF[7]);
    }
	//else
	//    printf("Nothing received by chekMsg\r\n");

    paraProtocol(mcprBUF,dlc);
    
}

/*
The Main program
*/
void main(void)
{
    gOffLineCnt = 0;  //离线计数超时
    gVoltFilCnt = 0;
    gVFilCnt = 0;
    gVoltsum = 0;
    
    gCurVolt = 220;
    
    gVoltSta = 0; //工作状态为正常
    setupModule();
    printf("setupModule over\n");
    //setLEDs(0);
    canSetup();
    //ckInit();
    adinitial();
    para_init();
    
    //mcp_read_all();

//TRISC = 0;

printf("power module start!!!!\n");
//////////////////////////////////////////////////////////
        /***********************************************************************
        通信处理模块,包括协议解析,处理
        ************************************************************************/
       //canWrite(ulong id, const uchar *msg, unsigned char dlc, unsigned int flag)// 
//**********************************************
/*for(k=4;k<8;k++)
can_msg[k]=0;
can_msg[0]=0x53;
can_msg[1]=0x54;
can_msg[2]=0x02;
can_msg[3]=0x03;
 for(;;) 
		{     
				printf("\n");
 if(canWrite(0x02, can_msg,8,0)==canOK)
{
	printf("can write OK\n");
	DelayF(1000);
      checkMsg();  //Check for received CAN message
    	printf("  ...  ");
		}
		else
	printf("can write Error\n");
   	}
//**********************************************
///////////////////////////////////////////////////////////*/
    for (;;) 
    {
        /***********************************************************************
        /*  离线检测模块
        ************************************************************************/
        if(gOffLineCnt>=MAX_OFFLINE)
        {
            ynSWITCH=YFLASH;//如果与主控通信超时,切换到黄闪状态
        }
        
        
        /***********************************************************************
        电压检测模块
        (Vac*12/220-M)*N*1.54/11.97 = Vdc   
        M = 整流压降 N = 滤波参数 
        1.54/11.97 = 电阻分压
        ************************************************************************/
        DelayF(10);
        AdcRead(0,&gVolt);
        gVFilCnt++;
        gVoltsum+=gVolt;
        if(gVFilCnt==10)
        {
            gACaverage=(float)gVoltsum*5/10240;//average浮点型,sum为unsigned int型
				    gCurVolt=(int)(float)(96.5517*gACaverage)+(float)(13.5173);
				    gVFilCnt = 0;
            gVoltsum = 0;	
				    //printf("volt is %x\n",gCurVolt);
        }
		    if(checkVolt()==0)//正常
		    {
		    	  gVoltSta = 0; //电压正常
		    	  if(gOffLineCnt<MAX_OFFLINE)//通信正常的情况
		    	  {
				    	  //printf("volt is ok\n");
				    	  ynSWITCH = NORMAL;
		    	  }
		    	  gVoltFilCnt = 0;
		    }
		    else
		    {
		    	  //printf("volt is err\n");
		    		gVoltFilCnt++;
		    		if(gVoltFilCnt>10)  //过滤脉冲电压,如果连续10次都高,则认为电压超出范围
				    {
				    	  gVoltFilCnt = 0;
				    	  gVoltSta = 1;//电压不正常标志
				    	  if(gOffLineCnt<MAX_OFFLINE)//通信不断掉的情况
				    	  {
						    	  //上报中心,表示电压故障,并进入黄闪状态
						    	  if(ynSWITCH == NORMAL)
						    	  {
								    	  ynSWITCH=YFLASH;
								    	  mcptBUF[0]= C_VOLTERR;
				            	  mcptBUF[1]= gCurVolt>>8;
				            	  mcptBUF[2]= (unsigned char)gCurVolt;
				            	  canWrite(MainAddr, mcptBUF, 3, 0);
		            	  }
            	  }
				    }


		    }
		    /***********************************************************************
            通信模块
            ************************************************************************/
	      checkMsg();  //Check for received CAN message
	    
    }
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -