AD7606调试过程与源码

2023-10-27

公司有一个项目用到了AD7606,控制器用的STM32,使用的模式是并行16位模式,程序刷好之后发现读取的AD数据乱码,结果发现是因为AD7606的接地不对,当然这个问题是我师傅找出来的,查找的过程如下:
用示波器看了BUSY线,转换线等各种线的波形,目的是确定芯片是否正常工作。
师傅又测量了V1通道两端的波形,在没有给输入的情况下发现存在波形。
后面师傅又去看了下手册,发现V1通道需要接AGND,基准电压接地脚同样要接AGND,但是在电路中,V1与V8通道与基准电压接地脚的地线都分开了,通道接到了24V地,基准接到了3V3,所以导致读取的数据乱码。
原因就是地线分开了。

#include "delay.h"     //.C文件
#include "ad7606.h"
#include "dac.h"

void AD7606_reset(void);
void AD7606_startConv(void);
u16 AD7606_readFirstData(void);

/************************************************
函数名称 : AD7606_config
功    能 : 初始化AD7606引脚
参    数 : 无
返 回 值 : 无
*************************************************/
void AD7606_config(void)
{
    GPIO_InitTypeDef GPIO_initStructure;
    
    RCC_APB2PeriphClockCmd(AD7606_PORT_RCC,ENABLE);  		//开启AD7606引脚时钟
    
    GPIO_initStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		//16位数据端输入
    GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_initStructure.GPIO_Pin = AD7606_DATA_PORT;
    
    GPIO_Init(AD7606_DATA_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_FRST_PORT;     //FRST引脚配置,浮空输入
    GPIO_Init(AD7606_FRST_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_BUSY_PORT;	//BUSY引脚,浮空输入
    GPIO_Init(AD7606_BUSY_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出方式
    
    GPIO_initStructure.GPIO_Pin = AD7606_RANGE_PORT;    //RANGE配置
    GPIO_Init(AD7606_RANGE_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_OS0_PORT;    //过采样引脚配置
    GPIO_Init(AD7606_OS0_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_OS1_PORT;
    GPIO_Init(AD7606_OS1_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_OS2_PORT;
    GPIO_Init(AD7606_OS2_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_CONAB_PORT;   //转换配置
    GPIO_Init(AD7606_CONAB_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_RST_PORT;    //复位
    GPIO_Init(AD7606_RST_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_RD_PORT;    //RD
    GPIO_Init(AD7606_RD_GPIOx,&GPIO_initStructure);
    
    GPIO_initStructure.GPIO_Pin = AD7606_CS_PORT;    //CS
    GPIO_Init(AD7606_CS_GPIOx,&GPIO_initStructure);
    
    AD7606_RANGE_10V();
    AD7606_CS_HIGH();
    AD7606_RST_LOW();
    AD7606_RD_HIGH();
    AD7606_CONAB_HIGH();
    
    AD7606_SampleRate(AD7606_SAMPLE_200K);
}

/**
 @brief 设置AD7606采样频率
 @param -sampleRate-   AD7606_SAMPLE_200K: 采样频率200kHz \n
                       AD7606_SAMPLE_100K: 采样频率100kHz \n
                       AD7606_SAMPLE_50K:  采样频率50kHz \n
                       AD7606_SAMPLE_25K:  采样频率25kHz \n
                       AD7606_SAMPLE_12K5: 采样频率12.5kHz \n
                       AD7606_SAMPLE_6K25: 采样频率6.25kHz \n
                       AD7606_SAMPLE_3K125:采样频率3.125kHz \n
*/
void AD7606_SampleRate(u8 sampleRate)
{
    switch(sampleRate)
    {
        case AD7606_SAMPLE_200K:	//采样频率200kHz
            AD7606_OS0_LOW();
            AD7606_OS1_LOW();
            AD7606_OS2_LOW();
        break;
        
        case AD7606_SAMPLE_100K:	//采样频率100kHz
            AD7606_OS0_HIGH();
            AD7606_OS1_LOW();
            AD7606_OS2_LOW();
        break;
        
        case AD7606_SAMPLE_50K:	//采样频率50kHz
            AD7606_OS0_LOW();
            AD7606_OS1_HIGH();
            AD7606_OS2_LOW();
        break;
        
        case AD7606_SAMPLE_25K:	//采样频率25kHz
            AD7606_OS0_HIGH();
            AD7606_OS1_HIGH();
            AD7606_OS2_LOW();
        break;
        
        case AD7606_SAMPLE_12K5:	//采样频率12.5kHz
            AD7606_OS0_LOW();
            AD7606_OS1_LOW();
            AD7606_OS2_HIGH();
        break;
        
        case AD7606_SAMPLE_6K25:	//采样频率6.25kHz
            AD7606_OS0_HIGH();
            AD7606_OS1_LOW();
            AD7606_OS2_HIGH();
        break;
        
        case AD7606_SAMPLE_3K125:	//采样频率3.125kHz
            AD7606_OS0_LOW();
            AD7606_OS1_HIGH();
            AD7606_OS2_HIGH();
        break;
        
        default:
            AD7606_OS0_LOW();	//采样频率200kHz
            AD7606_OS1_LOW();
            AD7606_OS2_LOW();
        break;
    }
}

/**
 @brief AD7606读取转换值
 @param -data- 8个16位元素的数组,用来存储8通道转换值。参数为数组首地址。
 @return 0: 转换成功 \n
        其他值: 转换失败
 @warning data数组的长度必须大于等于8
*/
u8 AD7606_readConversionValue(u16 *data)
{
    u8 i;
    u16 counter;
		static uint8_t a=1;
    GPIO_InitTypeDef GPIO_initStructure;
    
    GPIO_initStructure.GPIO_Mode = GPIO_Mode_IPU;  //AD7606数据输出端引脚配置,上拉输入模式
    GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_initStructure.GPIO_Pin = AD7606_DATA_PORT;
    
    GPIO_Init(AD7606_DATA_GPIOx,&GPIO_initStructure);
    
    AD7606_CS_RD_HIGH();   //CS\RD引脚配置为高电平
    if(a==1)
		{
			a=0;
      AD7606_reset();     //复位信号
    }
    i = AD7606_BUSY_STATE();    //判断BUSY
    
    AD7606_startConv();    //转换信号
    
    counter = 0;
    i = AD7606_BUSY_STATE();   //判断BUSY
    while(i)
    {
        i = AD7606_BUSY_STATE();   //判断BUSY
        //delay_us(0);
        counter ++;
        if(counter > 50000)    //判断超时
            return 1;
    }
    
    AD7606_CS_LOW();    //CS拉低
    
    i = AD7606_FRST_STATE();    //判断FRST
    AD7606_RD_HIGH();     //RD下降沿,V1通道开始转换
		delay_us(1);
    AD7606_RD_LOW();
    
    delay_us(2);
    
    counter = 0;
    i = AD7606_FRST_STATE();    //判断FRST
    while(!i)
    {
        //delay_us(1);
        i = AD7606_FRST_STATE();     //判断FRST
        counter ++;
        if(counter > 50000)   //判断超时
            return 2;
    }
    
    data[0] = AD7606_READ_DATA();     //V1通道数据传入data中
    
    AD7606_RD_HIGH();      //---------AD7606_RD_HIGH
    
    for(i=1;i<=7;i++)
    {
        delay_us(2);
        AD7606_RD_LOW();    //RD下降沿数据转换完

        delay_us(2);
        data[i] = AD7606_READ_DATA();   //读取数据
        //data[i] = ((data[i] & 0xff) << 8) + (data[i] >> 8);

//        data[i] = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_15)  |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_14) << 1 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13) << 2 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_12) << 3 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) << 4 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_10) << 5 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9) << 6 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8) << 7 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7) << 8 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6) << 9 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5) << 10 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4) << 11 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3) << 12 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2) << 13 |
//              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1) << 14 |
//                GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0) << 15;

        delay_us(2);
        AD7606_RD_HIGH();    //--------
    }
    
    AD7606_CS_HIGH();
    AD7606_CONAB_HIGH();     //用于判定
    return 0;
}
/************************************************
函数名称 : AD7606_reset
功    能 : 复位AD7606
参    数 : 无
返 回 值 : 无
*************************************************/
void AD7606_reset(void)
{
    AD7606_RST_HIGH();
    delay_us(1);
    AD7606_RST_LOW();
    delay_us(1);
}
/************************************************
函数名称 : AD7606_startConv
功    能 : 转换信号
参    数 : 无
返 回 值 : 无
*************************************************/
void AD7606_startConv(void)
{
	  AD7606_CONAB_HIGH();
	  delay_us (2);
    AD7606_CONAB_LOW();
    delay_us(2);
    AD7606_CONAB_HIGH();
    //delay_us(1);
}

#ifndef _AD7606_H_
#define _AD7606_H_

#include "stm32f10x.h"

#define     AD7606_PORT_RCC     RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB     //时钟引脚
#define     AD7606_DATA_GPIOx   GPIOD     //数据引脚
#define     AD7606_DATA_PORT    GPIO_Pin_All

#define     AD7606_FRST_GPIOx   GPIOB     //FRST
#define     AD7606_FRST_PORT    GPIO_Pin_3

#define     AD7606_BUSY_GPIOx   GPIOB     //BUSY
#define     AD7606_BUSY_PORT    GPIO_Pin_4

#define     AD7606_RANGE_GPIOx  GPIOB     //RANGE
#define     AD7606_RANGE_PORT   GPIO_Pin_8

#define     AD7606_OS0_GPIOx    GPIOB      //OS0
#define     AD7606_OS0_PORT     GPIO_Pin_2

#define     AD7606_OS1_GPIOx    GPIOB      //OS1
#define     AD7606_OS1_PORT     GPIO_Pin_1

#define     AD7606_OS2_GPIOx    GPIOB      //OS2
#define     AD7606_OS2_PORT     GPIO_Pin_0

#define     AD7606_CONAB_GPIOx  GPIOB        //CONAB
#define     AD7606_CONAB_PORT   GPIO_Pin_9

#define     AD7606_RST_GPIOx    GPIOB      //RST
#define     AD7606_RST_PORT     GPIO_Pin_7

#define     AD7606_RD_GPIOx     GPIOB     //RD
#define     AD7606_RD_PORT      GPIO_Pin_6

#define     AD7606_CS_GPIOx     GPIOB     //CS
#define     AD7606_CS_PORT      GPIO_Pin_5

#define     AD7606_CS_HIGH()        GPIO_SetBits(AD7606_CS_GPIOx,AD7606_CS_PORT)    //CS高电平
#define     AD7606_CS_LOW()         GPIO_ResetBits(AD7606_CS_GPIOx,AD7606_CS_PORT)   //CS低电平                           

#define     AD7606_RST_HIGH()       GPIO_SetBits(AD7606_RST_GPIOx,AD7606_RST_PORT)    //RST高
#define     AD7606_RST_LOW()        GPIO_ResetBits(AD7606_RST_GPIOx,AD7606_RST_PORT)   //RST低

#define     AD7606_RD_HIGH()        GPIO_SetBits(AD7606_RD_GPIOx,AD7606_RD_PORT)
#define     AD7606_RD_LOW()         GPIO_ResetBits(AD7606_RD_GPIOx,AD7606_RD_PORT)

#define     AD7606_RANGE_10V()      GPIO_SetBits(AD7606_RANGE_GPIOx,AD7606_RANGE_PORT)    //范围正负10
#define     AD7606_RANGE_5V()       GPIO_ResetBits(AD7606_RANGE_GPIOx,AD7606_RANGE_PORT)   //5V
            /*******转换信号*****************************************/
#define     AD7606_START_CONV()     do{GPIO_SetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT);\
                                        GPIO_ResetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT);\
                                        delay_us(1);\
                                        GPIO_SetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT);}while(0)

#define     AD7606_OS0_HIGH()       GPIO_SetBits(AD7606_OS0_GPIOx,AD7606_OS0_PORT)   //过采样
#define     AD7606_OS0_LOW()        GPIO_ResetBits(AD7606_OS0_GPIOx,AD7606_OS0_PORT)

#define     AD7606_OS1_HIGH()       GPIO_SetBits(AD7606_OS1_GPIOx,AD7606_OS1_PORT)
#define     AD7606_OS1_LOW()        GPIO_ResetBits(AD7606_OS1_GPIOx,AD7606_OS1_PORT)

#define     AD7606_OS2_HIGH()       GPIO_SetBits(AD7606_OS2_GPIOx,AD7606_OS2_PORT)
#define     AD7606_OS2_LOW()        GPIO_ResetBits(AD7606_OS2_GPIOx,AD7606_OS2_PORT)

#define     AD7606_CONAB_HIGH()     GPIO_SetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT)    //转换
#define     AD7606_CONAB_LOW()      GPIO_ResetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT)

#define     AD7606_READ_DATA()      GPIO_ReadInputData(AD7606_DATA_GPIOx)

#define     AD7606_BUSY_STATE()     GPIO_ReadInputDataBit(AD7606_BUSY_GPIOx,AD7606_BUSY_PORT)
#define     AD7606_FRST_STATE()     GPIO_ReadInputDataBit(AD7606_FRST_GPIOx,AD7606_FRST_PORT)

#define     AD7606_CS_RD_LOW()      AD7606_CS_LOW();AD7606_RD_LOW()
#define     AD7606_CS_RD_HIGH()      AD7606_CS_HIGH();AD7606_RD_HIGH()
                                      

#define     AD7606_SAMPLE_200K      0    //过采样200K
#define     AD7606_SAMPLE_100K      1    //过采样100K
#define     AD7606_SAMPLE_50K       2    //过采样50K
#define     AD7606_SAMPLE_25K       3    //过采样25K
#define     AD7606_SAMPLE_12K5      4    //过采样12.5K
#define     AD7606_SAMPLE_6K25      5    //过采样6.25K
#define     AD7606_SAMPLE_3K125     6    //过采样3.125K

#define     AD7606_VOLT_0V5         1638
#define     AD7606_VOLT_3V3         10813
#define     AD7606_VOLT_3V5         11469


void AD7606_config(void);    //AD7606初始化
void AD7606_SampleRate(u8 sampleRate);   
u8 AD7606_readConversionValue(u16 *data);   //数据读取函数

#define     AD7606_1LSB_VOLT        0.00030518   //最小精度

#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AD7606调试过程与源码 的相关文章

  • ACN总结报告

    ACM总结报告 关于学到的知识 先暂且留一下 先说说这学期的情况 还记得 刚开始时选择这门选修课 除了听说它对于我们计算机专业的来说很有用之外 就是听说它很难 想要挑战一下自我而已 想想 现在不由自主的想要笑起来 说实在的 对于这门选修课
  • Flamingo插件_Contact Form 7表单数据存储插件

    Flamingo插件是一款用来帮助 Contact Form 7表单数据存储的插件 因为Contact Form 7插件本身没有数据存储功能 默认把前台访客提交的表单数据提交到设置好的接收邮箱 如果邮件服务器出现问题 配置错误就可能会永远丢
  • 第一课:一文读懂马尔科夫过程

    1 马尔科夫决策过程 MDPs 简介 马尔科夫决策过程是对强化学习 RL 问题的数学描述 几乎所有的RL问题都能通过MDPs来描述 最优控制问题可以用MDPs来描述 部分观测环境可以转化成POMDPs 赌博机问题是只有一个状态的MDPs 注

随机推荐

  • 查看LINUX放开端口,Linux下防火墙开启相关端口及查看已开启端口

    Linux下防火墙开启相关端口及查看已开启端口 1 默认情况下Linux的防火墙都是在关闭状态下的 root test etc service iptables status Firewall is stopped root test et
  • 新建Springboot项目默认test包下的测试类报错缺少org.junit.jupiter.api

    在springboot项目中碰到一个问题 记录一下 新建了一个普通的Maven项目A 其pom xml继承parent为
  • 电脑怎么恢复已删除的数据?

    恢复已经删除的数据取决于多种因素 包括删除的方式 存储设备的类型以及是否有备份等 以下是一些常见的方法 但不能保证所有情况下都能成功恢复数据 在尝试恢复数据之前 请确保不会进一步覆盖原始数据 以提高恢复成功的机会 回收站 如果你删除的是电脑
  • mysql数据去重并排序使用distinct 和 order by 的问题

    比如直接使用 SELECT distinct mobileFROM table aWHERE code 123ORDER BY a ime desc 在本地mysql数据库没有错 在线上的数据库就会报如下错 估计是版本的问题 Express
  • 典型的贪心算法~ (田忌赛马 )

    1 田忌赛马 典型的贪心算法 自己木有考虑到贪心的第二步导致wa了好多次 算法分析 Problem Description 给出2N组数据 分别表示田忌和齐威王的N匹马的速度 没进行一场比赛 每组数据共N场场赛 若能分出胜负 则输的一方要给
  • DVWA之SQL注入

    一 DVWA介绍 1 1 DVWA简介 DVWA是一款基于PHP和MYSQL开发的web靶场练习平台 集成了常见的web漏洞如sql注入 XSS 密码破解等常见漏洞 旨在为安全专业人员测试自己的专业技能和工具提供合法的环境 帮助web开发者
  • 七牛云上传图片,只需十分钟搞定

    1 去七牛云注册 建好自有空间 2 导入依赖
  • Sonar常见问题解决方案

    阻断 1 Close this FileInputStream in a finally clause 在finally中关闭FileInputStream 这个最为常见 主要是关闭方式不对 finally代码块中 应该要对每个stream
  • FCGI

    fcgi作为客户端需要注意的几点 http blog csdn net cleanfield article details 6699952 fcgi作为中间层 需要与后端server通信进行数据处理 这里需要注意一下几点 1 要做好超时处
  • 日历插件可选择_Obsidian——推荐插件

    Obsidian 推荐插件 工具 Obsidian 官方插件 关系图谱 页面预览 预览模式中 鼠标悬浮于一个内链时 显示小窗预览 编辑模式中 鼠标悬浮于链接上的同时按住 Ctrl Cmd 也会显示预览小窗 快速切换 Ctrl Cmd O 在
  • 开山之作,简单说说什么是"集群(Cluster)"

    一 什么是集群 集群 Cluster 是由两台或多台节点机 服务器 构成的一种松散耦合的计算节点集合 为用户提 供网络服务或应用程序 包括数据库 Web服务和文件服务等 的单一客户视图 同时提供接近容错机的故 障恢复能力 集群系统一般通过两
  • AndroidStudio项目打包成library以及jar包、aar包流程

    引言 一般项目做多了后 码农们都会整理出一系列的工具类来 为了方便在后面项目中使用 打包成library或者jar aar包供项目使用是比较好的方式 1 library方式 library方式是比较简单的方式 一般新建完一个项目的时候 点击
  • mysql意向锁的概念和用途

    锁的粒度 A 表锁 Table Lock 对整个表加锁 影响标准的所有记录 通常用在DDL语句中 如DELETE TABLE ALTER TABLE等 B 行锁 Row Lock 对一行记录加锁 只影响一条记录 通常用在DML语句中 如IN
  • Visio如何插入公式、MathTape安装

    遇到的问题 在写论文过程中发现Visio没有插入公式的选项 而从word中复制过来邮无法识别 经过我在一番百度以后解决了这个问题 首先要求我们的电脑上已经装好WPS或者MathType 我的电脑已经装了office 所以不想再装WPS 所以
  • 课程计划、课程标准、教材三者关系

    课程主要表现为课程计划 课程标准 教材 教科书是其主要部分 课程计划 国家教育主管部门制定的 包括课程设置 学科顺序 课时分配 学年编制和学周安排 课程标准 国家根据课程计划纲要的形式编写的有关某门学科的内容及实施 评价的指导行文件 如 高
  • 使用nginx搭建的各种服务

    一 nginx搭建文件服务器 1 安装nginx bin bash 安装nginx的脚本文件 先按照nginx的依赖 yum y install gcc openssl devel pcre devel gt dev null echo n
  • pytorch入门篇2 玩转tensor(查看、提取、变换)

    上一篇博客讲述了如何根据自己的实际需要在pytorch中创建tensor pytorch入门篇1 创建tensor 这一篇主要来探讨关于tensor的基本数据变换 是pytorch处理数据的基本方法 文章目录 1 tensor数据查看与提取
  • CentOS7 Failed to start LSB: Bring up/down解决方法

    关于这个问题 网上的有各种解决方法 1 类似于https blog csdn net qq 21398167 article details 46694179这篇文章中提到的 修改mac地址 大多数都是这样 2 类似于http blog 5
  • 回归分析结果表格怎么填_回归分析表怎么看懂?

    展开全部 我给你解读一份stata的回归表格吧 应该有标准表格的所有内容了 因为你没有给范62616964757a686964616fe4b893e5b19e31333332643336例 不过我们考试基本就是考stata或者eview的输
  • AD7606调试过程与源码

    公司有一个项目用到了AD7606 控制器用的STM32 使用的模式是并行16位模式 程序刷好之后发现读取的AD数据乱码 结果发现是因为AD7606的接地不对 当然这个问题是我师傅找出来的 查找的过程如下 用示波器看了BUSY线 转换线等各种