打印

帮帮忙忙啊 急救:传感器采集信号AD转换

[复制链接]
5351|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengyunfei|  楼主 | 2007-8-7 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我用的是16位的AD7705,把采集的电压信号(4-20mA变成1-5伏电压后)经AD转换后,用单片机控制,在LED上数字显示,显示部分弄好了,就是转换总调不出,哪位用过AD7705吗,好心人帮帮忙啊给个调好的方案啊,再不出不行了
  用别的16位的AD也行,不知道哪位能帮帮忙忙吗,救救我啊

  老板说了,很容易,我做了很长时间了,呜呜呜

相关帖子

沙发
gjg191| | 2007-8-7 15:49 | 只看该作者

dd

兄弟别着急,我都哪次买了假的单片机可把我害苦了.

使用特权

评论回复
板凳
gjg191| | 2007-8-7 15:50 | 只看该作者

dd

你现在主要问提是AD采不出数据吗?那你的1~5v电压信号能得到吗?

使用特权

评论回复
地板
dengyunfei|  楼主 | 2007-8-7 18:10 | 只看该作者

帮帮忙忙啊 急救:传感器采集信号AD转换

信号没问题    我现在是输入个2.5伏的电压试试,AD 部分调不出啊    单片机和LED没问题的   现在就是AD了

使用特权

评论回复
5
zoupeng139| | 2007-8-7 18:36 | 只看该作者

程序问题吧?

在网上搜搜
没有典型应用程序么 ?

使用特权

评论回复
6
dengyunfei|  楼主 | 2007-8-7 18:38 | 只看该作者

帮帮忙忙啊 急救:传感器采集信号AD转换

程序写了 我怕我的不对    不知道谁做过吗  有啥好的方案没  各位大哥大姐 帮帮忙啊  救救急啊

使用特权

评论回复
7
dengyunfei|  楼主 | 2007-8-7 19:06 | 只看该作者

帮帮忙忙啊 急救:传感器采集信号AD转换

呜呜呜

使用特权

评论回复
8
gjg191| | 2007-8-7 21:04 | 只看该作者

dd

把程序弄上来!

使用特权

评论回复
9
li_mu| | 2007-8-7 21:53 | 只看该作者

电路图和程序贴上来

否则不好说

使用特权

评论回复
10
ayb_ice| | 2007-8-8 07:50 | 只看该作者

LED显示能做出,AD应该更简单...

使用特权

评论回复
11
stycx| | 2007-8-8 07:57 | 只看该作者

贴图和程序再说

使用特权

评论回复
12
zhaoyu2005| | 2007-8-8 08:06 | 只看该作者

就是,AD转换好好看datasheet

只要满足要求,很好弄的

使用特权

评论回复
13
dengyunfei|  楼主 | 2007-8-8 14:16 | 只看该作者

帮帮忙忙啊 急救:传感器采集信号AD转换

#include<reg51.h>
#include<intrins.h>

#define AD_CLK_WIDTH 1 /*AD7705串口时钟脉冲宽度*/
unsigned char decimal_number[]={0x30,0xf5,0x58,0xd0,0x95,0x92,0x12,0xf4,0x10,0x90};   //0-9所对应的八段码
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
void Wait7705(unsigned int t) { for( ;t>0 ;t-- ); } 
//void Init_disp();                                                                    // 显示板初始化
void Translate(unsigned int ADdata);                                                   //结果处理函数
void delay();                                                                            //led显示延时函数 

sbit SDA=P0^4;                                                                       //led数据输入                    
sbit CP=P0^5;                                                                        //led移位始终信号                                                                    
sbit P1_6=P1^6;                                                                      //发光二极管,检验单片机工作状态,是否工作正常
sbit ADC_CS=P1^0;                                                                  //定义片选管脚
sbit ADC_RESET=P1^1;                                                              //复位
sbit ADC_CLK=P1^2;                                                                 //时钟对应单片机管脚
sbit ADC_DIN=P1^3;                                                                  //定义数据输入管脚
sbit ADC_DOUT=P1^4;                                                                //定义数据输出管脚
sbit ADC_DRDY=P1^5;                                                                //AD转换结束标志位
                                                                      
                                                                                                                                                                                                                                  

unsigned char data2disp[5]={0x30,0x30,0x30,0x30,0x20};                            //显示数据,4个显示板,各5位,共享



void Write_functionAD(unsigned char wridata)                                     //AD写一个字节函数,初始化AD 
{ unsigned char AD8bit,Token,i;
  ADC_CLK=1; ADC_CS=0;
  Token=0X80; AD8bit=wridata;
  for(i=0;i<8;i++)
  { ADC_CLK=0;
    Wait7705(AD_CLK_WIDTH);
    if(AD8bit&Token)  ADC_DIN=1;                                                //MSB高位数据先移入AD7705
    else              ADC_DIN=0;
    Wait7705(AD_CLK_WIDTH );
    ADC_CLK=1;                                                                   //在SCLK的上升沿,DIN数据有效
    Wait7705(AD_CLK_WIDTH);
    Token=Token>>1;     
  }
ADC_CS=1;
//ADC_CLK=1;ADC_DIN=1;
}

float Read_functionAD()                                                        //AD读函数,读取转换结果
{ unsigned int AD16bit;
  unsigned char i;
 //          while(ADC_DRDY==1){;}
  ADC_CLK=1;
  ADC_CS=0;
  AD16bit=0X00;
  for(i=0;i<16;i++)  
  {  
     AD16bit=AD16bit<<1;
     ADC_CLK=0;  
     Wait7705(AD_CLK_WIDTH);                                                       //在SCL K 的下降沿之后,DOUT数据有效
     if(ADC_DOUT==1)AD16bit=AD16bit|0X01;
     ADC_CLK=1;
     Wait7705(AD_CLK_WIDTH);
   }
  // ADC_CLK=1;ADC_DIN=1;
  return(AD16bit);                                                         //返回AD转换结果
}

void initial_functionAD()                                                 //初始化AD转换芯片
{  
   unsigned char i;
   ADC_CS=0;
   ADC_RESET=0;                                        
   SomeNOP();
   ADC_RESET=1;                                                          //AD复位完成
   //xchannel=channel; 
   ADC_CLK=1;ADC_DIN=1;                                                   //防止接口迷失,通信寄存器返回到等待写状态,DIN为1的时间在32个以上的时钟周期            
   for(i=0;i<40;i++)
   {  ADC_CLK=0;
      ADC_CLK=1;
   }
   Write_functionAD(0x20);                                                //通道1 ,下一个写时钟寄存器
   Write_functionAD(0x06);                                               //写时钟寄存器设置更新速率为250Hz
   Write_functionAD(0x10);                                                // 通道1 ,下一个写设置寄存器
   Write_functionAD(0x44);                                              //写设置寄存器,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
   delay();                                                         //延时
}


void delay()                                                        //发光二极管延时函数
{
      unsigned char i,k,temp;
    for(i=0;i<38;i++)
    for(k=0;k<225;k++)
    for(temp=0;temp<25;temp++);                                          //延时,这里的延时和机器周期关系很大
}

void display(unsigned char datadisplay)                              //8位数LED显示函数
{
  
  unsigned char k,temp;
  temp=datadisplay;
  for(k=8;k>0;k--)
       {
          temp=temp<<1;         
          if(CY) ADC_DOUT=1;          else  ADC_DOUT=0;                //显示              
          ADC_CLK=0;              
          SomeNOP();                                                       //延时
          ADC_CLK=1;
          SomeNOP();
       }
}

void main()
{  unsigned int ADdata;                      //转换后的AD读数结果              
   unsigned char i;
   unsigned int a;
   unsigned char flag_disp;               //显示完成标志位    
   flag_disp=0;                          //显示完成标志
   delay();
    initial_functionAD();                  //初始化AD转换器
   while(1)
     { 
        for(a=0;a<50000;a++);
        P1_6=0;
        for(a=0;a<50000;a++);
        P1_6=1;
        if(ADC_DRDY==0)
          {   Write_functionAD(0X38);         //准备读转换AD结果
              ADdata=Read_functionAD();
                flag_disp=1;
          }                              //ADC_DEDY
         if(flag_disp==1)
         {  flag_disp=0;
            Translate(ADdata);
            for(i=0;i<5;i++)
             { display(data2disp);
          }
         }
     }   //while 1                             
}



void Translate(unsigned int ADdata)                                                  //浮点就过数据处理函数(包括查找自行码)
{ float airpressf;                                                                   //0--350bar,气室AD读数对应的气压值 bar为单位
  unsigned int ADdata2=ADdata;
  unsigned char j,k,b;
  unsigned char i=0;
  unsigned char a[6]={1,2,3,4,5,6};
  unsigned char airpressc,airpressc2,airpressc3;  
  airpressf=(ADdata2/51.0-1)/4.0;          
  airpressc2=airpressc3=airpressc=(unsigned char)airpressf;
  for(k=0;k<6;k++)
  {  a[k]=airpressc3%10;
     if(a[k]!=0){ b=a[k];break;}
     airpressc3/=10;
      k++;
  }
         do
          {
             data2disp=airpressc%10;
            airpressc/=10; //此处处理整数部分
            i++;
         }while(airpressc);    //    至此,整数部分已转换为字符
        switch (i)        //将相应字符移位,
        {
            case 1: 
                data2disp[4]=data2disp[0];
                break;
            case 2:
                data2disp[4]=data2disp[1];
                data2disp[3]=data2disp[0];
                break;
            case 3:
               data2disp[4]=data2disp[2];
               data2disp[3]=data2disp[1];
               data2disp[2]=data2disp[0];
               break;
        }
        airpressf-=airpressc2;//取出小数部分
        j=5-i;
        while(j>0)
            {
            j--;
            airpressf*=10;
            (data2disp[j])=(unsigned char)airpressf;    
            airpressf-=data2disp[j]; 
            }
    data2disp[0]=b;                                                       //防止尾数不稳
    for(j=0;j<5;j++)                                                      //查找字形码
       {   data2disp[j]=decimal_number[data2disp][j]];
       }

         data2disp[5-i]&=0x10;                                              //加上小数点    
}

使用特权

评论回复
14
gjg191| | 2007-8-8 15:01 | 只看该作者

dd

别的不看你写这个寄存器了吗 Communication Register 在datasheet 16页
7705有8个内部寄存器,你是怎么写的,我看了半天你就没按datasheet上的方法去做,能初始化才怪.

使用特权

评论回复
15
udbit18| | 2007-8-8 15:15 | 只看该作者

呵呵

使用特权

评论回复
16
gjg191| | 2007-8-8 15:21 | 只看该作者

dd

笑什么??

使用特权

评论回复
17
dengyunfei|  楼主 | 2007-8-8 15:39 | 只看该作者

帮帮忙忙啊 急救:传感器采集信号AD转换

  Communication Register   是通信寄存器吧 初始化的第一行和第三行   是吗 

请指正我的错误  万分的感谢   给点希望了

使用特权

评论回复
18
dengyunfei|  楼主 | 2007-8-8 15:42 | 只看该作者

帮帮忙忙啊 急救:传感器采集信号AD转

真的   我是个新手   都绝望了  帮帮忙  好人

使用特权

评论回复
19
gjg191| | 2007-8-8 15:49 | 只看该作者

dd

刚刚没看到注释,不好意思,你看datasheet 33页有个程序流程你按这个写试试

使用特权

评论回复
20
dengyunfei|  楼主 | 2007-8-8 15:51 | 只看该作者

帮帮忙忙啊 急救:传感器采集信号AD转换

有谁用过AD7705   给点意见啊  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

31

帖子

1

粉丝