智能车制作

标题: MC9S12单片机ATD模块 [打印本页]

作者: xiaowei19890228    时间: 2010-3-7 19:01
标题: MC9S12单片机ATD模块
问题:在调试单片机ATD模块时,输入模拟电压为2V,单片机测出的数据为192,或者是0,或者是64,总是得不到正确的结果,参考电压VRH,VRL用万用表测试分别是4.096V,0V,每个通道测试出的结果基本上都是一样的。源程序如下,大家看看有什么问题没?

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
volatile unsigned char ad_word=0;
void main()
  {
      unsigned int i = 0;
      EnableInterrupts;
      ATD0CTL2  = 0xc2;             //使能A/D,快速清除标志,在队列转换完成后产生中断
      ATD0CTL3  = 0x08;         //转换队列长度为1,转换完成后暂停
      ATD0CTL4  = 0x80;         //8位精度, 2个时钟, ATDClock=[BusClock*0.5]/[PRS+1]
      ATD0CTL5  = 0xa6;           //结果右对齐,单通道采样,通道选择为通道4
      ATD0DIEN  = 0x00;            // 禁止数字输入
      DDRB      = 0xff;
      PORTB     = 0x00;
      for(;;)
        {
            
        }
  }
  
#pragma CODE_SEG NON_BANKED
void  interrupt 22 AD_Comper(void)
  {
        ad_word =  ATD0DR0L;
         PORTB     =   ad_word;   
  }
作者: xiaowei19890228    时间: 2010-3-7 20:16
已解决!
原因是这样的,原来我所参考的书籍中的有关寄存器的定义和数据手册上的定义不一样,向数据手册中有ATD0CTL0,ATD0CTL1的定义,并且控制着ADT,所以上面的程序实际上是错误的初始化,所以一直得不到正确的结果,在这里列出来希望能对遇到同样问题的人一个帮助作用吧!
改过的程序如下:
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

unsigned int AD_wData=0;
void main()
  {
      EnableInterrupts;
      ATD0CTL1   = 0x00;        //8位分辨率,不放电
      ATD0CTL2   = 0x62;        //快速清除标志位,中断开启
      ATD0CTL3   = 0xa0;        //队列长度为4,右对齐方式
      ATD0CTL4   = 0x00;        //转换时钟为4个时钟,时钟频率为Fbus/2
      ATD0CTL5   = 0x20;        //单通道连续转换,通道序号为0
      DDRB       = 0xff;
      PORTB      = 0x00;
      for(;;)
        {
        
        }
  }

#pragma CODE_SEG NON_BANKED
void interrupt 22 Int_AD0(void)
{
   DisableInterrupts;
   AD_wData  =  0;
   AD_wData += ATD0DR0L;  //Read out the Result Register
   AD_wData += ATD0DR1L;
   AD_wData += ATD0DR2L;
   AD_wData += ATD0DR3L;
   PORTB = (byte) (AD_wData >> 2);
   EnableInterrupts;
}
作者: cqqjliyuan    时间: 2010-3-13 10:28
呵呵  谢了   我也遇到了这样的问题
作者: zhoulxm    时间: 2010-3-13 15:59

作者: francis    时间: 2010-3-15 10:43
学习了
作者: 632693521    时间: 2010-3-23 11:38
请问,你用的是mc9s12xs128么?还是其他的?若是前者的MCU,ATD0CTL0,ATD0CTL1就不用定义管他么?谢谢!
作者: lyyyuna    时间: 2010-3-23 14:16
hao
作者: xiaokk    时间: 2010-3-24 17:55
本人是新手,想请问下如果程序正确你说的模拟输入电压是2V,那么单片机测出数据是多少才是正确结果呢?为什么?期待解答。
作者: 锦芫    时间: 2010-3-24 19:15
新手谢过
作者: xiaokk    时间: 2010-3-25 16:47
楼主给解答一下呗。
作者: 632693521    时间: 2010-4-13 08:33
直到今天我才发现这个被忽视的问题,太感谢楼主了!
作者: k410533234    时间: 2010-4-13 09:37
回复 2# xiaowei19890228


    这是检测四路信号的吧,在B口呢显示这么多的数据吗?还有
PORTB = (byte) (AD_wData >> 2);
这句做什么?(移位?)
作者: Tom_xuan    时间: 2010-4-17 14:05
请问楼主是MC9S12XS128的吗?谢谢
作者: Tom_xuan    时间: 2010-4-17 14:21
太谢谢啦,搞定
作者: ning204    时间: 2010-5-3 16:52
高手啊!!!
作者: wangguoxiao    时间: 2010-5-5 16:23
很解决问题
作者: fanfankaka123    时间: 2011-2-26 17:49
刚试了一下这个程序,太给力了~~谁能解释下,谢谢
作者: fanfankaka123    时间: 2011-2-26 19:26
终于知道为什么了,去官网上下个S12XS128的资料吧,寄存器的定义和那些参考书上的真的不一样。
谢谢楼主~~
作者: xiaotong0202    时间: 2011-3-6 07:40
谢谢楼主
作者: 蛋求无悔    时间: 2013-1-25 19:41
xiaowei19890228 发表于 2010-3-7 20:16
已解决!
原因是这样的,原来我所参考的书籍中的有关寄存器的定义和数据手册上的定义不一样,向数据手册中 ...

古德






欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2