ad7190例程用stm32

发布时间:2024-01-31  

  在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。


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


  AD7190性价比很高,出货量大,用量也很大,供货很稳定,非常适用于中低速高精度的测试,如电子秤、应变计、气体分析、仪器仪表、压力传感器、血液分析、工业过程控制、医疗科学仪器等应用。本人对AD7190做了一次比较测试,分享下测试的结果

   硬件设计分析

  ad7190例程用stm32

  从结构图可以看出来,AD7190是模拟区域与数字区域完全独立的ADC,即AVDD给模拟区域供电,DVDD给数字区域供电,在原理图设计方面按照官方指导文档,需要对两个区域做独立的布线与隔离处理,才能让信噪比最佳。另可靠的基准电压是高精度ADC命根,本次试验选择TI公司推出的REF5025作基准参考,REF5025可低于3µVpp/V 噪声、3ppm/°C 漂移,性能是十分出色的。

 ad7190例程用stm32

  由于经常做高频类项目,十分讨厌杜邦线/飞线测试方式,在高精度的领域,24位ADC梯度值2的2416777216,如果接入基准电压是2.5v,理论分辨率可达到0.149μV,做过高频的工程师深知杜邦线的罪恶,根据上面的技术分析,哪怕线路被引入1μV的干扰,也可以让精度打上一定折扣。为了让ADS1232性能得以充分体现,特意做了一个测试载板,载板的设计也是很关键,分割模拟数字区域同时,连接地方大量使用钽电容做旁路电路,以把波纹抑制到最小,合理的布局与布线也很重要,敷铜区域也需要模数分离,以磁珠或者0-5R/电感隔开。

  

  

   时序图解说

ad7190例程用stm32

  由时序图看出来,AD7190读写是简单的3线串行读数方式,属于Microwire串行接口,STM32的SPI接口可以完美的与之匹配,当然也可以采用软仿SPI替代STM32的硬件SPI,这样的程序更具移植性。SPI时序实现也相对简单,AD7190的CS线仅仅只是做片选使用(上图所示),而不用过多管理,保持低电平即可。特别需要注意的是在空闲时候,SCLK时钟信号需要保持高电平,在SCLK半个周期当DIN接收到0x58后转换的数据才传入到DOUT总线,这时候才能读取数据。从时序图上看,与AD7799十分类似的,只是延时上要稍做一些处理。


  核心源码

  //寄存器列表

  #define ComState_register (0)《《3

  #define Mode_register (1)《《3

  #define Config_register (2)《《3

  #define Data_register (3)《《3

  #define ID_register (4)《《3

  #define GPOCON_register (5)《《3

  #define Disorders_register (6)《《3

  #define FullScale_register (7)《《3

  //模式寄存器

  #define MODE_ADC_OneByOne (0)《《21

  #define MODE_ADC_OnlyOne (1)《《21

  #define MODE_ADC_Free (2)《《21

  #define MODE_ADC_SavePower (3)《《21

  #define MODE_ADC_AdjustZero (4)《《21

  #define MODE_ADC_AdjustFull (5)《《21

  #define MODE_ADC_SysAdjustZero (6)《《21

  #define MODE_ADC_SysAdjustFull (7)《《21

  #define MODE_MCLK_OUTosc (0)《《18

  #define MODE_MCLK_OUTclo (1)《《18

  #define MODE_MCLK_IN (2)《《18

  #define MODE_MCLK_INcloOut (3)《《18

  #define MODE_SINC3 (1)《《15

  #define MODE_ENPAR (1)《《13

  #define MODE_Single (1)《《11

  #define MODE_REJ60 (1)《《10

  //#define MODE_Filter_Speed 0

  //配置寄存器

  #define Config_Chop_EN (1)《《23

  #define Config_REFSEL_IO (1)《《20

  #define Config_Burn_EN (1)《《7

  #define Config_REFDET_EN (1)《《6

  #define Config_BUF_EN (1)《《4

  #define Config_UB_EN (1)《《3

  #define Config_Ch0_A1A2 (1)《《8

  #define Config_Ch1_A3A4 (1)《《9

  #define Config_Ch2_temp (1)《《10

  #define Config_Ch3_A2A2 (1)《《11

  #define Config_Ch4_A1AC (1)《《12

  #define Config_Ch5_A2AC (1)《《13

  #define Config_Ch6_A3AC (1)《《14

  #define Config_Ch7_A4AC (1)《《15

  #define Config_ADC_Gain_1 0

  #define Config_ADC_Gain_8 3

  #define Config_ADC_Gain_16 4

  #define Config_ADC_Gain_32 5

  #define Config_ADC_Gain_64 6

  #define Config_ADC_Gain_128 7

  typedef struct {

  u32 ADC_Mode;

  u32 Return_state;

  u32 ADC_SCLK;

  u32 SINC3_EN;

  u32 ENPAR;

  u32 Single_EN;

  u32 REJ60_EN;

  u32 Filter;

  }AD7190_MODE_SET;

  typedef struct {

  u32 Config_Channel;

  u32 Config_ADC_Gain;

  u32 Config_Chop; //斩波使能

  u32 Config_REFSEL;

  u32 Config_Burn;

  u32 Config_REFDET;

  u32 Config_BUF;

  u32 Config_UB;

  }AD7190_Config_SET;

  //基本配置

  void AD7190_config(void)

  {

  AD7190_MODE_SET Mode;

  AD7190_Config_SET Config;

  Config.Config_Channel = Config_Ch1_A3A4;

  Config.Config_ADC_Gain = Config_ADC_Gain_1;

  Config.Config_Chop = 1;

  Config.Config_REFSEL = 0;

  Config.Config_Burn = 0;

  Config.Config_REFDET = 1;

  Config.Config_BUF = 0;

  Config.Config_UB = 1;

  Mode.ADC_Mode = MODE_ADC_AdjustZero;

  Mode.Return_state = 0;

  Mode.ADC_SCLK = MODE_MCLK_IN;

  Mode.SINC3_EN = 0;

  Mode.ENPAR = 0;

  Mode.Single_EN = 0;

  Mode.REJ60_EN = 0;

  Mode.Filter = 1;

  }

  //读取转换值

  void ReadAD7190(unsigned char count, unsigned char *buf)

  {

  unsigned char i = 0;

  unsigned char j = 0;

  unsigned char RotateData = 0;

  SET_SCL();

  delay_us(1);

  SET_CS();

  delay_us(1);

  CLR_CS();

  delay_us(1);

  for(j=count; j》0; j--)

  {

  for(i=0; i《8; i++)

  {

  CLR_SCL();

  RotateData 《《= 1;

  delay_us(1);

  RotateData |= GP0DAT;

  SET_SCL();

  delay_us(1);

  }

  *(buf + j - 1)= RotateData;

  RotateData=0;

  }

  SET_CS();

  }

  //初始化:

  void AD7799_INIT(void)

  {

  unsigned long command;

  command = AD7799_GetRegisterValue(AD7799_REG_CONF,2);

  command &= ~AD7799_CONF_GAIN(0xFF);

  command |= AD7799_CONF_GAIN(1);

  AD7799_SetRegisterValue(AD7799_REG_CONF,command,2);

  AD7799_SetReference();

  command = AD7799_GetRegisterValue(AD7799_REG_CONF,2);

  command &= ~AD7799_CONF_CHAN(0xFF);

  command |= AD7799_CONF_CHAN(2);

  AD7799_SetRegisterValue(AD7799_REG_CONF,command,2);

  command = AD7799_GetRegisterValue(AD7799_REG_MODE,2);

  command &= ~AD7799_MODE_SEL(0xFF);

  command |= AD7799_MODE_SEL(0);// 连续转换模式

  AD7799_SetRegisterValue(AD7799_REG_MODE,command,2);

  }

  //读数程序:

  while (1)

  {

  adcbuf=ADC_Num();

  if(ADC_Channel==1)//see datasheet AIN3 AIN4

  {

  adcA3A4[i++]=adcbuf;

  if(i》Num)

  {

  i=0;

  adcA3A4value=GetAverage(adcA3A4,Num);

  AD7190_DataFormatting(adcA3A4value , 2.5 ,1);

  DataLCD(AD7190_DataFormatting(adcA3A4value , 2.5 ,1));

  }

  }

  }

  作为一款中低速高精度的ADC,AD7190有着4.8kHz的转换频率,两路差分输入或四路伪差分输入,是个不错的选择,相比于AD7799虽然价格略高一些,但是他比AD7799的性能提高不少,特别是采样速率,测试看来,超高的性价比和出色的性能让它在同级别的ADC中也有很强的竞争能力。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    。 @zai: 说白了三句话: 1.熟悉编译下载环境; 2.啃手册; 3.研习官方例程。 @feilusia: 这是我自己的学习路线: 1.51学习寄存器操作; 2.stm8学习......
    了三句话: 1.熟悉编译下载环境 2.啃手册 3.研习官方例程 feilusia: 这是我自己的学习路线: 1、51学习寄存器操作 2、stm8学习寄存器和库操作 3、stm32学习寄存器和库操作 4......
    以芯片低频没问题,频率高了就异常为由怀疑芯片品质问题而耽误时间。 最后给点建议,做STM32开发的话,尤其是新手,如果参照ST的官方例程的话,有些配置在没看懂的情况下不要轻易屏蔽或修改。我碰到多个类似本案随意屏蔽例程......
    不仅进行外围设备控制的测试,还将评测该芯片在不同的低功耗模式下的电流。 意法半导体官方例程提供了 SLEEP 模式和 STANDBY 模式的 Keil 代码,为本文的低功耗评测带来极大方便。我们......
    发现有个VDDA脚虚焊。一直以芯片低频没问题,频率高了就异常为由怀疑芯片品质问题而耽误时间。 最后给点建议,做STM32开发的话,尤其是新手,如果参照ST的官方例程的话,有些......
    :分频和倍频因子的值不能太大,也不能大小,建议参考官方例程的参考值。 STM32 时钟常见问题 STM32时钟模块一旦出问题就可能引起系统的不正常工作,特别是对时钟敏感的部分。比如:定时器、串口......
    定时触发频率不对。 TIM_TimeBaseStructure.TIM_Prescaler TIM_TimeBaseStructure.TIM_Period 解决办法:参考官方例程,不遗漏配置、不把参数配错。或者......
    增加各个参数的判断,以防越界(这里为了方便理解,就写的比较简单)。 3.更多STM32都有硬件PWM输出功能,但不同的系列,其配置可能略有一些差异,简单参考官方例程以及手册。 现在......
    给你的资料不一定是最新版本。 因此,建议初学者查找资料,寻找资料尽量找官方原版资料,毕竟官方的才具有权威性。 STM32官方整理的资料很多,而且针对每一种型号的MCU都有各种资料。夸一点的说:你想......
    给你的资料不一定是最新版本。 因此,建议初学者查找资料,寻找资料尽量找官方原版资料,毕竟官方的才具有权威性。 STM32官方整理的资料很多,而且针对每一种型号的MCU都有各种资料。夸一点的说:你想......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>