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

📄 ai.c

📁 基于ucos的TLC2543源码,DS18B20源
💻 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 + -