MCF52233ADC
0赞
MCF52233的ADC功能很是强大,有8个ADC通道,有两个ADC模块,这两个ADC模块可以设置为并行工作模式(但对每个模块还是顺序转换的)或者是顺序的模式。MCF52235 ADC模块的主要特性:12位的精度,频率最高为5MHz,采样率高达1.66MPS,单通道采样转换时间1.7微秒,额外转换时间1.2微秒,差分功能。控制寄存器1:CTRL1为16位寄存器,主要位STOP0可以设置是否停止,START0使模块开始工作,SYNC0定义模块可以由外部信号触发工作,EOSIE0、ZCIE、LLMTIE、HLMTIE定义各种中断使能,CHNCFG定义是否使用差分,SMODE转换模式。控制寄存器2:CTRL2为16位寄存器,DIV设置时钟的分频。若工作在并行转换模式,则CTRL2和CTRL1含义基本相同,但是控制的是ADC B模块。 ADZCC寄存器:和ADOFSn配合使用,过零标志,可以设置符号由正变负或由负变正触发中断。ADLST1和ADLST2:可以设置队列转换的先后顺序,既先先采样哪个通道。采样禁止寄存ADSDIS:该寄存器与ADLST1,ADLST2配合使用,对应位为1允许采样。状态寄存器ADSTAT:CIP0和CIP1指A和B模块是正在转换还是处于空闲,EOSI1和EOSI0表示转换完成中断来临,ZCI过零中断,LLMTI最低限制中断,HLMTI最高限制中断,RDYn指示采样是否就绪。
限制状态寄存器ADLSTAT:指示是否超越高低限制。过零状态寄存器ADZCSTAT:过零状态。结果寄存器ADRSLTn:16位寄存器RSLT存放12位结果,还提供一个SEXT符号位。低三位未用。高低限制寄存器ADHLMTn和ADLLMTn:设置高低限制,离开这个限制将产生中断(如果允许)。偏移量寄存器ADOFSn:是跟过零状态有关的值。参考电压寄存器CAL:选择参考电压源。ADC的详细说明和一些细节问题请阅读英文的PDF文档。下面贴出一个关于ADC的程序以供参考:
#include"ADC.h"
void ADCInit(void)
{
//config CTRL1
MCF_ADC_CTRL1 =MCF_ADC_CTRL1_STOP0|MCF_ADC_CTRL1_SYNC0|MCF_ADC_CTRL1_EOSIE0
|MCF_ADC_CTRL1_CHNCFG(0)|MCF_ADC_CTRL1_SMODE(0);
MCF_ADC_CTRL2= MCF_ADC_CTRL2_DIV(9);
MCF_ADC_ADLST1=0x37; //Set the list register
MCF_ADC_ADLST2=0x4567;
//Set the sample Disable Register(ADSDIS)
// MCF_ADC_ADSDIS=MCF_ADC_ADSDIS_DS1;
MCF_ADC_ADSDIS=MCF_ADC_ADSDIS_DS2;
//Set the lowest limit , highest limit
MCF_ADC_ADLLMT0 = 0x2222;
MCF_ADC_ADHLMT0 = MCF_ADC_ADHLMT_HLMT(0xffff);
// MCF_ADC_ADLLMT1 = 0;
// MCF_ADC_ADHLMT1 = MCF_ADC_ADHLMT_HLMT(0x4444);
// MCF_ADC_ADLLMT2 = 0;
// MCF_ADC_ADHLMT2 = MCF_ADC_ADHLMT_HLMT(0xffff);
// MCF_ADC_ADLLMT3 = 0;
// MCF_ADC_ADHLMT3 = MCF_ADC_ADHLMT_HLMT(0xffff);
// MCF_ADC_ADLLMT4 = 0;
// MCF_ADC_ADHLMT4 = MCF_ADC_ADHLMT_HLMT(0xffff);
//set the offset regisers
// MCF_ADC_ADOFS0 = 0x0fff;
// MCF_ADC_ADOFS1 = 0;
// MCF_ADC_ADOFS2 = 0;
// MCF_ADC_ADOFS3 = 0;
// MCF_ADC_ADOFS4 = 0;
// MCF_ADC_ADOFS5 = 0;
// MCF_ADC_ADOFS6 = 0;
// MCF_ADC_ADOFS7 = 0;
// Disables zero crossing flag
// MCF_ADC_ADZCC |= MCF_ADC_ADZCC_ZCE0(0X2);
MCF_ADC_POWER = 0xd4;//PUDELY=13,PD2=1
///// MCF_ADC_CTRL1 &=~MCF_ADC_CTRL1_STOP0;//CLEAR STOP0,PREPARE FOR STARTING
//wait A power_up finish
while(MCF_ADC_POWER&MCF_ADC_POWER_PSTS0)
{
;
}
//wait B power_up finish
while(MCF_ADC_POWER&MCF_ADC_POWER_PSTS1)
{
;
}
}
void ADCStart(void)
{
//MCF_ADC_CTRL1&=~MCF_ADC_CTRL1_STOP0;
MCF_ADC_CTRL1|=MCF_ADC_CTRL1_START0;
MCF_ADC_ADRSLT0=0X1111;
}