智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1638|回复: 3
打印 上一主题 下一主题

串口调试助手接收AD采集数据一直都是000

[复制链接]

21

主题

196

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
2080
威望
1012
贡献
600
兑换币
642
注册时间
2014-12-6
在线时间
234 小时
毕业学校
华南农业大学
跳转到指定楼层
1#
发表于 2015-3-20 17:44:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,串口程序是没有问题的,测试过了的,
没有接上运放串口显示的也是000,用了好几个AD程序的例程,都没有用,接收的还是000:'(
运放是没有问题的,电压变化很灵敏。
到底是为什么啊!!!!!!!!!!!!!!!!!!程序是哪里有问题啊!!!!!!!!!!!!
回复

使用道具 举报

21

主题

196

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
2080
威望
1012
贡献
600
兑换币
642
注册时间
2014-12-6
在线时间
234 小时
毕业学校
华南农业大学
2#
 楼主| 发表于 2015-3-20 17:45:04 | 只看该作者
贴上程序::::

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

#define LEDCPU PORTE_PE4
#define LEDCPU_dir DDRE_DDRE4
#define LED_ON 0
#define LED_OFF 1
#define BUS_CLOCK                   32000000           //总线频率
#define QSC_CLOCK                   16000000           //晶振频率
#define BAUD 9600

unsigned char data_receive;
unsigned int AD,i,AD_data0,AD_data1,AD_data2,AD_data3,a;//存储AD转换的结果

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif

    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}


/*************************************************************/
/*                        初始化SCI                          */
/*************************************************************/
void INIT_SCI(void)
{
  SCI0BD = BUS_CLOCK/16/BAUD;   //设置SCI0波特率为9600
  SCI0CR1 = 0x00;        //设置SCI0为正常模式,八位数据位,无奇偶校验
  SCI0CR2 = 0x0c;        //允许接收和发送数据,禁止中断功能
}

/*************************************************************/
/*                       串口发送函数                        */
/*************************************************************/
void SCI_send(unsigned int data)
{
  while(!SCI0SR1_TDRE);         //等待发送数据寄存器(缓冲器)为空
  SCI0DRL = data;
}


/*************************************************************/
/*                       串口接收函数                        */
/*************************************************************/
unsigned char SCI_receive(void)
{
  while(!SCI0SR1_RDRF);          //等待发送数据寄存器满
  return(SCI0DRL);
}


/********AD初始化******************/
/*void AD_Init(void)
{
    ATD0DIEN=0X00;//禁止数字输入功能
    ATD0CTL1=0X20;//分辨率8位,采样前不放电
    ATD0CTL2=0X40;//快速清零,禁止外部触发,禁止中断
    ATD0CTL3=0XA0;//转换结果右对齐,序列长度为4,NO FIFO
    ATD0CTL4=0X0B;//采样时间4个周期,PRS=3
    ATD0CTL5=0X30;//从通道0开始多通道连续采样,同时启动转换序列
}     */

/**********AD转换的值**************/

/*unsigned int AD_GetValue(int ch)
{
  while(!ATD0STAT0_SCF)
  switch (ch)
  {
    default:
    case 0:   AD=ATD0DR0;
              break;
    case 1:   AD=ATD0DR1;
              break;
    case 2:   AD=ATD0DR2;
              break;
    case 3:   AD=ATD0DR3;
              break;
  }
  return AD;   
}
      */
/*********发送电感的值*******************/
/*void PC(void)
{   
    AD_data0=AD_GetValue(0);
    AD_data1=AD_GetValue(1);
    AD_data2=AD_GetValue(2);
    AD_data3=AD_GetValue(3);
/*    SCI_send(AD_data0);
    SCI_send(AD_data1);
    SCI_send(AD_data2);
    SCI_send(AD_data3);     */
//}  

//*****************************************************************************
//功  能:AD初始化设置
//说  明:多通道转换,16路AD,从AD0开始,8位精度,数据右对齐,禁止中断使能,
//            采样前放电,快速自动清零
//*****************************************************************************
void InitATD(void)
{   
    // ATD0CTL0 = 0X05;                 //转换到A5就在从A0开始
     ATD0CTL0 = 0X03;                   //转换到A3就在从A0开始
                                       
    ATD0CTL1 = 0X20;                   //设置转换精度、外部触发方式选择位;10位精度
    /*
       0   ATD0CTL1_ETRIGCH0 = 0;      //外部触发源选择位,下同   
       1   ATD0CTL1_ETRIGCH1 = 0;         
       2   ATD0CTL1_ETRIGCH2 = 0;         
       3   ATD0CTL1_ETRIGCH3 = 0;        
       4   ATD0CTL1_SMP_DIS  = 0;      //采样前bu放电   
       5*  ATD0CTL1_SRES0 = 1;         //SRES[1:0] = 00, AD Resolution = 8;  SRES[1:0] = 01, AD Resolution = 10  
       6*  ATD0CTL1_SRES1 = 0;         //SRES[1:0] = 10  AD Resolution = 12  SRES[1:0] = 11, AD Resolution = 保留
       7*  ATD0CTL1_ETRIGSEL = 0;      //外部触发源选择位
    */      
     
    ATD0CTL2 = 0X60;                //中断、外部触发方式、内部时钟(停止模式);快速自动清零?

//   ATD0CTL3 = 0xb0;               //转换序列长度6
     ATD0CTL3 = 0xA0;   
     
    ATD0CTL4 = 0x07;                   //设置AD转换频率、第二阶段采样时间
                                                   //假设 4MHZ A/D 时钟频率转换时间 =
                                             //Initial Sample Time 初始化+ 采样时间Programmed
                                             // Sample Time + 分辨率时间Resolution Period
                                                   //= 2 + 4 + 10 = 16A/D Clocks
                                                  //= 4uS
    ATD0CTL5 = 0X30;             //多通道连续转换,A0起始

    ATD0DIEN = 0X00;                   //禁止数字输入
                          
}


//读取AD采集回来的值
uint Get_AD(uchar ch)
{
   // uint ad;
    while(!(ATD0STAT0 & (1 << 7)) );
    switch (ch)
    {   
        case 0:  a = ATD0DR0;  break;
       // case 1:  ad = ATD0DR1;  break;
       // case 2:  ad = ATD0DR2;  break;
      //  case 3:  ad = ATD0DR3;  break;
     //   default: break;
    }
   
    return a;
}

/*************串口发送AD值*****************************/
void convert_ad(unsigned int ad)
{
        unsigned int a,b,c;
        a=ad/100;
        SCI_send(a+48);
        b=ad%100;
        b=b/10;
        SCI_send(b+48);
        c=ad%10;
        SCI_send(c+48);
        SCI_send(' ');
}

/*************************************************************/
/*                         主函数                            */
/*************************************************************/
void main(void)
{
  DisableInterrupts;
  INIT_PLL();
  //AD_Init();
  InitATD();
  LEDCPU_dir = 1;
  INIT_SCI();
  EnableInterrupts;
  LEDCPU=LED_ON;

  for(;;)
  {
    data_receive = SCI_receive();
    if(data_receive == 'O')
    {
      SCI_send('Y');
      LEDCPU = LED_ON;
    }
    if(data_receive == 'C')
    {                  
       convert_ad(a);   //直接用函数发送AD值
     //convert_ad(900);
    //  PC();
      LEDCPU = LED_OFF;
    }
  }
}
回复 支持 反对

使用道具 举报

21

主题

196

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
2080
威望
1012
贡献
600
兑换币
642
注册时间
2014-12-6
在线时间
234 小时
毕业学校
华南农业大学
3#
 楼主| 发表于 2015-3-22 17:22:47 | 只看该作者
:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
118
威望
64
贡献
34
兑换币
38
注册时间
2015-11-25
在线时间
10 小时
毕业学校
合肥工业大学
4#
发表于 2016-4-6 10:38:41 | 只看该作者
楼主问题解决了吗,是不是ad采集不对?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 00:23 , Processed in 0.044439 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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