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

📄 adc.c

📁 空调控制程序
💻 C
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : AUX VRV
COMPILER : AVR GCC/ICC
MODULE   : adc.c
VERSION  : 1.0.0
DATE     : 2006/01/02
AUTHOR   : 朱坤

MODIFICATIONS :

DESCRIPTION :   ADC routines
******************************************************************************/
#include "adc.h"
#include "main.h"

#define ADVALMAX 0x0E0
#define ADVALMIN 0x10

/* 3470B 采样值转换表,温度加 128 偏移 */
const u8 Temp_Tab[]={98, 99, 100,101,102,103,104,105,106,107,108,109, /* 00-0B*/
                     109,110,111,112,112,113,114,114,115,116,116,117, /* 0C-17*/
                     118,118,119,119,120,120,121,122,122,123,123,124, /* 18-23*/
                     124,125,125,126,126,127,127,128,128,129,129,130, /* 24-2F*/
                     130,131,131,132,132,133,133,133,134,134,135,135, /* 30-3B*/
                     136,136,137,137,137,138,138,139,139,139,140,140, /* 3C-47*/
                     141,141,142,142,142,143,143,144,144,144,145,145, /* 48-53*/
                     146,146,146,147,147,148,148,149,149,149,150,150, /* 54-5F*/
                     151,151,151,152,152,153,153,153,154,154,155,155, /* 60-6B*/
                     155,156,156,157,157,157,158,158,159,159,160,160, /* 6C-77*/
                     160,161,161,162,162,162,163,163,164,164,165,165, /* 78-83*/
                     166,166,166,167,167,168,168,169,169,170,170,171, /* 84-8F*/
                     171,171,172,172,173,173,174,174,175,175,176,176, /* 90-9B*/
                     177,178,178,179,179,180,180,181,181,182,183,183, /* 9C-A7*/
                     184,184,185,186,186,187,187,188,189,189,190,191, /* A8-B3*/
                     192,192,193,194,194,195,196,197,198,198,199,200, /* B4-BF*/
                     201,202,203,204,205,206,207,208,209,210,211,212, /* C0-CB*/
                     213,214,216,217,218};/*,219,221,222,223,225,226,227,228};*/

const u8 BitMask[]= {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

u8 AdCntr;                  /* A/D 采样计数 */
u8 AdChCnt;                 /* A/D 通道计数 */
u8 AdvTemp[ADSMPMAX];       /* 采样值缓存   */
u8 AdFailCnt[ADCHMAX];      /* A/D 监测计时 5S on 20mS */

TempUnion TempVal;
u8 DefstCnt;                /* 化霜期间及化霜后3分钟内不检测温度传感器故障 */

/*-----------------------------------------------------------------------------
ROUTINE Name : ADC_Init

Description:
  初始化
Input/Output:

Comments:
  可以不要
-----------------------------------------------------------------------------*/
void ADC_Init(void)
{
  //AdCntr = AdChCnt=0;
  //AdFailCnt[0] = 0;
  //AdFailCnt[1] = 0;
  //AdFailCnt[2] = 0;
  //AdFailCnt[3] = 0;
  AmbientTp = 0x96;
  TubeInTp  = 0x80;
  TubeMidTp = 0x80;
  TubeOutTp = 0x80;
}
/*-----------------------------------------------------------------------------
ROUTINE Name : ADC_Get
Description:
Input/Output:
Comments:
  每20mS 调用一次
-----------------------------------------------------------------------------*/
void ADC_Get(void)
{

  u8 i;
  u8 j;

  ADCSRA = 0x86;                 /* 8Mhz/64 sampling, ADC on */
  i = 50;
  while(i--);

  ADCH;
  /* ADMUX:REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 */
  ADMUX  = (u8)((0x60)|AdChCnt); /* 选择通道 */
  j = 50;
  while(j--);

  ADCH;
  SetBit(ADCSRA,ADSC);
  while (!ValBit(ADCSRA,ADSC));  /* wait till end of conversion */
  AdvTemp[AdCntr] = j = (u8)ADCH;

  //ClrBit(ADCSRA,ADEN);         /* shutdown ADC peripheral */

  if (AdCntr++ > 0){ /* 如果两次采样值差值超过20,则重行启动采样 */
    i = (u8)(AdvTemp[AdCntr - 2]);
    if ((u8)((i >= j) ? (i - j) : (j - i)) > 20) {
      AdCntr = 0;
    } else {
      i = (u8)(AdCntr - 1);
      while ((i > 0) && (j < AdvTemp[i - 1])){    /* 按升序排列 */
         AdvTemp[i] = AdvTemp[i - 1];
         i--;
         AdvTemp[i] = j;
      }

      /* 采样五次 */
      if (AdCntr >= ADSMPMAX){               /* 同一个通道下一次采样 */
        if ((AdvTemp[2] < 0x04) || ( AdvTemp[2] >= 0x0E9)){
          /* 化霜期间及化霜后3分钟内不检测温度传感器故障 */
          if (DefstCnt == 0){
            if (AdFailCnt[AdChCnt]++ >= 10){
              Errorflg |= (u8)BitMask[AdChCnt];
            }
          } else{
            AdFailCnt[AdChCnt] = 0;
          }
        } else {
          AdFailCnt[AdChCnt] = 0;
          Errorflg &= (u8)(~BitMask[AdChCnt]);
          TempVal.TArray[AdChCnt] = Temp_Tab[((AdvTemp[2] <= ADVALMIN)? 0 :
               ((AdvTemp[2] >= ADVALMAX)? ADVALMAX - ADVALMIN : (AdvTemp[2] - ADVALMIN)))];
        }
        AdCntr = 0;
        if (++AdChCnt >= ADCHMAX){
          AdChCnt = 0;           /* 下一个通道 */
        }
      }
    }
  }
}

/*** (c) 2005  佛山菱电 **************************** END OF FILE *************/

⌨️ 快捷键说明

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