在线时间0 小时
UID252783
注册时间2010-12-8
NXP金币0
该用户从未签到
新手上路

- 积分
- 82
- 最后登录
- 1970-1-1
|
其中ATD转换函数采用王宜怀、刘晓升老师编著的《嵌入式系统---使用HCS12微控制器的设计与应用》一书中的程序,我个人所用的芯片为MC9S12XHZ512单片机,所用外部晶振为14.7456Mhz,总线时钟为14.7456*2,只不过将通道0改为了通道8转换,AD初始化模块改为了如下:
void ADCInit(void)
{
ATDCTL0=0x00;
ATDCTL1=0x8F;
//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 = 01110表示总线频率30分频14.7456*2/30=0.98304MHz
ATDCTL4 = 0x0E;
//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>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=0,j=0,k=0,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>8)+0x30); //先发送高8位
SCI_write(0xCC);
SCI_write(0x33);
SCI_write(0xC3);
SCI_write(0x3C);
SCI_write(0xAA);
SCI_write(0x6F);
SCI_write(0x00);
SCI_write(0x20);
SCI_write(0x00);
SCI_write(0x80);
SCI_write((INT8U)adv+0x30); //再发送低8位
SCI_write(0xCC);
SCI_write(0x33);
SCI_write(0xC3);
SCI_write(0x3C);
//延迟
// for(j=0; j
|
|