?? ai.c
字號:
//****************************************************************************
//Copyright (c) 2007-2008 ABX CO,.LTD
//----------All rights reserved----------
//文件名稱: ai.c
//模塊功能: AI模塊
//創建日期: 2007.05.10
//創 建 人: 羅德良
//參考文檔: LPC2104開發板
//說 明:
//修改歷史:
//2007.12.16 修改用于RTU210硬件
//****************************************************************************
#define IN_AI
#include "config.h"
#define _CS1 P0_12 //TLC2543片選
#define _SCLK1 P0_24 //TLC2543時鐘
#define _DOUT1 P0_11 //TLC2543數據輸出
#define _DIN1 P0_10 //TLC2543數據輸入
#define CS1_H IOSET |= _CS1
#define CS1_L IOCLR |= _CS1
#define SCLK1_H IOSET |= _SCLK1
#define SCLK1_L IOCLR |= _SCLK1
#define DIN1_H IOSET |= _DIN1
#define DIN1_L IOCLR |= _DIN1
#define RESULT1 (IOPIN & _DOUT1)
volatile UINT16 ui16AiOrg[8]; //AI原始寄存器
volatile float fAiDisp[9]; //AI顯示值
//****************************************************************************
//函數名稱: TLC2543_Init
//函數功能: TLC2543初始化
//輸入參數: void
//輸出參數: void
//返 回 值: void
//創建日期: 2007.05.10
//創 建 人: 羅德良
//參考文檔: LPC2104開發板
//說 明:
//修改歷史:
//****************************************************************************
void TLC2543_Init(void)
{
PINSEL1 = (PINSEL1 & P0_24_MARK) | P0_24_0;
PINSEL0 = (PINSEL0 & P0_10_MARK) | P0_10_0;
PINSEL0 = (PINSEL0 & P0_11_MARK) | P0_11_0;
PINSEL0 = (PINSEL0 & P0_12_MARK) | P0_12_0;
IODIR |= _CS1 + _SCLK1 + _DIN1;
IODIR &= ~_DOUT1;
}
//****************************************************************************
//函數名稱: Delay
//函數功能: 延時
//輸入參數: UINT16 ui16Delay 延時數
//輸出參數: void
//返 回 值: void
//創建日期: 2007.05.10
//創 建 人: 羅德良
//參考文檔: LPC2104開發板
//說 明:
//修改歷史:
//****************************************************************************
static void Delay(UINT16 ui16Delay)
{
while (ui16Delay-- != 0);
}
//****************************************************************************
//函數名稱: TLC2543_Read1
//函數功能: TLC2543讀取轉換結果程序
//輸入參數: UCHAR ucChanNo 將要轉換的通道號
//輸出參數: void
//返 回 值: UINT16 上次轉換的結果
//創建日期: 2007.05.10
//創 建 人: 羅德良
//參考文檔: LPC2104開發板
//說 明:
//修改歷史:
//****************************************************************************
static UINT16 TLC2543_Read1(UCHAR ucChanNo)
{
UCHAR i;
UINT16 ui16Result;
SCLK1_L; //SCLK = 0;
CS1_L; //CS = 0;
ui16Result = 0x00;
ucChanNo <<= 4;
Delay(120);
for (i = 0; i < 12; i++) //12 clock模式
{
ui16Result <<= 1;
if (RESULT1 == _DOUT1)
ui16Result |= 0x01;
if ((ucChanNo & 0x80) == 0x80)
DIN1_H;
else
DIN1_L;
Delay(120);
SCLK1_H; //SCLK = 1;
ucChanNo <<= 1;
Delay(120);
SCLK1_L; //SCLK = 0;
}
Delay(120);
CS1_H; //CS = 1;
Delay(300);
return (ui16Result);
}
#define FILTER 128//148 //濾波系數(0 - 255),越小越平穩
//****************************************************************************
//函數名稱: Ai_Scan
//函數功能: AI任務
//輸入參數: UCHAR ucChan
//輸出參數: void
//返 回 值: UCHAR 0, 正確; 1, 錯誤
//創建日期: 2007.09.05
//創 建 人: 羅德良
//參考文檔:
//說 明:
//修改歷史:
//****************************************************************************
UCHAR Ai_Scan(UCHAR ucChan)
{
UINT16 ui16Temp, ui16Full, ui16Val;
float fEGUL, fEGUH;
if (ucChan >= 8) return (1); //通道超出范圍
TLC2543_Read1(ucChan);
ui16Temp = TLC2543_Read1(ucChan);
//一階低通濾波(新采樣值 * 濾波系數 / 256 + 上次濾波結果 * (256 - 濾波系數) / 256)
if (ui16Temp < ui16AiOrg[ucChan])
{
ui16Val = ui16AiOrg[ucChan] - (UINT32)(ui16AiOrg[ucChan] - ui16Temp) * FILTER / 256;
}
else
{
ui16Val = ui16AiOrg[ucChan] + (UINT32)(ui16Temp - ui16AiOrg[ucChan]) * FILTER / 256;
}
ui16AiOrg[ucChan] = ui16Val;
//線性化處理
if (tagConfig.ucSignType[ucChan] == 0)
{//電流輸入信號
ui16Temp = (ui16AiOrg[ucChan] < tagConfig.ui16AIZero[ucChan])
? 0
: ui16AiOrg[ucChan] - tagConfig.ui16AIZero[ucChan];
ui16Full = tagConfig.ui16AIFull[ucChan] - tagConfig.ui16AIZero[ucChan];
}
else
{//電壓輸入信號
ui16Temp = (ui16AiOrg[ucChan] < tagConfig.ui16AIZeroV[ucChan])
? 0
: ui16AiOrg[ucChan] - tagConfig.ui16AIZeroV[ucChan];
ui16Full = tagConfig.ui16AIFullV[ucChan] - tagConfig.ui16AIZeroV[ucChan];
}
if (ui16Full == 0) ui16Full = 4095;
ui16Temp = ui16Temp * 4095ul / ui16Full;
ui16AiReg[ucChan] = (ui16Temp < 4095) ? ui16Temp : 4095;
//工程量化
if (tagConfig.ui16EGUL[ucChan] >= 0x8000)
{//為負數
fEGUL = (tagConfig.ui16EGUL[ucChan] & 0x7fff) * -1.0;
}
else
{//為正數
fEGUL = tagConfig.ui16EGUL[ucChan] * 1.0;
}
if (tagConfig.ui16EGUH[ucChan] >= 0x8000)
{//為負數
fEGUH = (tagConfig.ui16EGUH[ucChan] & 0x7fff) * -1.0;
}
else
{//為正數
fEGUH = tagConfig.ui16EGUH[ucChan] * 1.0;
}
//采樣結果
fAiDisp[ucChan] = (UINT32)ui16AiReg[ucChan] * (fEGUH - fEGUL) / 4096 + fEGUL;
if (tagConfig.ui16EGUDEC[ucChan] != 0) fAiDisp[ucChan] /= tagConfig.ui16EGUDEC[ucChan];
return (0);
}
//****************************************************************************
//函數名稱: Temp_Coll
//函數功能: 溫度采集
//輸入參數: void
//輸出參數: void
//返 回 值: void
//創建日期: 2008.02.19
//創 建 人: 羅德良
//參考文檔:
//說 明:
//修改歷史:
//****************************************************************************
void Temp_Coll(void)
{
UINT16 ui16Temp;
if (Read_DS18B20(&ui16Temp) == 0)
{
ui16AiReg[8] = ui16Temp;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -