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