智能车制作

标题: xs128 AD模块 [打印本页]

作者: 179170821    时间: 2013-10-30 00:26
标题: xs128 AD模块
#include <hidef.h>      
#include <MC9S12XS128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
unsigned char h[16]; //采集到的数据存放的一维数组
/****************延时函数************************/
void delay(unsigned int n)  
{
    unsigned int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<530;j++);
}
/*****************超频函数***********************/
void chaopin(void) //超频64MHZ
{  
    CLKSEL=0X00;   
    PLLCTL_PLLON=1;   
    SYNR =0xc0 | 0x07;                        
    REFDV=0xc0 | 0x01;
    POSTDIV=0x00;      
    _asm(nop);         
    _asm(nop);
    _asm(nop);
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   
    CLKSEL_PLLSEL =1;                    
}
/*****************AD初始化***********************/
void atd_init(void)
{   
  ATD0CTL1=0x00;   //8位分辨率,采样前不放电(外部触发源未启动:ATD0CTL2_ERTIGP)     
  ATD0CTL2=0X40;    //对结果寄存器的访问自动清除转换标志位         
  ATD0CTL3=0XF8;    //结果右对齐,转换序列15      
  ATD0CTL4=0X35;    //采样周期4   
  ATD0CTL5=0X32;    //多通道连续转换(采样通道AN0),写ATD0CTL5寄存器以启动AD转换序列      
  ATD0DIEN=0x00;    //禁止数字信号输入
}
/********************主函数************************/
void main(void)
{
int i;        
    DDRA=0X00;//PA口输入设置
    DDRB=0XFF;//PB口输出设置               
    chaopin();            
    atd_init();                     
    delay(900) ;            
    EnableInterrupts;  
    for(;;)
    {
   
        h[1]=ATD0DR0L;
        h[2]=ATD0DR1L;
        h[3]=ATD0DR2L;
        h[4]=ATD0DR3L;
        h[5]=ATD0DR4L;//读取数据   
        h[6]=ATD0DR5L;
        h[7]=ATD0DR6L;
        h[8]=ATD0DR7L;
        for(i=1;i<9;i++)
        {
            PORTB=h[i];
            delay(10000);
        }
    }
}

请问程序运行后为什么数码管会出现一些乱码,还有AD采集的是什么?

作者: rubick    时间: 2013-10-30 00:47
AD采集的是模拟信号,然后转换成数字信号存在寄存器里。
作者: ℡单身旅行    时间: 2013-10-30 11:00
AD采样回来的数据你都没有正确读取。。。。。。。。怎么显示啊。。。。。
给你个参考程序

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

word AD_wValue;//AD转换结果




//----------------------------初始化函数-------------------------------//

//-----时钟初始化程序--------//
void PLL_Init(void)      
{                    
  REFDV=1;           
  SYNR=2;
  while(!(CRGFLG&0x08));
  CLKSEL=0x80;
}
//--------------总线时钟=48/2=24MHz------------//

//-----ATD初始化程序--------//
void AD_Init(void)     
{
  ATD0CTL1=0x00; //00000000  选择AD 通道为外部触发,8 位精度,采样前不放电
  ATD0CTL2=0x40; //01000000  标志位自动清零,禁止外部触发, 禁止中断
  ATD0CTL3=0x88; //10001000  右对齐无符号,每次转换1 个序列, No FIFO, Freeze 模式下继续转
  ATD0CTL4=0x01; //00000001  采样时间为4 个AD 时钟周期,PRS=1,ATDClock=24/(2*(1+1))=6MHz
  ATD0CTL5=0x20; //00100000  特殊通道禁止,连续转换,单通道转换,输入通道为0
  ATD0DIEN=0x00; //00000000  禁止数字输入
}
//-----读取AD转换结果--------//
void AD_GetValue(word *AD_wValue)
{
  *AD_wValue=ATD0DR0;  //读取结果寄存器的值
}




//-----主函数--------//
void main(void)
{
  PLL_Init();
  AD_Init();         
  DDRB=0xFF;  
  PORTB=0xFF;
  EnableInterrupts;  
  for(;;)
  {
    while(!ATD0STAT2_CCF0);    // 等待转换结束while(ATDOSTAT2_CCF0==1)
          AD_GetValue(&AD_wValue);   // 读取转换结果
    PORTB = (byte)AD_wValue;   // 在B口显示转换值
  }
}

作者: 179170821    时间: 2013-10-30 12:29
℡单身旅行 发表于 2013-10-30 11:00
AD采样回来的数据你都没有正确读取。。。。。。。。怎么显示啊。。。。。
给你个参考程序

我还是不太理解AD转换转的是什么,就你给的那个例程吧,运行后数码管显示的数据不知道是哪来的,就是我想问例程AD转换转的是哪个模拟量?谢谢!

作者: ℡单身旅行    时间: 2013-10-30 13:54
179170821 发表于 2013-10-30 12:29
我还是不太理解AD转换转的是什么,就你给的那个例程吧,运行后数码管显示的数据不知道是哪来的,就是我想 ...

AD就是采集你给的电压值,因为是5V的,如果是八位的话,就把5平均分成256份,再按照你给的电压值,然后显示出来,,,,,,,就是模拟的转换成数字的了。。。。。。至于程序问题,你还是没有读懂,,,,,,

作者: 179170821    时间: 2013-11-19 22:00
℡单身旅行 发表于 2013-10-30 13:54
AD就是采集你给的电压值,因为是5V的,如果是八位的话,就把5平均分成256份,再按照你给的电压值,然后显 ...

#include "derivative.h"
#include <stdio.h>
#include <string.h>
#include"OLED.h"   //液晶
int AD_wValue;//AD转换结果
void delay(int n) \
{
   int i,j;
   for(i=0;i<n;i++)
       for(j=0;j<2670;j++);
}
   
//-----时钟初始化程序--------//
void PLL_Init(void)      
{                    
  REFDV=1;           
  SYNR=2;
  while(!(CRGFLG&0x08));
  CLKSEL=0x80;
}
//--------------总线时钟=48/2=24MHz------------//
//-----ATD初始化程序--------//
void AD_Init(void)     
{
  ATD0CTL1=0x00; //00000000  选择AD0通道为外部触发,8 位精度,采样前不放电
  ATD0CTL2=0x40; //01000000  标志位自动清零,禁止外部触发, 禁止中断
  ATD0CTL3=0x88; //10001000  右对齐无符号,每次转换1 个序列, No FIFO, Freeze 模式下继续转
  ATD0CTL4=0x01; //00000001  采样时间为4 个AD 时钟周期,PRS=1,ATDClock=24/(2*(1+1))=6MHz
  ATD0CTL5=0x20; //00100000  特殊通道禁止,连续转换,单通道转换,输入通道为0
  ATD0DIEN=0x00; //00000000  禁止数字输入
}
//-----读取AD转换结果--------//
void AD_GetValue(int *AD_wValue)
{
  *AD_wValue=ATD0DR0;  //读取结果寄存器的值
}
//-----主函数--------//
void main(void)
{
  double a=23,b=32;
  char c[20] ;
  PLL_Init();
  AD_Init();
  DDRM=0XFF;
  LCD_Init();
  delay(2);   
  EnableInterrupts;
   
  for(;;)
  {
    while(!ATD0STAT2_CCF0);    // 等待转换结束while(ATDOSTAT2_CCF0==1)
          AD_GetValue(&AD_wValue);   // 读取转换结果
    a = (double)AD_wValue;   // 在B口显示转换值
      
/******************液晶显示*************************/
  sprintf (c, "%f", a);
  LCD_Print(0,2,c);
/******************************************/
  delay(1000);
  }
}

运行之后,当AD0什么都不接时,液晶显示的数值在160附近跳变,当插上杜邦线之后,不管杜邦线接5V还是GND,液晶显示一直是从0逐渐跳变到255,然后又循环从0跳变到255,请为什么会这样子呢?

作者: 阿哈……    时间: 2013-11-20 12:22
顶个
作者: 牛蹄中鱼    时间: 2013-11-22 08:21
这是经典的程序啊
作者: 175411    时间: 2014-7-9 01:14
℡单身旅行 发表于 2013-10-30 11:00
AD采样回来的数据你都没有正确读取。。。。。。。。怎么显示啊。。。。。
给你个参考程序

求解答,,,AD_wValue的格式word是怎么用的,而且没法改AD_wValue中的字母
作者: zhifu    时间: 2014-10-26 19:05
请问程序运行后为什么数码管会出现一些乱码,还有AD采集的是什么?




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