打印

片外AD转换的问题

[复制链接]
1545|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
歇斯底里|  楼主 | 2016-8-26 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家有没有用过AD7706 AD7705或者类似的AD芯片,我读取转换的值一直是255,输入变化了还是一样,大家看看我的代码有什么问题,谢谢!(我只用到了AD7706通道1) @dirtwillfly @linqing171 #include "delay.h"
#include "adc.h"
#include "spi.h"
unsigned char ad_val=0;  
//AD7706初始化
//nChannel AD通道的选择

#define AD_DOUT GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)
void AD7706_Reset(void)
{
         uint8_t i;
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);//AD rest脚
   ms_delay(50);
         GPIO_SetBits(GPIOB,GPIO_Pin_1);//rest
         GPIO_SetBits(GPIOA,GPIO_Pin_14);//clk=1
    for(i = 0; i < 40; i++)                //至少32个周期
    {
         GPIO_ResetBits(GPIOA,GPIO_Pin_14); //clk reset
                           __nop();
         __nop();
                           GPIO_SetBits(GPIOB,GPIO_Pin_6);//adin=1
                           __nop();
         __nop();
                           GPIO_SetBits(GPIOA,GPIO_Pin_14); //clk=1
                           __nop();
         __nop();       
    }
                 ms_delay(50);
}
void AD7706_Init(uint8_t nChannel)
{
          AD7706_Reset();
    GPIO_ResetBits(GPIOA,GPIO_Pin_14); //clk reset
          ms_delay(100);
    GPIO_ResetBits(GPIOB,GPIO_Pin_8);//DRDY脚
          GPIO_SetBits(GPIOA,GPIO_Pin_14); //时钟置高
          GPIO_ResetBits(GPIOB,GPIO_Pin_0); //片选置低,AD使能
          __nop();
    __nop();
    __nop();
          if(nChannel == 1)
                //ch=0x00;
          //ch_temp = ch;
          ReadWriteByte(0x20);//ʱÖӼĴæÆ÷
    ReadWriteByte(0x00);//50HZ
    ReadWriteByte(0x10);//Ñ¡ÔñÉèÖüĴæÆ÷
    ReadWriteByte(0x44);//×Ô¶¯Ð£×¼£¬ÔöÒæΪ1
    ms_delay(100);
}       

int32_t ReadAD7706(uint8_t nChannel)//读
{         
         unsigned int i;
         GPIO_ResetBits(GPIOB,GPIO_Pin_8);//DRDY=0
         GPIO_ResetBits(GPIOB,GPIO_Pin_0); //cs=0
         if(nChannel == 1)
         ReadWriteByte(0x38);//¶ÁÈ¡Êý¾Ý¼Ä´æÆ÷
   for(i=0; i<16; i++)
    {
     GPIO_ResetBits(GPIOA,GPIO_Pin_14);
                 ms_delay(100);
     GPIO_SetBits(GPIOA,GPIO_Pin_14);  
                 ms_delay(100);
                ad_val=(ad_val<<1);
                 //ad_val=(ad_val<<1)|(ad_val&0x0001);       
                 GPIO_ResetBits(GPIOA,GPIO_Pin_14);
       __nop();
       __nop();
       __nop();
       if(AD_DOUT)
       {
                                 
                                   GPIO_SetBits(GPIOB,GPIO_Pin_7);  
                                 ad_val|=0x0001;
           // ad_val++;
       }
       else
       {
           __nop();
           __nop();
           __nop();
       }
    GPIO_SetBits(GPIOA,GPIO_Pin_14);
    }
     GPIO_SetBits(GPIOB,GPIO_Pin_0);
    //ad_val=(ad_val&0x0fff);   
                 return ad_val;
                       
}

int16_t ReadWriteByte(uint8_t ch_temp) //写数据
{
           unsigned int i;
           unsigned char hvar;
           GPIO_ResetBits(GPIOB,GPIO_Pin_0); //cs=0
     for(i=0; i<8; i++)
   {  
            GPIO_ResetBits(GPIOB,GPIO_Pin_8);//DRDY
      GPIO_ResetBits(GPIOA,GPIO_Pin_14);//clk=0
       __nop();
       __nop();
       __nop();
                   hvar=ch_temp&0x80;
                   if(hvar)
                                 GPIO_SetBits(GPIOB,GPIO_Pin_6); //ADIN
                         else
                                 GPIO_ResetBits(GPIOB,GPIO_Pin_6);
       //if((ch_temp&0x80)==0x00)
      // GPIO_ResetBits(GPIOB,GPIO_Pin_6); //ͨ¹ý´®Ðз½Ê½ÊäÈëͨµÀÑ¡Ôñ
      // else
      // GPIO_SetBits(GPIOB,GPIO_Pin_6);
         ch_temp<<=1;
     // GPIO_SetBits(GPIOA,GPIO_Pin_14);     //ʱÖÓÖøߣ¬ÔÚÉÏÉýÑØDINʵÏÖ1λÊäÈë
         __nop();
         __nop();
         __nop();
                 }
          //ms_delay(100);
              GPIO_SetBits(GPIOA,GPIO_Pin_14);
                    GPIO_SetBits(GPIOB,GPIO_Pin_6);
                 //return ch_temp;
        }       


相关帖子

沙发
dirtwillfly| | 2016-8-26 14:05 | 只看该作者
光看程序没用的。要看时序。
建议用逻辑分析仪或者示波器观察下时序

使用特权

评论回复
板凳
yichunshan| | 2016-8-26 14:40 | 只看该作者
没有SPI资源了么?用IO模拟累不累啊~~~~~
你不是读取到的转换值是255,而是压根就没读取到,只是因为AD7706的DOUT可能为高电平,所以读回来全是1,另外我不知道你AD是多少位的,但肯定不止8位吧?不能用unsigned char定义ad_va
具体程序没怎么仔细看,不过肯定有问题,比如:
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//DRDY
GPIO_SetBits(GPIOB,GPIO_Pin_7);  
DRDY你咋理解???
DOUT你咋理解???

使用特权

评论回复
地板
歇斯底里|  楼主 | 2016-8-26 14:55 | 只看该作者
yichunshan 发表于 2016-8-26 14:40
没有SPI资源了么?用IO模拟累不累啊~~~~~
你不是读取到的转换值是255,而是压根就没读取到,只是因为AD7706 ...

用的IO模拟的spi.这个AD是16位的  DRDY在写操作的时候置0啊  DOUT不是单片机的输入端吗

使用特权

评论回复
5
yichunshan| | 2016-8-26 15:20 | 只看该作者
歇斯底里 发表于 2016-8-26 14:55
用的IO模拟的spi.这个AD是16位的  DRDY在写操作的时候置0啊  DOUT不是单片机的输入端吗 ...

既然这两个引脚都是单片机输入端,那你对他们的操作是啥意思啊?
你测量DOUT引脚了么?是不是一直为高?
既然AD是16位,为啥用unsigned char定义?

使用特权

评论回复
6
歇斯底里|  楼主 | 2016-8-26 15:43 | 只看该作者
yichunshan 发表于 2016-8-26 15:20
既然这两个引脚都是单片机输入端,那你对他们的操作是啥意思啊?
你测量DOUT引脚了么?是不是一直为高?
...

那就是DOUT不用置高或置低是吧 现在DOUT一直为低Din为高。我把ad_val换成16位的 那DRDY也不用设置吗,现在他一直为高,不是应该在写操作的时候置0吗

使用特权

评论回复
7
yichunshan| | 2016-8-26 15:54 | 只看该作者
歇斯底里 发表于 2016-8-26 15:43
那就是DOUT不用置高或置低是吧 现在DOUT一直为低Din为高。我把ad_val换成16位的 那DRDY也不用设置吗,现 ...

理解错误
DOUT是你采集的端口,是单片机输入,当然不需要置位;
DRDY是AD7706的输出引脚,也是需要你读取的,当数据寄存器里有数据这个管脚会输出低电平,你读取到低说明有数据了;当读取操作完成,它会重新拉高,这是7706操作的

你是不是不理解啥是输入?

使用特权

评论回复
8
歇斯底里|  楼主 | 2016-8-26 16:03 | 只看该作者
7706操作的 意思是DRDY也是不用管的吗 我的这个脚一直为高 是不是我的就是没有数据  可以加你QQ说吗?

使用特权

评论回复
9
yichunshan| | 2016-8-26 16:11 | 只看该作者
歇斯底里 发表于 2016-8-26 16:03
7706操作的 意思是DRDY也是不用管的吗 我的这个脚一直为高 是不是我的就是没有数据  可以加你QQ说吗 ...

我也没用过7706
不过看了你的问题之后我就看了两眼datasheet。
如果你觉得我能帮你看的话,加呗1186231544

使用特权

评论回复
10
robter| | 2016-8-27 09:23 | 只看该作者
接线正确吗?应该有问题

使用特权

评论回复
11
hybdjc| | 2016-9-1 10:12 | 只看该作者
gfhsdfghsdjhgsjsaerhyqrt

使用特权

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

本版积分规则

22

主题

70

帖子

1

粉丝