智能车制作

标题: 跪求解决xs128的AD问题 [打印本页]

作者: mengmengmeng    时间: 2015-3-27 13:34
标题: 跪求解决xs128的AD问题
AD转换问题困扰了我三天了。我用xs128的内置ad端口,输出到PA口的LCD1602.单片机自带AD测试端口。硬件操作是用短接帽把1,9两口短接,用计算机给芯片供电。也测试过ad端口和地之间有电压。
但是软件中while(!ATD0STAT2L_CCF0);会死在里面。永远到不了后面的LCD输出。若用字符串输出,在第四位后还会继续输出p1中的元素。用单个字符输出可以将输出的东西控制在前四位,但是改变电阻值没有效果。
跪求大神帮忙解决。


AD端口的电路图:
[attach]75524[/attach]


程序是:
/****************显示单个字符函数*******************************************/
void Display_char(unsigned char x,unsigned char y,unsigned char data)
{
y&=0x01;
x&=0x0f;//限制x不能大于15,y不能大于1
//设置光标位置
if(y==1)
x+=0x40;
x+=0x80;
LCD_WriteCommand(x);
//显示单个字符
LCD_WriteData(data);
}
/****************显示字符串函数*******************************************/
void Display_string(unsigned char x,unsigned char y,unsigned char *s)
{
y&=0x01;
x&=0x0f;//限制x不能大于15,y不能大于1
//设置光标位置
if(y==1)
x+=0x40;
x+=0x80;
LCD_WriteCommand(x);
//显示字符串
while(*s)
{
  LCD_WriteData(*s);
  s++;
}
}

/****************AD初始化*******************************************/
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  禁止数字输入}
}
void InitPLL()
{
  CLKSEL_PLLSEL = 0;
  PLLCTL_PLLON = 1;
  SYNR = 0xc0|0x09;      //总线频率是80MHZ   
  REFDV = 0x80|0x01;     //                  
  POSTDIV = 0;
  PLLCTL_PLLON = 1;  
  _asm(nop);
  _asm(nop);
  while(!(CRGFLG_LOCK==1))
   {
    ;
   }
  CLKSEL_PLLSEL =1  // 超频至80M

/****************AD转换*******************************************/
//-----读取AD转换结果--------//
void AD_GetValue(word *AD_wValue)
{
  *AD_wValue=ATD0DR0;  //读取结果寄存器的值
}


/*****液晶显示函数*********************************************************/
void main(void)
{

  uchar b,c=0;
  uchar k[4];
  unsigned char p1[]="Current Temp is:"  ;
  LCD_RW=0;
  Init_PLL();
  IO_Init();
  LCD_Init();
  EnableInterrupts;
  PORTA_PA7=~PORTA_PA7;
for(;;)
{

Display_string(0,0,p1);
while(!ATD0STAT2L_CCF0);{; } // 等待转换结束while(ATDOSTAT2_CCF0==1)
          AD_GetValue(&AD_wValue);   // 读取转换结果
       b=b*2;
       c=b/100;
       k[0]=KeyTable[c];
       b=b-b/100*100;
       c=b/10;
       k[1]=KeyTable[c];
       c=b-b/10*10;
       k[2]='.';  
     k[3]=KeyTable[c];
  //  Display_string(0,1,k);
  Display_char(0,1,k[0]);
  Display_char(1,1,k[1]);
   Display_char(2,1,k[2]);
   Display_char(3,1,k[3]);

   Display_char(5,1,0xdf);              
   Display_char(6,1,'C');
   Delay_ms(5000);

}
}



作者: 空有一人    时间: 2015-3-27 13:42
ATD0CTL0?
作者: mengmengmeng    时间: 2015-3-27 13:45
空有一人 发表于 2015-3-27 13:42
ATD0CTL0?

这里有什么问题吗?

作者: 空有一人    时间: 2015-3-27 13:47
mengmengmeng 发表于 2015-3-27 13:45
这里有什么问题吗?

你并没有配置,还有锁相环也要先配,多试试。
再换换ad口试试,等等。

作者: 空有一人    时间: 2015-3-27 13:48
ATD0CTL5=。。。。
  ATD0DIEN=。。。
ad5放在最后写吧,ad5写完ad转换就开始了。
作者: mengmengmeng    时间: 2015-3-27 13:51
空有一人 发表于 2015-3-27 13:47
你并没有配置,还有锁相环也要先配,多试试。
再换换ad口试试,等等。

第一次写ad,不太懂呢。什么地方没有配置。还有锁相环配置的位置要放在最前面是这个意思吗?

作者: 空有一人    时间: 2015-3-27 13:53
mengmengmeng 发表于 2015-3-27 13:51
第一次写ad,不太懂呢。什么地方没有配置。还有锁相环配置的位置要放在最前面是这个意思吗?

锁相环是基础,最先配好最好,前面程序模块少,没什么影响。ad、pwm等一加上,不先配好锁相环,程序就跑不成啦。

作者: mengmengmeng    时间: 2015-3-27 14:01
空有一人 发表于 2015-3-27 13:53
锁相环是基础,最先配好最好,前面程序模块少,没什么影响。ad、pwm等一加上,不先配好锁相环,程序就跑不 ...

恩恩~虽然放在前面我也换了端口了。。。还是无法输出。但是还是谢谢啦

作者: 空有一人    时间: 2015-3-27 18:09
mengmengmeng 发表于 2015-3-27 14:01
恩恩~虽然放在前面我也换了端口了。。。还是无法输出。但是还是谢谢啦

额,楼主加油。

作者: ychj    时间: 2015-3-27 20:10
main函数里没有调用AD_Init()?




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