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

📄 adt.c

📁 atmega128的多路ADC转换程序,可移植性强,可读性强
💻 C
字号:
#include <macros.h>
#include <iom128v.h>
#include <string.h>
#include <math.h>
#include "ad.h"


/******************  中断向量  ********************/
#pragma	interrupt_handler T0_Interrupt:17
#pragma interrupt_handler ADC_Interrupt:22

#define BIT(x)	(1 << (x))

/*******************  公用变量定义  ********************/
extern struct CommDataStruct     	g_CommData;
extern unsigned char uCMState;
extern unsigned char uStateOfLEDOut;
unsigned char   ADFlag ;               //AD状态标志  
//unsigned char   uIover=171;                 /* 超载电流 1.17Is*/
//unsigned char   uIlock=211;                 /* 锁定电流1.4Is */

unsigned char   g_uTime1ms	=0;	/* 物理定时器1ms计数器 */
unsigned char	uCurrTimes      =0;	/* 某路模拟量采样次数计数 */
unsigned char	uChannelID;		/* 模拟通道号 */
unsigned char	anTempData[SAMPLE_TIMES];       /* 每路模拟量采样SAMPLE_TIMES次 */
signed int      uDT;			/* 排气温度 */
unsigned char        uC2;		        /* 盘管温度 */
unsigned char        uC1;                   /* 盘管温度 */
unsigned char      uCT1;		/* CT电流 */
unsigned char	   uCT1Step;		//CT电流值的STEP
unsigned int       uCT2;                /* 涡旋热保护 */


unsigned char    uIOverFlag;            /* 压缩机超负荷标志 */
unsigned char    uILoadFlag;            /* 压缩机锁定标志 */
unsigned char    uIFirst=146;           /* 第一次检测电流 */
unsigned char    uISecond=146;          /* 第二次检测电流 */
unsigned char    uStateOfLEDOut;

extern unsigned char uCTOutputState;
unsigned char NoFuzzyControl;

void	DisableWatchDog( void )
{
	WDTCR	= BIT(WDCE) | BIT(WDE);		//允许看门狗改变
	WDTCR	= 0x00;				//禁止看门狗
	
	return;
}


void	EnableWatchDog( void )
{
	WDTCR	= BIT(WDCE) | BIT(WDE);	// 允许看门狗改变 
	
	// 使能看门狗,2秒钟复位 
	WDTCR	= BIT(WDE) | BIT(WDP2) | BIT(WDP1) | BIT(WDP0);
	
	return;
}


void	InitT0( void )
{

	TCCR0	= BIT(CS02);	        //普通模式,时钟256分频
	TCNT0	= TIME_1MS;		//装入计数初值

	TIMSK	|= BIT(TOIE0);		//开放计数溢出中断
	
	return;
}

void	InitADC( void )
{
	ADMUX	|= BIT(ADLAR);		//选择外部电压参考,ADC转换结果左对齐,采样通道ADC0
	
	//ADC使能,非差分模式,32分频(提高转换精度)
	ADCSRA	= BIT(ADEN) | BIT(ADPS2) | BIT(ADPS0);

	ADCSRA	|= BIT(ADIE);				//开放AD中断
	
	return;
}

void	T0_Interrupt( void )
{       
	
	TCNT0	= TIME_1MS;         /* 装入计数初值:(1/主频)*1024*(256-计数初值)=1ms */
//	ADFlag=1;			
	g_uTime1ms++;
	if(g_uTime1ms>=33)
	{
	   ADFlag=1;
	   g_uTime1ms=0;
	}
		
	return;
}

void	ADC_Interrupt( void )
{
	unsigned char tmp;
	tmp	= ADCH;		/* 读取A/D转换结果 */
	anTempData[uCurrTimes]	= tmp;
	return;
}

void	DisableT0Interrupt( void )
{
	TIMSK	&= ~BIT(TOIE0);	//关闭T0中断
	
	return;
}

void	EnableT0Interrupt( void )
{
	TIMSK	|= BIT(TOIE0);//打开T0中断
	
	return;	
}

void	StartADConvert( void )
{
	ADCSRA	|= BIT(ADSC);				//启动AD转换
	
	return;
}

void	ChangeADChannel( void )
{

	switch( uChannelID )
	{
		case C1_:	//原来是ADC0,切换到ADC1
			ADMUX	= ADC1;
			ADMUX	|= BIT(ADLAR);	
			uChannelID	= C2_;
			break;
					
		case C2_:	//原来是ADC1,切换到ADC2
			ADMUX	= ADC2;
			ADMUX	|= BIT(ADLAR);	
			uChannelID	= DT_;
			break;
	
		case DT_://原来是ADC2,切换到ADC3
			ADMUX	= ADC3;
			ADMUX	|= BIT(ADLAR);	
			uChannelID	= CT1_;
			break;
                case CT1_://原来是ADC3,切换到ADC4
			ADMUX	= ADC4;
			ADMUX	|= BIT(ADLAR);	
			uChannelID	= CT2_;
			break;
		case CT2_://原来是ADC4,切换到ADC0
			ADMUX	= ADC0;
			ADMUX	|= BIT(ADLAR);	
			uChannelID	= C1_;
			break;    
		default:
			break;
	}
	
	return;
}

void	SampleInSys( void )
{	
	uCurrTimes++;				/* 采样次数加1 */
	/* 若采样次数达到M次,计算该路模拟量对应的实际值并切换模拟通道 */
	if( uCurrTimes >= SAMPLE_TIMES )
	{
		uCurrTimes	= 0;	/* 采样次数清0 */
		CalAnalogData();				/* 计算实际值 */				
		/* 若全部模拟量采样完一圈,发送告警判断消息和刷新显示消息 */	
		ChangeADChannel();	/* 切换模拟量通道 */
	}
	StartADConvert();		/* 启动下一次A/D转换 */

	return;
}

void	InitSample( void )
{	
        uChannelID	= START_CHANNEL;	/* 取起始模拟量通道号 */                           
	return;
}
void	InitRealData( void )
{
	
        //uDT	= 150;    //排气温度
	//uC2	= DEFAULT_TEMP;    //盘管温度
	//uC1	= DEFAULT_TEMP;    //盘管温度
	//uCT1	= DEFAULT_TEMP;    //CT电流
//	uCT2	= DEFAULT_TEMP;    //试验、强制运行(冷暖气)
	return;
}

static void	CalAnalogData( void )
{
	unsigned char	i,j;
	unsigned char	ntmp;
	unsigned int tmp=0;
	float fTh1,fTh2,fTh3,fTh4,fTh5;
	
	/* 去掉第1次采样结果,其余M-1次排序 */
	for( i=1; i<SAMPLE_TIMES; i++ )
	{
		tmp=tmp+anTempData[i];
	}

	/* 取中值,计算实际值 */
	ntmp	=tmp/(SAMPLE_TIMES-1);
	
	switch( uChannelID )
	{
	        case DT_:	                /* 排气温度 */
	          if(ntmp>252)//短路
	          {
	        //  	g_CommData.uError=0x64;
	             //if(uStateOfLEDOut==0)
	             uStateOfLEDOut=5;
	             uDT=0;
	         }
	          else if(ntmp<3)//&&(uCMState==ON))
	          {
	            // g_CommData.uError=0x64;
	             //if(uStateOfLEDOut==0)
	             uStateOfLEDOut=5;
	             uDT=0;
	          }
	          else if((ntmp<=252)&&(ntmp>=3))
	          { 
			   //if(g_CommData.uError==0x64)
		        {
	    	       //		g_CommData.uError=0x00;
			    }
	    	       	if(uStateOfLEDOut==5)
	    	       		uStateOfLEDOut=0;
		         
	            fTh1=A1*ntmp*ntmp*ntmp-B1*ntmp*ntmp+F1*ntmp+H1;
	            uDT=fTh1*2+70.5;
	            if(uDT<150)
	            {
	            	uDT=150;//40
	            	NoFuzzyControl=1;
	            }
	            else if(uDT>350) 
	            {
	            	uDT=350;//140
	            	NoFuzzyControl=0;
	            }
		    else
		    {
		    	NoFuzzyControl=0;
		    }
	          }
		break;
		
		case C2_:			/* 盘管温度2 */	
		  if(ntmp>252||ntmp<3)
	           {
	            // g_CommData.uError=0x67;
	             //if(uStateOfLEDOut==0)
	             uStateOfLEDOut=15;
	             uC2=0;
	           }
	          else
	           {  
			  // if(g_CommData.uError==0x67)
		          {
	    	   //    g_CommData.uError=0x00;
	    	       
		          }
		          if(uStateOfLEDOut==15)
	    	       		uStateOfLEDOut=0;
	             fTh2=A2*ntmp*ntmp*ntmp-B2*ntmp*ntmp+F2*ntmp-H2;
	             uC2=(char)(fTh2*2+70.5);
	             if(uC2>220) uC2=220;//75
	             if(uC2<(20)) uC2=20;//-25
	           }
		break;
			
		case C1_:                        /* 盘管温度1 */
		 if(ntmp>252||ntmp<3)
	           {
	            // g_CommData.uError=0x66;
	             //if(uStateOfLEDOut==0)
	             uStateOfLEDOut=25;
	             uC1=0;
	           }
	          else
	           { 
			  //   if(g_CommData.uError==0x66)
		          {
	    	    //    g_CommData.uError=0x00;
	    	        
		          }
		          if(uStateOfLEDOut==25)
	    	       		uStateOfLEDOut=0;
	             fTh3=A2*ntmp*ntmp*ntmp-B2*ntmp*ntmp+F2*ntmp-H2;
	             uC1=(char)(fTh3*2+70.5);
	             if(uC2>220) uC2=220;//75
	             if(uC2<(20)) uC2=20;//-25
	           }
		break;	
		case CT1_:                       /* CT电流 */
		   uCT1=(ntmp*3+13)/25;
		   uCT1Step=ntmp;
		break;
		case CT2_:                      
		    fTh5=A1*ntmp*ntmp*ntmp-B1*ntmp*ntmp+F1*ntmp+H1;
	            uCT2=fTh5*2+70.5;
		break;    
		
		default:
		break;
	}
	return;
}

void 	main( void )
{
	DisableInterrupt();			/* 关中断 */
	InitADC();				/* 初始化AD转换 */
	InitT0();				/* 初始化定时器 */
	InitSample();				/* 初始化模拟数据采样结构 */
	InitRealData();
	EnableInterrupt();	
	StartADConvert();			/* 开中断 */
       while(1)
        { 
          if(ADFlag==1)
            {
             SampleInSys();
             ADFlag=0;
	    }
        }       
}

⌨️ 快捷键说明

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