搜索
bottom↓
回复: 9

飞思卡尔单片机(MC9S12XS128)系列之7- AD 的使用

[复制链接]

出0入0汤圆

发表于 2011-8-11 16:12:52 | 显示全部楼层 |阅读模式
作者     :fire
时间地点 :2009 年于广州
开发平台 :MC9S12XS128最小系统(龙丘出品)
编译环境 :Freescale CodeWarrier 4.7

写在前面的话->:
ATD 的具体使用可参考 datasheet Chapter 10 Analog-to-Digital Converter (ADC12B16CV1) ,其中代码里头以有详细的注释,其余这里不再详述。

/***************************以下为代码实现****************************/
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define uchar  unsigned char
#define uint  unsigned int
/*--------函数原型声明----------------*/
void ATD_Init(void);
void Read_AD(uint ch, uchar *ad);
void SetBusCLK_16M(void);
/*-------------主函数-----------------*/
void main(void)
{
  uchar *ad;  
  DisableInterrupts;
  SetBusCLK_16M();
  
  ATD_Init();
  DDRB = 0XFF;
  for(;;)
  {
      Read_AD(0,ad);      //读取通道0的AD值
      PORTB = *ad;          //读取的AD值通过 LED 显示出来
  }
}
  
/*---------------ATD初始化-------------*/
void ATD_Init(void)
{
   ATD0DIEN=0X00;      //禁止数字输入
   ATD0CTL1=0X00;      //不外部触发,8位分辨率
   //ATD0CTL1=0X15;   
                       //ATD控制寄存器1,写此寄存器会停止当前的转换序列(page 275)
                       //bit7  外部触发源选择, =1外部触发源使能 =0外部触发源禁止
                       //bit65   AD 分辨率选择位  00-8位精度 01-10位精度 10-12位精度  11-保留
                       //bit4    =1采样前放电  =0采样前不放电
                       //bit3210 外部触发通道选择  Page 276
   ATD0CTL2=0x40;      //禁止外部触发, 中断禁止 快速清除标志 0100 0000
                                          
                       //bit7  未生效或者保留
                       //bit6   AFFC快速清除标志位
                       //bit5   外部时钟输入停止模式位
                       //bit4   外部触发Level/Edge 控制
                       //bit3   外部触发极性选择
                       //bit2   外部触发模式使能
                       //bit1   ATD转换完成中断使能
                       //bit0   ATD比较中断使能
   ATD0CTL3=0x84;      //| DJM | S8C | S4C | S2C || S1C | FIFO | FRZ1 | FRZ0 |
                       //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转
                       //bit7  转换结果对齐模式位 =0左对齐 =1右对齐
                       //bit6543  转换序列长度  就是需要转换的通道数  默认转换序列长度为4 Page 279
                       
                       //bit2     结果(FIFO  First in First out )寄存器先进先出模式位
                       //bit10    背景调试冻结使能位
                                  //00 继续转换  01 保留  10 完成当前转换,再冻结 ,11 立即冻结
   ATD0CTL4=0x01;      //采样时间为4个ATD时钟  
                       //bit7-5   采样时钟选择位(page 280)
                       //bit4-0   PRS[4:0]ATD时钟预分频位
                       //公式: ATDClock=[BusClock]/[2*(PRS+1)]  Page 280
                       
   ATD0CTL5=0;         //bit7 281页
                       //bit6 SC 特殊通道转换使能位  =0特殊通道不使能 =1特殊通道使能
                       //bit5 SCAN  =1 连续转换  =0 Signal conversion sequence
                       //bit4  多通道采样模式位 =1 多通道轮流采样  =0  单通道采样  
                       //bit3-0  模拟输入通道选择位 CD CC CB CA 0000-1111 0-16通道
}                                                                 

/*---------------读取ATD的值------------------*/
void Read_AD(uint ch, uchar *ad)
{   
    ATD0CTL5|=(0X20+ch);     //禁止特殊通道,扫描模式,单通道采样
                             //通道选择 ch可为 0 1 2 3 4 5 6 7
                             //281页
    while(!ATD0STAT0_SCF);   //等待转换完成
    switch(ch)
    {         
       case 0:   *(ad+0)= ATD0DR0L;   break;   
       case 1:   *(ad+1)= ATD0DR1L;   break;
       case 2:   *(ad+2)= ATD0DR2L;   break;
       case 3:   *(ad+3)= ATD0DR3L;   break;
       case 4:   *(ad+4)= ATD0DR4L;   break;
       case 5:   *(ad+5)= ATD0DR5L;   break;
       case 6:   *(ad+6)= ATD0DR6L;   break;
       case 7:   *(ad+7)= ATD0DR7L;   break;         
    }
}
/*-----------------配置系统时钟---------------*/
void SetBusCLK_16M(void)
{   
    CLKSEL=0X00;                    //disengage PLL to system
    PLLCTL_PLLON=1;                 //turn on PLL
    SYNR=1;         
    REFDV=1;                        //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
    _asm(nop);                      //BUS CLOCK=16M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));      //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;              //engage PLL to system;
}
/*-----------------end of file------------------*/

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2011-8-11 16:13:43 | 显示全部楼层
呵呵,先发这几篇吧,等帖子审核过了之后再发。

出0入0汤圆

 楼主| 发表于 2011-8-12 13:52:37 | 显示全部楼层
两天了,还没审核过,难道我这个帖子有什么问题嘛

出0入0汤圆

 楼主| 发表于 2011-8-12 13:55:42 | 显示全部楼层
请阿莫快点帮我审核吧,我手头上还有涉嫌头和图像处理的demo哩

出0入0汤圆

发表于 2011-8-23 16:09:01 | 显示全部楼层
呵呵,以前用过飞思卡尔芯片,谢谢分享

出0入0汤圆

发表于 2011-11-12 20:49:47 | 显示全部楼层
楼主  ATD1的寄存器怎么配置啊,好像XS128没有ATD1的寄存器

出0入0汤圆

发表于 2011-11-13 09:37:48 | 显示全部楼层

出0入0汤圆

发表于 2011-11-13 09:38:23 | 显示全部楼层
同意

出0入0汤圆

发表于 2011-11-25 14:19:02 | 显示全部楼层
很实用的资料 真心谢谢分享

出0入0汤圆

发表于 2011-11-29 22:03:03 | 显示全部楼层
谢谢分享,正在进行学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-2 23:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表