📄 adt.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 + -