3653|0

12

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MCF52233_ADC [复制链接]

  呵呵,我们的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 编辑 ]
此帖出自NXP MCU论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表