智能车制作
标题:
9S12XS四路AD转换
[打印本页]
作者:
yoncos
时间:
2011-3-22 10:28
标题:
9S12XS四路AD转换
/*
**********************************************************************************
*
* 工程名称:9S12XS AD TO RS232
* 功能描述:结合飞思卡尔16位单片机MC9S12XS128完成4路AD采集,并通过RS232发送到上位机。
* IDE环境: Metrowerks CodeWarrior 5.90
* 组成文件:
* main.c
*
* 说明: 本版本为AD及RS232通讯程序早期版本,还有待更进一步完善
* 日期:2011-3-6
* (c) Copyright 2011,Yoncos
* All Rights Reserved
*
*
* By : Yoncos
**********************************************************************************/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
byte ad_value0; //保存AD转换结果高位
byte ad_value1;
byte ad_value2;
byte ad_value3;
byte ad_value0_1; //保存AD转换结果地位
byte ad_value1_1;
byte ad_value2_1;
byte ad_value3_1;
/***---------------延时程序---------------***/
void Delay(int i)
{
int j;
for(;i>0;i--)
for(j=500;j>0;j--);
}
/***---------------时钟初始化程序---------------***/
//这也是前辈写的,未改动
void InitBusClk(void)
{
CLKSEL=0X80; //PLLSEL 1 : Bus Clock=PLLCLK/2
// 0 : Bus Clock=OSCCLK/2
PLLCTL_PLLON=1; //开启PLL
SYNR=0;
REFDV=0X03; //OSCCLK=16MHz
//PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz
while(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环
CLKSEL_PLLSEL=1;
//PLLSEL 1 : Bus Clock=PLLCLK/2=8MHz/2=4MHz
// 0 : Bus Clock=OSCCLK/2=16M/2=8MHz
}
/***---------------AD初始化程序---------------***/
//部分是参考前辈的,CTL345根据自己的需求设置。此处已设置打开0123四个通道,保存结果到对应ATD0DRx(x表示结果寄存器编号)
void InitAD(void)
{
ATD0CTL2 = 0XC0; // 1100 0000 启动A/D,
ATD0CTL3=0X24;
//00100100 打开0/1/2/3通道,FIFO打开结果保存到相应的结果寄存器
ATD0CTL4 = 0XE1; // 11100001 8位精度, 16AD采样时间
ATD0CTL5=0X30; //3月22日修改,多通道,左对齐,无符号,连续转换,起始通道ATD0
ATD0DIEN = 0X00; // 数字输入 disabled
}
/***---------------主程序---------------***/
void main(void)
{
_DISABLE_COP(); // 关看门狗
InitBusClk();
InitAD();
DDRB=0XFF; // 设PORTB为输出口
PORTB=0x00;
EnableInterrupts; // 开放总中断
for(;;)
{
while(!ATD0STAT2); //等待转换结束,退出循环
{
ad_value0=(byte)ATD0DR0H; //0通道高位数据,下同123通道
ad_value1=(byte)ATD0DR1H;
ad_value2=(byte)ATD0DR2H;
ad_value3=(byte)ATD0DR3H;
ad_value0_1=(byte)ATD0DR0L; //0通道低位数据,下同123通道
ad_value1_1=(byte)ATD0DR1L;
ad_value2_1=(byte)ATD0DR2L;
ad_value3_1=(byte)ATD0DR3L;
}
Delay(200); //延时
PORTB=ad_value0; //B口有LED,就让它来显示结果吧。调试的时候把value的后缀改一下就能分别检测个个通道
}
}
//到此结束
[attach]6282[/attach]
作者:
CCGOGO
时间:
2011-4-2 16:18
学习~
作者:
败类爪爪
时间:
2011-4-20 12:56
回复
1#
yoncos
请问一下,转换完之后为什么要分高低位取出,结果寄存器中的数???
作者:
行走齿轮间
时间:
2011-4-20 20:50
我也有同四楼一样的疑问
作者:
dqgcjude
时间:
2011-4-26 21:08
回复
1#
yoncos
转换完之后为什么要分高低位取出?
作者:
excellentlizhen
时间:
2011-8-25 15:25
kankan
作者:
gaowenzhao123
时间:
2011-10-14 20:21
我都有同样的疑问。。能解答一下吗?
作者:
bloong
时间:
2011-10-18 20:59
8错 呵呵
作者:
ListenHappy
时间:
2011-10-18 21:42
同样疑问!!
作者:
bxsjc
时间:
2011-12-4 17:34
求楼主解释为什么分高低位~
作者:
Messi
时间:
2012-1-22 13:58
不是高低位读取会出错吗?????
作者:
骑单车的日子
时间:
2012-3-13 11:20
寄存器是16位的,定义的变量是8位的,
作者:
木花@任
时间:
2012-3-28 23:15
既然是8位转换精度,又是左对齐,低8位有读的必要吗?
作者:
longmaner
时间:
2012-3-30 16:46
作者:
yyq20104668
时间:
2013-3-19 14:33
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2