ads1256 + STM32 + CubeMX 软件开发备忘

通讯

 ADS1256作为从机,使用主机进行双向通讯。CubeMX配置SPI如下:
在这里插入图片描述

 除此之外,还需要将DRDY引脚接入单片机一个支持外部中断的引脚,配置为下降沿触发即可。在本例中,为了便于展示,是在主循环中轮询DRDY引脚来实现的,在实际应用中建议利用外部中断进行。

输入引脚

 ADS1256虽然有AIN0~AIN7、AINCOM九个模拟输入引脚,但它实际上是一个单通道ADC,只不过可以在9个引脚中,任意配置一个输入引脚为P,任意配置一个输入引脚为N,作为一组差分输入。

 有两种典型用法:

  • AIN0~AIN7作为八个输入端,AINCOM作为公共输入端,构成8通道ADC
  • 将AINCOM接模拟地,AIN0~AIN7八个引脚两两配对,构成4通道ADC

在这里插入图片描述

 因此,ADS1256像是一个单刀多置开关,每次只能接入一路差分信号进行AD转换,如果要切换到其他路差分信号,则需要通过配置MUX寄存器将单刀多置开关“扳”到下一个通道上。如何“扳”,参考数据手册:

在这里插入图片描述

 当一个DRDY下降沿到来时,表示ADS1256已经完成一次转换,此时需要做:

  1. 写MUX寄存器,将其配置成你下一个需要读的通道;
  2. 依次发送同步命令(SYNC)、唤醒命令(WAKEUP);
  3. 发送单次读命令(RDATA);
  4. 读24位AD采集数据,注意,该数据是你上一次所配置通道的AD值,而不是你刚刚在第(1)条中配置的通道。

输入范围

 ADS1256的差分输入(AINP-AINN)范围为2倍的参考电压。如果配置了增益不为1(ADCON寄存器),则是2倍的参考电压/增益。

 单端输入(AIN0~AIN7、AINCOM)范围为AGND至AVDD。如果打开了缓冲(STATUS寄存器),单端输入的最大值会损失2V,即范围为AGND至AVDD-2V。

示例代码

 本示例代码基于CubeMX@Hal库

ads1256.h

#ifndef __ADS1256_H_
#define	__ADS1256_H_

#include "stm32f1xx_hal.h"

#define AD2_DRDY HAL_GPIO_ReadPin(AD2_DRDY_GPIO_Port, AD2_DRDY_Pin)
  
// define commands 
#define ADS1256_CMD_WAKEUP   0x00 
#define ADS1256_CMD_RDATA    0x01 
#define ADS1256_CMD_RDATAC   0x03 
#define ADS1256_CMD_SDATAC   0x0f 
#define ADS1256_CMD_RREG     0x10 
#define ADS1256_CMD_WREG     0x50 
#define ADS1256_CMD_SELFCAL  0xf0 
#define ADS1256_CMD_SELFOCAL 0xf1 
#define ADS1256_CMD_SELFGCAL 0xf2 
#define ADS1256_CMD_SYSOCAL  0xf3 
#define ADS1256_CMD_SYSGCAL  0xf4 
#define ADS1256_CMD_SYNC     0xfc 
#define ADS1256_CMD_STANDBY  0xfd 
#define ADS1256_CMD_REST    0xfe 
 
// define the ADS1256 register values 
#define ADS1256_STATUS       0x00   
#define ADS1256_MUX          0x01   
#define ADS1256_ADCON        0x02   
#define ADS1256_DRATE        0x03   
#define ADS1256_IO           0x04   
#define ADS1256_OFC0         0x05   
#define ADS1256_OFC1         0x06   
#define ADS1256_OFC2         0x07   
#define ADS1256_FSC0         0x08   
#define ADS1256_FSC1         0x09   
#define ADS1256_FSC2         0x0A 
 
// define multiplexer codes 
#define ADS1256_MUXP_AIN0   0x00 
#define ADS1256_MUXP_AIN1   0x10 
#define ADS1256_MUXP_AIN2   0x20 
#define ADS1256_MUXP_AIN3   0x30 
#define ADS1256_MUXP_AIN4   0x40 
#define ADS1256_MUXP_AIN5   0x50 
#define ADS1256_MUXP_AIN6   0x60 
#define ADS1256_MUXP_AIN7   0x70 
#define ADS1256_MUXP_AINCOM 0x80 
 
#define ADS1256_MUXN_AIN0   0x00 
#define ADS1256_MUXN_AIN1   0x01 
#define ADS1256_MUXN_AIN2   0x02 
#define ADS1256_MUXN_AIN3   0x03 
#define ADS1256_MUXN_AIN4   0x04 
#define ADS1256_MUXN_AIN5   0x05 
#define ADS1256_MUXN_AIN6   0x06 
#define ADS1256_MUXN_AIN7   0x07 
#define ADS1256_MUXN_AINCOM 0x08   

// define gain codes 
#define ADS1256_GAIN_1      0x00 
#define ADS1256_GAIN_2      0x01 
#define ADS1256_GAIN_4      0x02 
#define ADS1256_GAIN_8      0x03 
#define ADS1256_GAIN_16     0x04 
#define ADS1256_GAIN_32     0x05 
#define ADS1256_GAIN_64     0x06 
//#define ADS1256_GAIN_64     0x07 
 
// define drate codes 
#define ADS1256_DRATE_30000SPS   0xF0 
#define ADS1256_DRATE_15000SPS   0xE0 
#define ADS1256_DRATE_7500SPS   0xD0 
#define ADS1256_DRATE_3750SPS   0xC0 
#define ADS1256_DRATE_2000SPS   0xB0 
#define ADS1256_DRATE_1000SPS   0xA1 
#define ADS1256_DRATE_500SPS    0x92 
#define ADS1256_DRATE_100SPS    0x82 
#define ADS1256_DRATE_60SPS     0x72 
#define ADS1256_DRATE_50SPS     0x63 
#define ADS1256_DRATE_30SPS     0x53 
#define ADS1256_DRATE_25SPS     0x43 
#define ADS1256_DRATE_15SPS     0x33 
#define ADS1256_DRATE_10SPS     0x23 
#define ADS1256_DRATE_5SPS      0x13 
#define ADS1256_DRATE_2_5SPS    0x03

long double ADS1256ReadData(uint8_t channel);
void ADS1256_Init(void);

#endif

ads1256.c

#include "ADS1256.h"
#include "spi.h"

unsigned int sum;
long ulResult;
long double ldVolutage;

void delay_us(uint32_t udelay)
{
	uint32_t Delay = udelay * 72/4;
	do
	{
		__NOP();
	}
	while (Delay --);
}

//写ADS1256的寄存器
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
	unsigned char cmd;
    
	while(AD2_DRDY);//当AD2_DRDY为低时才能写寄存器
	//向寄存器写入数据地址
	cmd = ADS1256_CMD_WREG|(regaddr & 0x0F);
	HAL_SPI_Transmit(&hspi1, &cmd, 1, 10);
    //写入数据的个数n-1
	cmd = 0x00;
	HAL_SPI_Transmit(&hspi1, &cmd, 1, 10);
    //向regaddr地址指向的寄存器写入数据databyte
    HAL_SPI_Transmit(&hspi1, &databyte, 1, 10);
}

//初始化ADS1256
void ADS1256_Init(void)
{
	ADS1256WREG(ADS1256_STATUS,0x00);//高位在前、禁用自校准、禁用缓冲
	ADS1256WREG(ADS1256_ADCON,0x00);// 放大倍数1
	ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_5SPS);// 数据5sps
	ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);// 初始化端口A0为‘+’,AINCOM位‘-’
}

//读取AD值
long double ADS1256ReadData(uint8_t channel)  
{
  unsigned char data1,data2,data3;
  unsigned char cmd;

  while(AD2_DRDY);
  
  //切换通道
  //注意:本次写入的新通道在下次读取时才会生效,本次读到的是上一次的值
  switch(channel)
  {
    case 0:
      ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);
      break;
    case 1:
      ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN1 | ADS1256_MUXN_AINCOM);
      break; 
    case 2:
      ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN2 | ADS1256_MUXN_AINCOM);
      break; 
    case 3:
      ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN3 | ADS1256_MUXN_AINCOM);
      break; 
    case 4:
      ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN4 | ADS1256_MUXN_AINCOM);
      break; 
    case 5:
      ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN5 | ADS1256_MUXN_AINCOM);
      break; 
    case 6:
      ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN6 | ADS1256_MUXN_AINCOM);
      break; 
    case 7:
      ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN7 | ADS1256_MUXN_AINCOM);
      break; 
  }

  cmd = ADS1256_CMD_SYNC;
  HAL_SPI_Transmit(&hspi1, &cmd, 1, 10);
  cmd = ADS1256_CMD_WAKEUP;
  HAL_SPI_Transmit(&hspi1, &cmd, 1, 10);

  //发送单次读命令
  cmd = ADS1256_CMD_RDATA;
  HAL_SPI_Transmit(&hspi1, &cmd, 1, 10);

  //读24位数据
  HAL_SPI_Receive(&hspi1, &data1, 1, 10);
  HAL_SPI_Receive(&hspi1, &data2, 1, 10);
  HAL_SPI_Receive(&hspi1, &data3, 1, 10);
    sum = (unsigned int)(data1<<16)|(data2<<8)|data3;

  //单位转换为mV (VREF=2.5V) 
  ulResult = sum;
  if(ulResult & 0x800000)
  {
    ulResult =  ~(unsigned long)ulResult;
    ulResult &= 0x7fffff;
    ulResult += 1;
    ulResult =  -ulResult;
    ldVolutage = (long double)ulResult*0.000596046518808;
  }
  else 
    ldVolutage = (long double)ulResult*0.000596046518808;

  return ldVolutage;
}

main.c

void main()
{
  /*
   * 其他代码略
  */
  ADS1256_Init();
  while (1)
  {
    /*
     * 其他代码略
    */
    AD_value0 = ADS1256ReadData(1);
    AD_value1 = ADS1256ReadData(2);
    AD_value2 = ADS1256ReadData(3);
    AD_value3 = ADS1256ReadData(4);
    AD_value4 = ADS1256ReadData(5);
    AD_value5 = ADS1256ReadData(6);
    AD_value6 = ADS1256ReadData(7);
    AD_value7 = ADS1256ReadData(0);
  }
}
    AD_value1 = ADS1256ReadData(1);
    AD_value1 = ADS1256ReadData(2);
    AD_value2 = ADS1256ReadData(3);
    AD_value3 = ADS1256ReadData(4);
    AD_value4 = ADS1256ReadData(5);
    AD_value5 = ADS1256ReadData(6);
    AD_value6 = ADS1256ReadData(7);
    AD_value7 = ADS1256ReadData(0);
  }
}

 本文配套完整工程下载链接:https://download.csdn.net/download/yul13579/53380890

  • 16
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河上七月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值