智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3347|回复: 10
打印 上一主题 下一主题

xs128 AD模块

[复制链接]

8

主题

22

帖子

0

精华

高级会员

Rank: 4

积分
963

优秀会员奖章

威望
476
贡献
283
兑换币
294
注册时间
2013-10-30
在线时间
102 小时
毕业学校
广东海洋大学寸金学院
跳转到指定楼层
1#
发表于 2013-10-30 00:26:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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采集的是什么?

21

主题

896

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4068
威望
2252
贡献
1296
兑换币
1483
注册时间
2012-7-30
在线时间
260 小时
毕业学校
克莱德大学
2#
发表于 2013-10-30 00:47:26 | 只看该作者
AD采集的是模拟信号,然后转换成数字信号存在寄存器里。
回复 支持 反对

使用道具 举报

8

主题

324

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1209

活跃会员奖章优秀会员奖章

威望
528
贡献
373
兑换币
291
注册时间
2013-7-24
在线时间
154 小时
3#
发表于 2013-10-30 11:00:28 | 只看该作者
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口显示转换值
  }
}
回复 支持 反对

使用道具 举报

8

主题

22

帖子

0

精华

高级会员

Rank: 4

积分
963

优秀会员奖章

威望
476
贡献
283
兑换币
294
注册时间
2013-10-30
在线时间
102 小时
毕业学校
广东海洋大学寸金学院
4#
 楼主| 发表于 2013-10-30 12:29:34 | 只看该作者
℡单身旅行 发表于 2013-10-30 11:00
AD采样回来的数据你都没有正确读取。。。。。。。。怎么显示啊。。。。。
给你个参考程序

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

使用道具 举报

8

主题

324

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1209

活跃会员奖章优秀会员奖章

威望
528
贡献
373
兑换币
291
注册时间
2013-7-24
在线时间
154 小时
5#
发表于 2013-10-30 13:54:52 | 只看该作者
179170821 发表于 2013-10-30 12:29
我还是不太理解AD转换转的是什么,就你给的那个例程吧,运行后数码管显示的数据不知道是哪来的,就是我想 ...

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

使用道具 举报

8

主题

22

帖子

0

精华

高级会员

Rank: 4

积分
963

优秀会员奖章

威望
476
贡献
283
兑换币
294
注册时间
2013-10-30
在线时间
102 小时
毕业学校
广东海洋大学寸金学院
6#
 楼主| 发表于 2013-11-19 22:00:38 | 只看该作者
℡单身旅行 发表于 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,请为什么会这样子呢?
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2947
威望
1471
贡献
706
兑换币
950
注册时间
2013-10-16
在线时间
385 小时
7#
发表于 2013-11-20 12:22:19 | 只看该作者
顶个
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

注册会员

Rank: 2

积分
111
威望
65
贡献
32
兑换币
41
注册时间
2013-11-11
在线时间
7 小时
毕业学校
西安理工
8#
发表于 2013-11-22 08:21:49 | 只看该作者
这是经典的程序啊
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

注册会员

Rank: 2

积分
66
威望
28
贡献
30
兑换币
16
注册时间
2014-7-8
在线时间
4 小时
9#
发表于 2014-7-9 01:14:34 | 只看该作者
℡单身旅行 发表于 2013-10-30 11:00
AD采样回来的数据你都没有正确读取。。。。。。。。怎么显示啊。。。。。
给你个参考程序

求解答,,,AD_wValue的格式word是怎么用的,而且没法改AD_wValue中的字母
回复 支持 反对

使用道具 举报

25

主题

213

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
威望
664
贡献
302
兑换币
403
注册时间
2013-10-8
在线时间
157 小时
10#
发表于 2014-10-26 19:05:46 | 只看该作者
请问程序运行后为什么数码管会出现一些乱码,还有AD采集的是什么?
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-28 08:42 , Processed in 0.146630 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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