通讯

 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    0x03long 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-1cmd = 0x00;HAL_SPI_Transmit(&hspi1, &cmd, 1, 10);//向regaddr地址指向的寄存器写入数据databyteHAL_SPI_Transmit(&hspi1, &databyte, 1, 10);
}//初始化ADS1256
void ADS1256_Init(void)
{ADS1256WREG(ADS1256_STATUS,0x00);//高位在前、禁用自校准、禁用缓冲ADS1256WREG(ADS1256_ADCON,0x00);// 放大倍数1ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_5SPS);// 数据5spsADS1256WREG(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

ads1256 + STM32 + CubeMX 软件开发备忘相关推荐

  1. office 软件常用备忘(删除线/冻结等)

    office 软件常用备忘(删除线/冻结等) Word: 1 大纲显示/navigation display: 视图/View --> Navigation Pane (left) 2 Trac ...

  2. Aurora开发备忘

    Aurora开发备忘 Aurora开发备忘 1 screen文件 1.1 字段只读 1.2 lov 弹出式选择框,带查询按钮和查询条件 1.3 通过 js手动执行dataSet中的查询 1.4 在js ...

  3. 我的装机软件清单-备忘

    闲鱼上捡了一些垃圾装了台新电脑,记录一下自己装机的软件清单,后续再装电脑的时候可以直接翻出来用 系统:Windows10专业版 CPU:AMD R5 5600X 主板:微星B550M Wifi 内存: ...

  4. 苹果 Apple CarPlay开发备忘

    1.建立iAP2通道 与Android Auto不同,Apple CarPlay需要通过苹果CP IC芯片鉴权,在iAP初期进行鉴权核对.否则无法继续通信. IC芯片需要单独购买. 2.切换苹果手机i ...

  5. STM32USB开发备忘之CDC_VCP实验

    USB CDC类(communications device class)可用于设备与主机之间的USB通信.有了CDC,再也不需要USB-TTL转接板啦,数据传输也更快. 平台:STM32F405 内 ...

  6. 【ESP8266开发备忘】

    目录 一.一些资料 eclipse AithinkerIDE平台 RTOS v3.0+ SDK平台 常见的两款开发板说明 AiThinkerIDE的常用操作快捷键 二.ESP8266 sdk3.0 i ...

  7. win10系统重装+软件设置(备忘)

    1. 系统的重装 用UltraISO软碟通来制作光盘映像文件(写入方式选择 USB-HDD+ v2 ) 重启电脑,按Fn+F6 进入bios,使能USB启动,进入boot,更改启动顺序 重启后就可以从 ...

  8. W5500 图片嵌入STM32 FLASH笔记(备忘)

    方法一:利用winHex软件将图片转为16进制数组存储在FALSH中 1 __root const char HDMV_HTML[]="<html>"\ 2 " ...

  9. iMX6UL lvgl开发备忘

    文章目录 LV_conf.h 配置 LV_conf.h 配置 #define LV_COLOR_DEPTH 16

  10. 百度CarLife开发备忘

    1.建立aoa通道 可以通过libusb直接打开手机端的aoa模式,发送百度CarLife描述信息.此后会重新枚举aoa设备,手机端会提示是否需要下载carlife. 也可以通过内核来建立一个aoa驱 ...

最新文章

  1. Java解析html页面,获取想要的元素
  2. VS2012及VS系列怎样屏蔽CMD窗口~
  3. DL之BP:利用乘法层/加法层(forward+backward)算法结合计算图(CG)求解反向求导应用题
  4. 用c语言编写数码管的显示函数,各位大神,如何用C语言实现在数码管上实现1234同时亮...
  5. Linux head和tail指令
  6. mysql查询优化以及面试小结
  7. java命令框编译代码的方式_在命令行模式下如何编译运行Java代码
  8. vc6.0 绘制散点图_vc有关散点图的一切
  9. C++手动开启O2优化(以及-O -O1 -O2 -O3优化的知识点)(竞赛可用)
  10. mysql 连接查询 子查询 备份 笔记
  11. 易语言解析html实例,易语言完整示例(单设备)
  12. zigbee协议栈-端点
  13. 电脑可以上网但打不开微信公众号
  14. 来看看怎样让你的VSR模型跑的和苏炳添一样快
  15. costmap_2d 中计算footprint 的内切圆半径和外切圆半径的函数解析——点到线段的距离计算
  16. JAVA Applet——绘制心形曲线
  17. Pulling is not possible because you have unmerged files
  18. 应用ceph文件系统存储(ceph-13.2.10)
  19. 大数据可视化陈为智慧树_智慧树知到_大数据可视化_答案章节单元测试答案
  20. 蓝桥杯2017年第八届蓝桥杯

热门文章

  1. python关于类、self、_init_的应用
  2. exchange服务器维护,Exchange服务器之禁用和删除Exchange邮箱深入探讨
  3. ϵ-greedy Policies
  4. ltp install
  5. 关于电子科技大学大学生早自习情况调查
  6. 【SAP消息号M8147】
  7. 项目中使用docker部署xxl-job
  8. WORD表格合并EXCEL表格格式错乱
  9. 【安卓开发】开源Notepad记事本APP项目(完整代码+说明文档)
  10. 网吧用服务器做虚拟化,网吧内共享服务器搭建