中级会员
- 积分
- 233
- 威望
- 193
- 贡献
- 26
- 兑换币
- 0
- 注册时间
- 2010-10-24
- 在线时间
- 7 小时
|
程序如下
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
word AD_value[9];//AD转换结果
//--------------初始化函数----------------//
//-----时钟初始化程序--------//
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{ //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1; //总线时钟=48/2=24MHz
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x80;
}
//-----ATD初始化程序--------//
void AD_Init(void)
{
ATD0DIEN=0x00; //禁止数字输入
ATD0CTL1=0x00; //选择AD通道为外部触发,8位精度,采样前不放电
ATD0CTL2=0x40; //标志位自动清零,禁止外部触发, 禁止中断
ATD0CTL3=0xc4; //右对齐无符号,每次转换9个序列, FIFO模式
ATD0CTL4=0x01; //采样时间为4个AD时钟周期,PRS=1,ATDClock=6MHz
ATD0CTL5=0x30; //特殊通道禁止,连续转换 ,多通道转换,起始通道为0转换9个通道
}
//-----读取AD转换结果--------//
void AD_Getvalue(word *AD_value)
{
while(!ATD0STAT0_SCF); //等待ATD0模块转换结束
asm ("nop");
asm ("nop");
asm ("nop");
AD_value[0]=ATD0DR0; //
AD_value[1]=ATD0DR1;
AD_value[2]=ATD0DR2;
AD_value[3]=ATD0DR3;
AD_value[4]=ATD0DR4;
AD_value[5]=ATD0DR5;
AD_value[6]=ATD0DR6;
AD_value[7]=ATD0DR7;
AD_value[8]=ATD0DR8;
}
//-----主函数--------//
void main(void)
{
PLL_Init();
AD_Init();
DDRB=0xFF;
PORTB=0x00;
AD_value[0]=0;
AD_value[1]=0;
AD_value[2]=0;
AD_value[3]=0;
AD_value[4]=0;
AD_value[5]=0;
AD_value[6]=0;
AD_value[7]=0;
AD_value[8]=0;
AD_Getvalue(AD_value); // 读取转换结果
PORTB = (byte)AD_value[0]; //用PORT B来显示AD0的值
}
9个传感器输出接单片机AD0到8,旁边的参考电压接的5V。实验效果正确,数据不正确。效果就是离得最近的传感器数值最大,可是数值不稳定,跨度都能从几十到二百多变化。比如,第一次运行程序,数据如下,55 67 72 91 109 97 89 70 61 结束再运行一次,结果就可能变成178 198 207 217 230 221 208 190 181.到底为什么啊!!在示波器里看波形很稳定,离得最近的传感器有1.2V,按理说8位精度,5V对应255,1.2V也就只是50多才对啊。哪位好心的大侠帮帮我! |
|