找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 15384|回復(fù): 25
打印 上一主題 下一主題
收起左側(cè)

ADS1256的51單片機(jī)和stm32程序源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:417139 發(fā)表于 2018-10-29 11:13 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
stm32f103c8t6d的和51的都有



一、    概述
艾爾賽ADS1256 8路24位ADC模塊搭載TI ADS1256IDB 微功耗、高精度ADC芯片以及2.5V基準(zhǔn)電壓源,SPI接口通信,數(shù)據(jù)輸出速率可達(dá)30ksps,支持單端和差分輸入。
二、    功能特點(diǎn)   
板載高精度ADS1256IDB ADC芯片;
板載ADR03 2.5V電源基準(zhǔn)芯片;
數(shù)據(jù)輸出速率可達(dá)30ksps,低非線性度為±0.0010%;
模塊可配置為8路單端輸入或4路差分輸入;
ADS1256模塊適用于測(cè)量3V以內(nèi)的模擬電壓;
    模塊工作電壓5V;
三、 硬件介紹和說明
板子尺寸:35*60mm
板子功能說明:
1、接口說明:
5V、GND:5V電源輸入;
    SCLK、DIN、DOUT、CS:SPI通信接口;
DRDY:ADS1256數(shù)據(jù)就緒輸出(低電平有效);
PDWN:ADS1256同步/關(guān)閉電源輸入(低電平有效);
AIN0-AIN7:模擬電壓輸入端,可作為8路獨(dú)立的單端輸入或4組差分輸入(被測(cè)電壓應(yīng)與模塊共地)。
由于ADS1256的電源電壓為5V,而被測(cè)電壓應(yīng)比電源電壓低2V,所以模塊只適用于測(cè)量3V以內(nèi)的模擬電壓。
模塊提供STC15W&&STM32 單片機(jī)8路串口顯示參考程序以及STC89C52單片機(jī)4路1602_LCD顯示參考程序,其中STC89C52單片機(jī)+1602LCD液晶簡單測(cè)試方法如下:
5V、GND接DC 5V電源,SCLK、DIN、DOUT、DRDY、CS分別接單片機(jī)的P1.2、P1.3、P1.4、P1.5、P1.6,AIN0、AIN1、AIN2、AIN3分別接2.5V、2.5V、2.5V、2.5V(被測(cè)電壓應(yīng)該和ADS1256共地),1602液晶上面會(huì)顯示4組電壓值,其中第1、2、4組為AIN0、AIN1、AIN3的單端輸入的電壓值,第3組為AIN2-AIN3的差值。4組電壓值分別約為2.5V、2.5V、0V、2.5V。

單片機(jī)源程序如下:

  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設(shè)置為兩線全雙工
  37. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                    //設(shè)置SPI2為主模式
  38. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI發(fā)送接收8位幀結(jié)構(gòu)
  39. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                   //串行時(shí)鐘在不操作時(shí),時(shí)鐘為低電平
  40. SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                 //第一個(gè)時(shí)鐘沿開始采樣數(shù)據(jù)
  41. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                  //NSS信號(hào)由軟件(使用SSI位)管理
  42. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定義波特率預(yù)分頻的值:波特率預(yù)分頻值為8
  43. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       //數(shù)據(jù)傳輸從MSB位開始
  44. SPI_InitStructure.SPI_CRCPolynomial = 7;         //CRC值計(jì)算的多項(xiàng)式
  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. //        入口參數(shù): /        發(fā)送的SPI數(shù)據(jù)
  70. //        出口參數(shù): /        接收的SPI數(shù)據(jù)
  71. //        全局變量: /
  72. //        備    注:         發(fā)送接收函數(shù)
  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 寫數(shù)據(jù)
  85. //        入口參數(shù): /
  86. //        出口參數(shù): /
  87. //        全局變量: /
  88. //        備    注: 向ADS1256中地址為regaddr的寄存器寫入一個(gè)字節(jié)databyte
  89. //-----------------------------------------------------------------//
  90. void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
  91. {
  92.    
  93.         CS_0();
  94.         while(ADS1256_DRDY);//當(dāng)ADS1256_DRDY為低時(shí)才能寫寄存器
  95.         //向寄存器寫入數(shù)據(jù)地址
  96.     SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
  97.     //寫入數(shù)據(jù)的個(gè)數(shù)n-1
  98.     SPI_WriteByte(0x00);
  99.     //向regaddr地址指向的寄存器寫入數(shù)據(jù)databyte
  100.     SPI_WriteByte(databyte);
  101.         CS_1();
  102. }


  103. //初始化ADS1256
  104. void ADS1256_Init(void)
  105. {
  106.         //*************自校準(zhǔn)****************
  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);                // 放大倍數(shù)1
  117.         ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS);  // 數(shù)據(jù)10sps
  118.         ADS1256WREG(ADS1256_IO,0x00);               

  119.         //*************自校準(zhǔn)****************
  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);//當(dāng)ADS1256_DRDY為低時(shí)才能寫寄存器
  133.         ADS1256WREG(ADS1256_MUX,channel);                //設(shè)置通道
  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. }
復(fù)制代碼

所有資料51hei提供下載:
LC-ADC-1256.rar (6.12 MB, 下載次數(shù): 536)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:373064 發(fā)表于 2019-4-2 14:29 | 只看該作者
好材料不錯(cuò)
回復(fù)

使用道具 舉報(bào)

板凳
ID:503355 發(fā)表于 2019-4-2 16:28 | 只看該作者
有看門狗的程序嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:187802 發(fā)表于 2019-4-6 15:23 | 只看該作者

不錯(cuò),非常感謝
回復(fù)

使用道具 舉報(bào)

5#
ID:419072 發(fā)表于 2019-4-10 21:22 來自手機(jī) | 只看該作者
51電平是5v,ads1256電平是3.3v可以直接用么
回復(fù)

使用道具 舉報(bào)

6#
ID:512004 發(fā)表于 2019-4-14 16:59 | 只看該作者
if (sum>0x7FFFFF)sum -= 0x1000000;  請(qǐng)問這個(gè)什么作用
回復(fù)

使用道具 舉報(bào)

7#
ID:512004 發(fā)表于 2019-4-14 17:01 | 只看該作者
if (sum>0x7FFFFF)sum -= 0x1000000;
請(qǐng)問這個(gè)是什么作用
回復(fù)

使用道具 舉報(bào)

8#
ID:136947 發(fā)表于 2019-5-5 14:54 | 只看該作者
OPOPIIC 發(fā)表于 2019-4-14 17:01
if (sum>0x7FFFFF)sum -= 0x1000000;
請(qǐng)問這個(gè)是什么作用

ADS1256在這里被配置成了輸入范圍正負(fù)5V,DOUT輸出的24位轉(zhuǎn)換值,最高位是符號(hào)位,當(dāng)輸入為負(fù)電壓時(shí),最高位為1,在這里
if(sum>0x7F FFFF)          //輸入電壓為負(fù)
{
    sum -= 0x10 0000;    //將其視為正電壓
}
,,,,嗯,,,
應(yīng)該是這樣子。
回復(fù)

使用道具 舉報(bào)

9#
ID:371752 發(fā)表于 2019-6-5 12:21 | 只看該作者
這個(gè)程序?yàn)槭裁次矣玫臅r(shí)候發(fā)現(xiàn)全是亂的,都不能正常使用,你們都正常嗎?我代碼也看了感覺沒什么問題啊
回復(fù)

使用道具 舉報(bào)

10#
ID:565392 發(fā)表于 2019-6-19 14:33 | 只看該作者
請(qǐng)問一下,我寫了一個(gè)程序,配置都是按這樣來的,為什么會(huì)在AD1256_Init()里面卡主
回復(fù)

使用道具 舉報(bào)

11#
ID:565392 發(fā)表于 2019-6-20 10:36 | 只看該作者
樓主,我后來發(fā)現(xiàn)DRDY那個(gè)腳一直是高,這是什么原因
回復(fù)

使用道具 舉報(bào)

12#
ID:588192 發(fā)表于 2019-7-26 16:44 | 只看該作者
不能用程序的能不能注明一下
回復(fù)

使用道具 舉報(bào)

13#
ID:20672 發(fā)表于 2019-8-2 15:36 | 只看該作者
謝謝分享!~~~~
回復(fù)

使用道具 舉報(bào)

14#
ID:603339 發(fā)表于 2019-8-24 14:52 | 只看該作者
51的在壓縮包里么?目前這個(gè) 頁面只看到STM32的
回復(fù)

使用道具 舉報(bào)

15#
ID:387410 發(fā)表于 2019-9-11 07:41 來自手機(jī) | 只看該作者
樓主很棒,頂一下
回復(fù)

使用道具 舉報(bào)

16#
ID:613280 發(fā)表于 2019-9-21 10:29 | 只看該作者
GPIO_InitStructure.GPIO_Pin = PIN_DRDY;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

DRDY管腳用上拉輸入模式,該管腳不是一直被拉高嗎?程序還能跑下去?
回復(fù)

使用道具 舉報(bào)

17#
ID:384276 發(fā)表于 2019-10-20 22:23 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

18#
ID:338822 發(fā)表于 2019-10-24 17:36 | 只看該作者
最高速率能到多少 我測(cè)得單通道采集最多就2000次
回復(fù)

使用道具 舉報(bào)

19#
ID:347158 發(fā)表于 2020-2-23 11:50 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

20#
ID:672518 發(fā)表于 2020-5-20 13:45 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

21#
ID:711352 發(fā)表于 2020-5-24 13:00 | 只看該作者
正好用到這個(gè)芯片,謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

22#
ID:388361 發(fā)表于 2020-9-24 19:33 | 只看該作者
最近用這顆i.c,負(fù)壓讀取一直有問題。目前還在解決中。
回復(fù)

使用道具 舉報(bào)

23#
ID:920345 發(fā)表于 2021-5-12 22:47 | 只看該作者
樓主的壓縮文件里有ads1256.h的內(nèi)容嗎~?
回復(fù)

使用道具 舉報(bào)

24#
ID:921284 發(fā)表于 2021-5-14 16:29 | 只看該作者
感謝分享,51程序在壓縮包里嗎
回復(fù)

使用道具 舉報(bào)

25#
ID:1085418 發(fā)表于 2023-6-21 20:20 | 只看該作者
2023年回來考古
回復(fù)

使用道具 舉報(bào)

26#
ID:44626 發(fā)表于 2023-12-15 15:26 | 只看該作者
好資料 非常感謝  謝謝支持
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表