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已经完成一次转换,此时需要做:
- 写MUX寄存器,将其配置成你下一个需要读的通道;
- 依次发送同步命令(SYNC)、唤醒命令(WAKEUP);
- 发送单次读命令(RDATA);
- 读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 软件开发备忘相关推荐
- office 软件常用备忘(删除线/冻结等)
office 软件常用备忘(删除线/冻结等) Word: 1 大纲显示/navigation display: 视图/View --> Navigation Pane (left) 2 Trac ...
- Aurora开发备忘
Aurora开发备忘 Aurora开发备忘 1 screen文件 1.1 字段只读 1.2 lov 弹出式选择框,带查询按钮和查询条件 1.3 通过 js手动执行dataSet中的查询 1.4 在js ...
- 我的装机软件清单-备忘
闲鱼上捡了一些垃圾装了台新电脑,记录一下自己装机的软件清单,后续再装电脑的时候可以直接翻出来用 系统:Windows10专业版 CPU:AMD R5 5600X 主板:微星B550M Wifi 内存: ...
- 苹果 Apple CarPlay开发备忘
1.建立iAP2通道 与Android Auto不同,Apple CarPlay需要通过苹果CP IC芯片鉴权,在iAP初期进行鉴权核对.否则无法继续通信. IC芯片需要单独购买. 2.切换苹果手机i ...
- STM32USB开发备忘之CDC_VCP实验
USB CDC类(communications device class)可用于设备与主机之间的USB通信.有了CDC,再也不需要USB-TTL转接板啦,数据传输也更快. 平台:STM32F405 内 ...
- 【ESP8266开发备忘】
目录 一.一些资料 eclipse AithinkerIDE平台 RTOS v3.0+ SDK平台 常见的两款开发板说明 AiThinkerIDE的常用操作快捷键 二.ESP8266 sdk3.0 i ...
- win10系统重装+软件设置(备忘)
1. 系统的重装 用UltraISO软碟通来制作光盘映像文件(写入方式选择 USB-HDD+ v2 ) 重启电脑,按Fn+F6 进入bios,使能USB启动,进入boot,更改启动顺序 重启后就可以从 ...
- W5500 图片嵌入STM32 FLASH笔记(备忘)
方法一:利用winHex软件将图片转为16进制数组存储在FALSH中 1 __root const char HDMV_HTML[]="<html>"\ 2 " ...
- iMX6UL lvgl开发备忘
文章目录 LV_conf.h 配置 LV_conf.h 配置 #define LV_COLOR_DEPTH 16
- 百度CarLife开发备忘
1.建立aoa通道 可以通过libusb直接打开手机端的aoa模式,发送百度CarLife描述信息.此后会重新枚举aoa设备,手机端会提示是否需要下载carlife. 也可以通过内核来建立一个aoa驱 ...
最新文章
- Java解析html页面,获取想要的元素
- VS2012及VS系列怎样屏蔽CMD窗口~
- DL之BP:利用乘法层/加法层(forward+backward)算法结合计算图(CG)求解反向求导应用题
- 用c语言编写数码管的显示函数,各位大神,如何用C语言实现在数码管上实现1234同时亮...
- Linux head和tail指令
- mysql查询优化以及面试小结
- java命令框编译代码的方式_在命令行模式下如何编译运行Java代码
- vc6.0 绘制散点图_vc有关散点图的一切
- C++手动开启O2优化(以及-O -O1 -O2 -O3优化的知识点)(竞赛可用)
- mysql 连接查询 子查询 备份 笔记
- 易语言解析html实例,易语言完整示例(单设备)
- zigbee协议栈-端点
- 电脑可以上网但打不开微信公众号
- 来看看怎样让你的VSR模型跑的和苏炳添一样快
- costmap_2d 中计算footprint 的内切圆半径和外切圆半径的函数解析——点到线段的距离计算
- JAVA Applet——绘制心形曲线
- Pulling is not possible because you have unmerged files
- 应用ceph文件系统存储(ceph-13.2.10)
- 大数据可视化陈为智慧树_智慧树知到_大数据可视化_答案章节单元测试答案
- 蓝桥杯2017年第八届蓝桥杯