呵呵,我们的Freescale。终于有Freescale的版块了,现在把以前写的一些东西转过来,希望能有更多人的关注Freescale。
MCF52233_ADC—Analog-to-Digital Converter
52233的ADC有8路的AD通道,精度12位,分辨率达到了0.8mV,功能有点小多,超过设置的上、下限时都可以产生中断、有过零检测、差分检测,还有就是它的电源管理方式了,有auto power down 、auto standby、nomarl这几种,这个还需要进一步的使用跟研究。有几个地方刚开始看起来还真有点小绕人。ADLST1跟ADLST2里的sample0—sample7存着采样的输入通道,采样时按sample0到sample7里设的通道顺序来。 以前使用电路基本上都没考虑过电源不稳的问题,这次有点体会了。在不断采样一个输入时发现测得的值是不断在变的,最大变化幅度竟然有20mV这个让我有点小吃惊!估计应该是电源不稳导至的。呵呵,这个得拿个示波器来测下看到底是什么情况。反正以后对电源这块得多关注,不然涉及到这样对精度要求高点的电路,一不小心搞不好就不能正常工作了。20mV!!52233的ADC有三个中断入口:eosi0中断向量号49、eosi1中断向量号50还有adcint中断向量号51。其中adcint是管过零检测、上、下限中断的。下面就是ADC一段简单的代码:
ADC的初始化,完成后ADC就可以开始工作了,对数据的处理放在中几个中断中,注意在进入这些中断后要清相就的中断标志位。
void ADC_init(void)
{
MCF_GPIO_PANPAR=MCF_GPIO_PANPAR_AN0_AN0
|MCF_GPIO_PANPAR_AN1_AN1
|MCF_GPIO_PANPAR_AN2_AN2
|MCF_GPIO_PANPAR_AN3_AN3
|MCF_GPIO_PANPAR_AN4_AN4
|MCF_GPIO_PANPAR_AN5_AN5
|MCF_GPIO_PANPAR_AN6_AN6
|MCF_GPIO_PANPAR_AN7_AN7;
MCF_ADC_CTRL1=MCF_ADC_CTRL1_STOP0
|MCF_ADC_CTRL1_CHNCFG(0)
|MCF_ADC_CTRL1_SMODE(0)
|MCF_ADC_CTRL1_EOSIE0;
MCF_ADC_CTRL2=MCF_ADC_CTRL2_DIV(1);
// MCF_ADC_CTRL2=MCF_ADC_CTRL2_STOP1
// |MCF_ADC_CTRL2_SYNC1
// |MCF_ADC_CTRL2_EOSIE1;
/*
MCF_ADC_ADZCC=MCF_ADC_ADZCC_ZCE0(3)
|MCF_ADC_ADZCC_ZCE1(3)
|MCF_ADC_ADZCC_ZCE2(3)
|MCF_ADC_ADZCC_ZCE3(3)
|MCF_ADC_ADZCC_ZCE4(3)
|MCF_ADC_ADZCC_ZCE5(3)
|MCF_ADC_ADZCC_ZCE6(3)
|MCF_ADC_ADZCC_ZCE7(3);
*/
MCF_ADC_ADLST1=MCF_ADC_ADLST1_SAMPLE0(0)
|MCF_ADC_ADLST1_SAMPLE1(1)
|MCF_ADC_ADLST1_SAMPLE2(2)
|MCF_ADC_ADLST1_SAMPLE3(3);
MCF_ADC_ADLST2=MCF_ADC_ADLST2_SAMPLE4(4)
|MCF_ADC_ADLST2_SAMPLE5(5)
|MCF_ADC_ADLST2_SAMPLE6(6)
|MCF_ADC_ADLST2_SAMPLE7(7);
MCF_ADC_ADSDIS=MCF_ADC_ADSDIS_DS2;
MCF_ADC_ADSTAT=MCF_ADC_ADSTAT_EOSI0
|MCF_ADC_ADSTAT_EOSI1;
MCF_ADC_ADLSTAT=0XFFFF;
MCF_ADC_ADLLMT(0)=0;
MCF_ADC_ADLLMT(1)=0;
MCF_ADC_ADLLMT(2)=0;
MCF_ADC_ADLLMT(3)=0;
MCF_ADC_ADLLMT(4)=0;
MCF_ADC_ADLLMT(5)=0;
MCF_ADC_ADLLMT(6)=0;
MCF_ADC_ADLLMT(7)=0;
MCF_ADC_ADHLMT(0)=0XFFFF;
MCF_ADC_ADHLMT(1)=0XFFFF;
MCF_ADC_ADHLMT(2)=0XFFFF;
MCF_ADC_ADHLMT(3)=0XFFFF;
MCF_ADC_ADHLMT(4)=0XFFFF;
MCF_ADC_ADHLMT(5)=0XFFFF;
MCF_ADC_ADHLMT(6)=0XFFFF;
MCF_ADC_ADHLMT(7)=0XFFFF;
MCF_ADC_ADOFS(0)=0;
MCF_ADC_ADOFS(1)=0;
MCF_ADC_ADOFS(2)=0;
MCF_ADC_ADOFS(3)=0;
MCF_ADC_ADOFS(4)=0;
MCF_ADC_ADOFS(5)=0;
MCF_ADC_ADOFS(6)=0;
MCF_ADC_ADOFS(7)=0;
MCF_ADC_ADZCSTAT=0XFF;
MCF_ADC_POWER|=MCF_ADC_POWER_ASB;
MCF_INTC0_IMRH&=~MCF_INTC_IMRH_INT_MASK49;
MCF_INTC0_IMRL&=~MCF_INTC_IMRL_MASKALL;
MCF_INTC0_ICR49=MCF_INTC_ICR_IP(3)+MCF_INTC_ICR_IL(4);
}
启动跟停止ADC:
void ADC_start(void)
{
MCF_ADC_POWER&=~MCF_ADC_POWER_PD0;
while(MCF_ADC_POWER&MCF_ADC_POWER_PSTS0);
MCF_ADC_CTRL1&=~MCF_ADC_CTRL1_STOP0;
MCF_ADC_CTRL1|=MCF_ADC_CTRL1_START0;
}
void ADC_stop(void)
{
MCF_ADC_CTRL1|=MCF_ADC_CTRL1_STOP0;
}
eosi0中断:
__declspec(interrupt:0) void ADC_eosi0(void)
{
int rawresult=0;
char result[4];
MCF_ADC_ADSTAT|=MCF_ADC_ADSTAT_EOSI0;
rawresult=(MCF_ADC_ADRSLT0&0x7fff)>>3;
result[0]=(char)(rawresult/1000+48);
result[1]=(char)((rawresult%1000)/100+48);
result[2]=(char)((rawresult%100)/10+48);
result[3]=(char)(rawresult%10+48);
uart0_putstr("channel0=");
uart0_putstr(result);
uart0_putchar('\n');
}
[ 本帖最后由 tjbbjiang 于 2009-12-1 15:42 编辑 ]
|