/*----------------------------------------------------------------------------------------------------
* 模块功能:1、实现热电偶电压的AD转换,冷锻补偿热电偶输出的电压
* 2、对冷锻补偿后的电压,进行线性补偿,使之满足0~2v的输出
* 3、片内集成的10位ADC
* 热电偶ADC输入口 P1.1
* (已调试通) 2018_1_7
*-----------------------------------------------------------------------------------------------------
*/
#include "ADC.h"
uchar Compensate_account=0;
uint Voltage_average;//均值滤波后输出的电压值
/*----------------------------------------------------------------------------------------------------
* 延时函数,延时时间为ms (未经验证)
*-----------------------------------------------------------------------------------------------------
*/
void delay(uint time_data,uchar temp)
{
uchar i,j;
for(i=0;i<time_data;i++)
{
for(j=0;j<temp;j++);
}
}
/*----------------------------------------------------------------------------------------------------
* ADC初始化函数
* ADRJ=1 ADC_RES 存储数字量高数字量2位 ADC_RESL 存储数字量的低8位 ADC采集的通道为1通道
*-----------------------------------------------------------------------------------------------------
*/
void ADC_init()
{
P1ASF=0x02;//P1口全部作为模拟AD输入
P1M1=0xff; //P1口全部作为高阻输入
P1M0=0x00;
ADC_CONTR=0x00;//ADC控制寄存器清零
ADC_CONTR=0x81;//打开AD转换器电源 AD转换时间为540个时钟周期转换一次 选择转换通道为通道1
ADC_RES=0x00;//数字量高2位清零
ADC_RESL=0x00;//数字量低8位清零
AUXR1|=1<<2;//ADRJ=1
delay(100,110);//延时6ms等待值写入ADC_CONTR寄存器
}
/*---------------------------------------------------------------------------------------------------
* 函数功能:ADC转换后的数字量,通过公式得到热电阻输出的电压值
*----------------------------------------------------------------------------------------------------
*/
uint Get_VoltageData()
{
uint Voltage_data=0;//读取的数字量
ADC_CONTR|=0x08;//开始AD转换
delay(5,10);//延时30us
while((ADC_CONTR&(1<<4))==0);//等待ADC_FLAG ADC转换完成标志位置1
ADC_CONTR&=~(1<<4);//ADC转换完成标志位清零
//Voltage_data=ADC_RES*4+ADC_RESL//读取高2位数据
//Voltage_data=(Voltage_data<<8)|ADC_RESL;//整合读取的10位数据
return (ADC_RES*4+ADC_RESL);
}
/*-------------------------------------------------------------------------------------------------
*函数功能:均值滤波程序
*参数说明: Max_Voltage 转换后的最大电压为5000mv Max_Digital 1024 ADC转换后的最大数字量
* Voltage_average 转换后的电压值,单位为mv
*--------------------------------------------------------------------------------------------------
*/
void get_average()
{
uint Sum_data=0;//均值滤波数据总和
uchar num;
uint average_data=0;//均值滤波后输出的数字量
uint Data=0;//ADC采集的数字量
for(num=0;num<100;num++)
{
Data=Get_VoltageData();
Sum_data+=Data;
}
average_data= Sum_data/100;
Sum_data=0;
Voltage_average=average_data;
// Voltage_average=Max_Voltage/Max_Digital*average_data;
}
评论1