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

📄 adc.c

📁 MC9S12单片机 片内AD初始化及相关操作源程序
💻 C
字号:
//[ADC.c]A/D转换-----------------------------------------------------------*
//本文件包含:                                                              *
//    (1)ADCInit:A/D转换初始化                                             *
//    (2)ADCvalue:获取1路A/D转换结果                                       *
//    (3)ADCmid:获取中值滤波后的A/D转换结果                                *
//    (4)ADCave:获取均值滤波后的A/D转换结果                                *
//硬件连接:                                                                *
//    PAD1 接模拟量输入端                                                  *
//-------------------------------------------------------------------------*

//头文件
#include "ADC.h"    //A/D转换头文件

//ADCInit:A/D转换初始化----------------------------------------------------*
//功  能:初始化AD转换                                                      *
//参  数:无                                                                *
//返  回:无                                                                *
//-------------------------------------------------------------------------*
void ADCInit(void)
{
    //ATDCTL2.ADPU = 1为打开转换电源开关
    //ATDCTL2.AFFC = 1为A/D转换CCF自动清0位
    ATDCTL2 = 0xC0;
    //ATDCTL3.S1C = 1表示序列长度为1
    //ATDCTL3.FIFO = 0为非FIFO模式
    //ATDCTL3.FRZ0~FRZ1 = 11表示冻结模式进入BDM
    ATDCTL3 = 0x0B;
    //ATDCTL4.PRS4~PRS0 = 00111表示总线频率16分频
    ATDCTL4 = 0x07;
    //ATDCTL4.SRES8 = 0表示10位转换精度
    ATDCTL4 &= 0x7F;
}

//ADCvalue:1路10位A/D转换函数----------------------------------------------*
//功  能:获取通道channel的10位A/D转换结果                                  *
//参  数:channel=通道号(0~15)                                              *
//返  回:该通道的A/D转换结果(0~1023)                                       *
//-------------------------------------------------------------------------*
INT16U ADCvalue(INT8U channel)
{ 
    INT16U temp;  //暂存A/D转换的结果
	//ATDCTL5.DJM = 0,结果寄存器数据采用左调整
	//ATDCTL5.SCAN = 1,连续转换序列
	//ATDCTL5.CC~CA = channel,启动通道转换
	ATDCTL5 = (0x20 | channel);
	//取A/D转换结果
	while (1)
	//判断ATDSTAT0的第7位是否为1
	if ((ATDSTAT0&(1<< SCFBit)) != 0)
	{
	    temp = ATDDR0;      //从A/D数据寄存器0中读10位数据
	    temp = (temp >> 6); //对数据调整,使低十位有效
	    break;
	}
	return  temp;
}

//ADCmid:1路A/D转换函数(中值滤波)------------------------------------------*
//功  能:获取通道channel中值滤波后的A/D转换结果                            *
//参  数:channel=通道号(0~15)                                              *
//返  回:该通道中值滤波后的A/D转换结果(0~1023)                             *
//内部调用函数:ADCvalue                                                    *
//-------------------------------------------------------------------------*
INT16U ADCmid(INT8U channel) 
{
    INT16U i,j,k,tmp;
    //1.取三次A/D转换结果
    i = ADCvalue(channel);
    j = ADCvalue(channel);
    k = ADCvalue(channel);
    //2.从三次A/D转换结果中取中值
    if (i > j)
    {
        tmp = i; i = j; j = tmp;
    }
    if (k >= j)
    {
        tmp = j;
    }
    else
    {
        if (k >= i)
            tmp = k;
        else
            tmp = i;
    }
    return tmp;
}
 
//ATDave:1路A/D转换函数(均值滤波)------------------------------------------*
//功  能:对通道channel的A/D转换结果求n次平均值                             *
//参  数:n=均值滤波次数(0~255),channel=通道号(0~15)                        *
//返  回:该通道均值滤波后的A/D转换结果                                     *
//内部调用函数:ADCmid                                                      *
//-------------------------------------------------------------------------*
INT16U ADCave(INT8U n,INT8U channel) 
{
    //求n次A/D转换的平均值
    INT8U i;
    INT16U j;
    if(0 == n)    n = 1;
    j = 0;
    for (i=0; i<n; i++)
        j += ADCmid(channel);
    j /= n;
    return j;
}

⌨️ 快捷键说明

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