找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13066|回复: 25
收起左侧

ADS1256的51单片机和stm32程序源码

  [复制链接]
ID:417139 发表于 2018-10-29 11:13 | 显示全部楼层 |阅读模式
stm32f103c8t6d的和51的都有
0.png

0.png
一、    概述
艾尔赛ADS1256 8路24位ADC模块搭载TI ADS1256IDB 微功耗、高精度ADC芯片以及2.5V基准电压源,SPI接口通信,数据输出速率可达30ksps,支持单端和差分输入。
二、    功能特点   
板载高精度ADS1256IDB ADC芯片;
板载ADR03 2.5V电源基准芯片;
数据输出速率可达30ksps,低非线性度为±0.0010%;
模块可配置为8路单端输入或4路差分输入;
ADS1256模块适用于测量3V以内的模拟电压;
    模块工作电压5V;
三、 硬件介绍和说明
板子尺寸:35*60mm
板子功能说明:
1、接口说明:
5V、GND:5V电源输入;
    SCLK、DIN、DOUT、CS:SPI通信接口;
DRDY:ADS1256数据就绪输出(低电平有效);
PDWN:ADS1256同步/关闭电源输入(低电平有效);
AIN0-AIN7:模拟电压输入端,可作为8路独立的单端输入或4组差分输入(被测电压应与模块共地)。
由于ADS1256的电源电压为5V,而被测电压应比电源电压低2V,所以模块只适用于测量3V以内的模拟电压。
模块提供STC15W&&STM32 单片机8路串口显示参考程序以及STC89C52单片机4路1602_LCD显示参考程序,其中STC89C52单片机+1602LCD液晶简单测试方法如下:
5V、GND接DC 5V电源,SCLK、DIN、DOUT、DRDY、CS分别接单片机的P1.2、P1.3、P1.4、P1.5、P1.6,AIN0、AIN1、AIN2、AIN3分别接2.5V、2.5V、2.5V、2.5V(被测电压应该和ADS1256共地),1602液晶上面会显示4组电压值,其中第1、2、4组为AIN0、AIN1、AIN3的单端输入的电压值,第3组为AIN2-AIN3的差值。4组电压值分别约为2.5V、2.5V、0V、2.5V。

单片机源程序如下:

  1. #include <stdio.h>
  2. #include "stm32f10x_gpio.h"
  3. #include "ADS1256.h"


  4. //***************************
  5. //                Pin assign                  
  6. //                        STM32                        ADS1256               
  7. //                GPIOB_Pin_11                 <--- DRDY
  8. //                GPIOB_Pin_12                 ---> CS
  9. //                GPIOB_Pin_13                 ---> SCK
  10. //                GPIOB_Pin_14(MISO)  <--- DOUT
  11. //                GPIOB_Pin_15(MOSI)  ---> DIN
  12. //***************************       

  13. /*端口定义*/

  14. #define RCC_DRDY                        RCC_APB2Periph_GPIOB
  15. #define PORT_DRDY                        GPIOB
  16. #define PIN_DRDY                        GPIO_Pin_11

  17. #define PORT_CS                                GPIOB
  18. #define PIN_CS                                GPIO_Pin_12


  19. #define CS_0()                                GPIO_ResetBits(PORT_CS, PIN_CS);
  20. #define CS_1()                                GPIO_SetBits(PORT_CS, PIN_CS);
  21. #define ADS1256_DRDY                  (PORT_DRDY->IDR & PIN_DRDY)


  22. void SPI2_Init(void)
  23. {
  24. SPI_InitTypeDef  SPI_InitStructure;
  25. GPIO_InitTypeDef GPIO_InitStructure;
  26. /****Initial SPI2******************/

  27. /* Enable SPI2 and GPIOB clocks */
  28. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  29. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  30. /* Configure SPI2 pins: NSS, SCK, MISO and MOSI */
  31. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  32. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  34. GPIO_Init(GPIOB, &GPIO_InitStructure);

  35.   /* SPI2 configuration */
  36. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI1设置为两线全双工
  37. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                    //设置SPI2为主模式
  38. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收8位帧结构
  39. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                   //串行时钟在不操作时,时钟为低电平
  40. SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                 //第一个时钟沿开始采样数据
  41. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                  //NSS信号由软件(使用SSI位)管理
  42. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为8
  43. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       //数据传输从MSB位开始
  44. SPI_InitStructure.SPI_CRCPolynomial = 7;         //CRC值计算的多项式
  45. SPI_Init(SPI2, &SPI_InitStructure);
  46. /* Enable SPI2  */
  47. SPI_Cmd(SPI2, ENABLE);  
  48. }  

  49. //初始化ADS1256 GPIO
  50. void Init_ADS1256_GPIO(void)
  51. {
  52.     GPIO_InitTypeDef GPIO_InitStructure;
  53.         RCC_APB2PeriphClockCmd(RCC_DRDY, ENABLE);

  54.         GPIO_InitStructure.GPIO_Pin = PIN_DRDY;
  55.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  56.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57.           GPIO_Init(PORT_DRDY, &GPIO_InitStructure);
  58.          //SPI2 NSS
  59.         CS_1();
  60.     GPIO_InitStructure.GPIO_Pin = PIN_CS;
  61.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  62.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  63.     GPIO_Init(PORT_CS, &GPIO_InitStructure);
  64.          
  65.         SPI2_Init();
  66. }


  67. //-----------------------------------------------------------------//
  68. //        功    能:  模拟SPI通信
  69. //        入口参数: /        发送的SPI数据
  70. //        出口参数: /        接收的SPI数据
  71. //        全局变量: /
  72. //        备    注:         发送接收函数
  73. //-----------------------------------------------------------------//
  74. unsigned char SPI_WriteByte(unsigned char TxData)
  75. {
  76.   unsigned char RxData=0;
  77.   while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
  78.   SPI_I2S_SendData(SPI2,TxData);
  79.   while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
  80.   RxData=SPI_I2S_ReceiveData(SPI2);
  81.   return RxData;
  82. }

  83. //-----------------------------------------------------------------//
  84. //        功    能:ADS1256 写数据
  85. //        入口参数: /
  86. //        出口参数: /
  87. //        全局变量: /
  88. //        备    注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
  89. //-----------------------------------------------------------------//
  90. void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
  91. {
  92.    
  93.         CS_0();
  94.         while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器
  95.         //向寄存器写入数据地址
  96.     SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
  97.     //写入数据的个数n-1
  98.     SPI_WriteByte(0x00);
  99.     //向regaddr地址指向的寄存器写入数据databyte
  100.     SPI_WriteByte(databyte);
  101.         CS_1();
  102. }


  103. //初始化ADS1256
  104. void ADS1256_Init(void)
  105. {
  106.         //*************自校准****************
  107.            while(ADS1256_DRDY);
  108.         CS_0();
  109.         SPI_WriteByte(ADS1256_CMD_SELFCAL);
  110.         while(ADS1256_DRDY);
  111.         CS_1();
  112.         //**********************************

  113.         ADS1256WREG(ADS1256_STATUS,0x06);               // 高位在前、使用缓冲
  114. //        ADS1256WREG(ADS1256_STATUS,0x04);               // 高位在前、不使用缓冲

  115. //        ADS1256WREG(ADS1256_MUX,0x08);                  // 初始化端口A0为‘+’,AINCOM位‘-’
  116.         ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1);                // 放大倍数1
  117.         ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS);  // 数据10sps
  118.         ADS1256WREG(ADS1256_IO,0x00);               

  119.         //*************自校准****************
  120.         while(ADS1256_DRDY);
  121.         CS_0();
  122.         SPI_WriteByte(ADS1256_CMD_SELFCAL);
  123.         while(ADS1256_DRDY);
  124.         CS_1();
  125.         //**********************************
  126. }

  127. //读取AD值
  128. signed int ADS1256ReadData(unsigned char channel)  
  129. {

  130.     unsigned int sum=0;
  131.        
  132.         while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器
  133.         ADS1256WREG(ADS1256_MUX,channel);                //设置通道
  134.         CS_0();
  135.         SPI_WriteByte(ADS1256_CMD_SYNC);
  136.         SPI_WriteByte(ADS1256_CMD_WAKEUP);                      
  137.         SPI_WriteByte(ADS1256_CMD_RDATA);
  138.            sum |= (SPI_WriteByte(0xff) << 16);
  139.         sum |= (SPI_WriteByte(0xff) << 8);
  140.         sum |= SPI_WriteByte(0xff);
  141.         CS_1();

  142.         if (sum>0x7FFFFF)           // if MSB=1,
  143.         {
  144.                 sum -= 0x1000000;       // do 2's complement

  145.         }
  146.     return sum;
  147. }
复制代码

所有资料51hei提供下载:
LC-ADC-1256.rar (6.12 MB, 下载次数: 532)
回复

使用道具 举报

ID:373064 发表于 2019-4-2 14:29 | 显示全部楼层
好材料不错
回复

使用道具 举报

ID:503355 发表于 2019-4-2 16:28 | 显示全部楼层
有看门狗的程序吗?
回复

使用道具 举报

ID:187802 发表于 2019-4-6 15:23 | 显示全部楼层

不错,非常感谢
回复

使用道具 举报

ID:419072 发表于 2019-4-10 21:22 来自手机 | 显示全部楼层
51电平是5v,ads1256电平是3.3v可以直接用么
回复

使用道具 举报

ID:512004 发表于 2019-4-14 16:59 | 显示全部楼层
if (sum>0x7FFFFF)sum -= 0x1000000;  请问这个什么作用
回复

使用道具 举报

ID:512004 发表于 2019-4-14 17:01 | 显示全部楼层
if (sum>0x7FFFFF)sum -= 0x1000000;
请问这个是什么作用
回复

使用道具 举报

ID:136947 发表于 2019-5-5 14:54 | 显示全部楼层
OPOPIIC 发表于 2019-4-14 17:01
if (sum>0x7FFFFF)sum -= 0x1000000;
请问这个是什么作用

ADS1256在这里被配置成了输入范围正负5V,DOUT输出的24位转换值,最高位是符号位,当输入为负电压时,最高位为1,在这里
if(sum>0x7F FFFF)          //输入电压为负
{
    sum -= 0x10 0000;    //将其视为正电压
}
,,,,嗯,,,
应该是这样子。
回复

使用道具 举报

ID:371752 发表于 2019-6-5 12:21 | 显示全部楼层
这个程序为什么我用的时候发现全是乱的,都不能正常使用,你们都正常吗?我代码也看了感觉没什么问题啊
回复

使用道具 举报

ID:565392 发表于 2019-6-19 14:33 | 显示全部楼层
请问一下,我写了一个程序,配置都是按这样来的,为什么会在AD1256_Init()里面卡主
回复

使用道具 举报

ID:565392 发表于 2019-6-20 10:36 | 显示全部楼层
楼主,我后来发现DRDY那个脚一直是高,这是什么原因
回复

使用道具 举报

ID:588192 发表于 2019-7-26 16:44 | 显示全部楼层
不能用程序的能不能注明一下
回复

使用道具 举报

ID:20672 发表于 2019-8-2 15:36 | 显示全部楼层
谢谢分享!~~~~
回复

使用道具 举报

ID:603339 发表于 2019-8-24 14:52 | 显示全部楼层
51的在压缩包里么?目前这个 页面只看到STM32的
回复

使用道具 举报

ID:387410 发表于 2019-9-11 07:41 来自手机 | 显示全部楼层
楼主很棒,顶一下
回复

使用道具 举报

ID:613280 发表于 2019-9-21 10:29 | 显示全部楼层
GPIO_InitStructure.GPIO_Pin = PIN_DRDY;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

DRDY管脚用上拉输入模式,该管脚不是一直被拉高吗?程序还能跑下去?
回复

使用道具 举报

ID:384276 发表于 2019-10-20 22:23 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:338822 发表于 2019-10-24 17:36 | 显示全部楼层
最高速率能到多少 我测得单通道采集最多就2000次
回复

使用道具 举报

ID:347158 发表于 2020-2-23 11:50 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:672518 发表于 2020-5-20 13:45 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:711352 发表于 2020-5-24 13:00 | 显示全部楼层
正好用到这个芯片,谢谢楼主分享
回复

使用道具 举报

ID:388361 发表于 2020-9-24 19:33 | 显示全部楼层
最近用這顆i.c,負壓讀取一直有問題。目前還在解決中。
回复

使用道具 举报

ID:920345 发表于 2021-5-12 22:47 | 显示全部楼层
楼主的压缩文件里有ads1256.h的内容吗~?
回复

使用道具 举报

ID:921284 发表于 2021-5-14 16:29 | 显示全部楼层
感谢分享,51程序在压缩包里吗
回复

使用道具 举报

ID:1085418 发表于 2023-6-21 20:20 | 显示全部楼层
2023年回来考古
回复

使用道具 举报

ID:44626 发表于 2023-12-15 15:26 | 显示全部楼层
好资料 非常感谢  谢谢支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表