• 24位ADC芯片AD7190讲解和代码编写(基于STM32模板的硬件软件SPI)


    1.芯片介绍

    AD7190是一款适合高精密测量应用的低噪声完整模拟前端。它集成一个低噪声、24位Σ-Δ型模数转换器(ADC)。片内低噪声增益级意味着可直接输入小信号。下面是他的芯片框架介绍。

    在这里插入图片描述
    AD7190具有4路输入,可以设置为2组差分输入或者4组假差分输入。AD7190按顺序在各使能通道上执行转换,这可以简化与器件的通信。AD7190提供两种数字滤波器选项。滤波器的选择会影响以编程输出数据速率工作时的均方根噪声和无噪声分辨率、建立时间以及50 Hz/60 Hz抑制。针对要求所有转换均需建立的应用,AD7190具有零延迟特性。

    2.硬件设计

    AD7190的电路图设计如下。根据官方的应用可以知道外围只要简单的元器件。
    在这里插入图片描述

    3.程序设计

    AD7190是通过片内的寄存器进行控制。

    首先是通信寄存器。无论是写寄存器还是读寄存器,必须都是操作通信寄存器作为起始。其中CR4到CR2作为下一次操作的寄存器地址,由下表我们也可以看出AD7190的寄存器数量。
    在这里插入图片描述
    在这里插入图片描述
    第二个寄存器为状态寄存器,顾名思义就是读取ADC的状态。
    在这里插入图片描述
    第三个寄存器位模式寄存器,他是24位寄存器,配置AD7190的ADC参数,分别有工作模式,时钟来源,斩波选择和使能,数据输出频率选择等等。
    在这里插入图片描述
    第四位是配置寄存器,也是一个24位的寄存器,配置AD7190的斩波选择和使能,基准电压,采集通道选择和放大倍数。
    在这里插入图片描述第五位是数据寄存器,ADC转换完成后数据都是存放在这里。
    在这里插入图片描述
    接下来的ID寄存器和其他寄存器就比较简单了。

    在这里插入图片描述
    在这里插入图片描述
    AD7190的使用方法可以按下面的步骤。首先是连续写40个脉冲进行复位,其次就是进行模式寄存器和配置寄存器的写入。最后在读取数据寄存器进行换算就可以。
    AD7190是采用SPI通许,所以有硬件SPI和软件SPI。具体采用哪一种看个人的需求。

    AD719通信层
    
    INT8U AD7190_Wirte8=0X00;  //8位写
    INT8U AD7190_Read8=0X00;  //8位读
    INT32U AD7190_Wirte32=0X000000;  //32位写
    INT32U AD7190_Read32=0X000000;  //32位读
    
    //AD7190写1字节,高位先写
    void AD7190_WriteByte(u8 data)
    {
    //  //硬件SPI
    //	SPI2_send_byte(data);
        //软件SPI 
    	AD7190_write_byte(data);
    }
    
    //AD7190读1字节
    u8 AD7190_ReadByte(void)
    {
    u8 data;
    //	//硬件SPI
    //  data=SPI2_read_byte();
      //软件SPI
      data = AD7190_read_byte();
      return data;
    }
    //AD7190写3字节,高位先写
    void AD7190_Write3Byte(u32 data)
    {
    	AD7190_WriteByte((data >> 16) & 0xFF);
    	AD7190_WriteByte((data >> 8) & 0xFF);
    	AD7190_WriteByte(data);	
    }
    //AD7190读3字节,高位先读
    u32 AD7190_Read3Byte(void)
    {
    	u32 data;
    	data = AD7190_ReadByte();
    	data <<= 8;
    	data += AD7190_ReadByte();
    	data <<= 8;
    	data += AD7190_ReadByte();	
    	return data;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    通信比较简单,就是读写的函数。接下来是初始化,首先是软件复位。

    	  //软件复位AD7190
    	  AD7190_Wirte8=0xff;
    	  for(i=0;i<5;i++)
    		{
    		  AD7190_WriteByte(AD7190_Wirte8);
    		  delay_us(5);
    		}
    	  //AD7190复位后必须等待500us
    	  delay_ms(100);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    复位后就是操作寄存器配置AD7190的参数,记得每一次写寄存器都要先发一个字节说明接下来是写还是读寄存器。

    	  //打印ID
    		AD7190_Wirte8=0x60;
    		AD7190_WriteByte(AD7190_Wirte8);
    		AD7190_Read8=AD7190_ReadByte();
            printf("AD7190_ID=%x\r\n",AD7190_Read8);
    		
    	  //写模式寄存器
          AD7190_Wirte8=0x08;
    	  AD7190_Wirte32=0X080C05;
          //0000 1000  连续转换模式,时钟选择内部4.92MHZ
          //0000 1000  SINC4滤波器,0延迟,60Hz滤波
    	  //0000 0101  240HZ输出频率
          AD7190_WriteByte(AD7190_Wirte8);
    	  AD7190_Write3Byte(AD7190_Wirte32);
        
    	  //读模式寄存器
    	  AD7190_Wirte8=0x48;
    	  AD7190_WriteByte(AD7190_Wirte8);
    	  AD7190_Read32=AD7190_Read3Byte();
    	  printf("mode_reg=%.6x\r\n",AD7190_Read32);
    
    
        //写配置寄存器
        AD7190_Wirte8=0x10;
    	AD7190_Wirte32=0X800118;		
    	//1000 0000  斩波使能,REF1电压基准
        //0000 0001  使能通道AIN1和AIN2
    	//0001 1000  禁止激励电流,关闭基准电压检测,开启输入缓冲,单极性,放大倍数1
        AD7190_WriteByte(AD7190_Wirte8);
    	AD7190_Write3Byte(AD7190_Wirte32);		
    
    
        //读取配置寄存器的数值
    	AD7190_Wirte8=0x50;
    	AD7190_WriteByte(AD7190_Wirte8);
    	AD7190_Read32=AD7190_Read3Byte();
    	printf("AD7190_con_reg=%.6x\r\n",AD7190_Read32);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    配置好AD7190后就是读取24位数据,然后根据这个数据算出差分输入的电压,计算公式就是REF脚位的电压分成16777216份(单极性和双极性的份数不一样)。得到的24位数据乘以这个数值就是差分电压。

    	  //读ADC数据
    	  AD7190_Wirte8=0x58;
    	  AD7190_WriteByte(AD7190_Wirte8);
    	  AD7190_Read32=AD7190_Read3Byte();
    	  printf("AD7190_DATA  =%.6x\r\n",AD7190_Read32);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    float AD7190_AIN1=0;//AIN1输入电压
    float AD7190_AIN2=0;//AIN2输入电压
    float AD7190_REF=3300;//参考电压3.3V
    float Get_AD7190_AIN(void)
    {
         float temp;
    	 AD7190_Read32=AD7190_ReadAdc();//得到data
    	 temp=AD7190_Read32;
    	 AD7190_AIN1=temp*((double)(AD7190_REF/16777216));//差分输入
    	 uprintf("AD7190_AIN=%lfmV\r\n",AD7190_AIN1);
    	 AD7190_AIN1=AD7190_AIN1+AD7190_AIN2;
    	 printf("AD7190_AIN1=%lfmV\r\n",AD7190_AIN1);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    一个数组去重(filter函数)
    网站被插入虚假恶意链接怎么办?
    解析 FXML 表格的使用,图书列表功能的实现
    C++AVL树
    年费会员免费送
    Qt软件发布(版本信息,Release版程序,代码打包,制作安装包)
    【图像分类】2022-ConvMixer ICLR
    deepxde更改backend
    PHP非对称与对称双向加密解密的方式
    VSCODE 系列(三)Settings Sync同步设置
  • 原文地址:https://blog.csdn.net/qq_43547520/article/details/132794045