久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6232|回復: 7
打印 上一主題 下一主題
收起左側

STM32驅動24位ADS1256源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:407625 發表于 2019-7-19 15:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
SCLK  PA5
DIN   PA7
DOUT  PA6
DRDY  PA2
CS    PA3
RESET PA4

電源接5v
數字地和模擬地可以用光耦或者0歐姆電阻隔離開

單片機源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "adc.h"
  8. #include "ads1256.h"



  9. #define MEDIAN_LEN  5                     //中直濾波的總長度,一般選取奇數   
  10. #define MEDIAN      2                     //中值在濾波數組中的位置
  11. unsigned long   AD_buffer[MEDIAN_LEN];    //ad采集數組緩存
  12. //unsigned long   MED_buffer[MEDIAN_LEN];   //中值濾波數組緩存
  13. unsigned char   medleng = 0;          //存入緩存的數據個數

  14. unsigned long medina_filter(unsigned long *MED_buffer);

  15.   

  16. int main(void)
  17. {         
  18.         delay_init();                     //延時函數初始化         
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
  20.         uart_init(115200);                 //串口初始化為115200
  21.          LED_Init();                             //LED端口初始化
  22.                  
  23.          
  24.         SPI_ADS1256_Init();                                                                  //SPI初始化
  25.         ADS1256_GPIO_init();                                                          //端口初始化
  26.         ADS1256_Init();


  27.         while(1)
  28.         {
  29.                                 /*
  30.                         ADS_sum(a,b):函數功能,測量電壓a-b
  31.                         解說:ADS1256_MUXP_AIN(0~7)代表通道0~7,差分正 P:positive
  32.                                   ADS1256_MUXN_AIN(0~7)代表通道0~7,差分負 N:negative
  33.                         
  34.                         例:差分測量通道0和1:ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AIN1);    返回通道0-通道1的電壓值
  35.                                 單端測量通道0:   ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);  返回通道0對地的電壓值
  36.                 */
  37.           ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);        //通道0對地的電壓值

  38. //                 ADS_sum(ADS1256_MUXP_AIN1 | ADS1256_MUXN_AINCOM);        //通道1對地的電壓值
  39. //                 sendChar(0x0d);        sendChar(0x0a);        
  40. //                 ADS_sum(ADS1256_MUXP_AIN2 | ADS1256_MUXN_AINCOM);        //通道2對地的電壓值
  41. //                 sendChar(0x0d);        sendChar(0x0a);        
  42. //                 ADS_sum(ADS1256_MUXP_AIN3 | ADS1256_MUXN_AINCOM);        //通道3對地的電壓值
  43. //                 sendChar(0x0d);        sendChar(0x0a);        
  44. //                 ADS_sum(ADS1256_MUXP_AIN4 | ADS1256_MUXN_AINCOM);        //通道4對地的電壓值
  45. //                 sendChar(0x0d);        sendChar(0x0a);        
  46. //                 ADS_sum(ADS1256_MUXP_AIN5 | ADS1256_MUXN_AINCOM);        //通道5對地的電壓值
  47. //                 sendChar(0x0d);        sendChar(0x0a);        
  48. //           ADS_sum(ADS1256_MUXP_AIN6 | ADS1256_MUXN_AINCOM);        //通道6對地的電壓值
  49. //                 sendChar(0x0d);        sendChar(0x0a);        
  50. //                 ADS_sum(ADS1256_MUXP_AIN7 | ADS1256_MUXN_AINCOM);        //通道7對地的電壓值        
  51. //                 


  52.                 delay_ms(500);
  53.         }
  54. }

  55. /**********************************************************/
  56. // 函數名:中值濾波函數
  57. // 描述  :提取前9次采集的數據,去掉高3個,去掉低3個,然后中間的
  58. // 描述  :3個數據求平均值,該算法可盡可能的濾掉干擾數據,并不影響采集速度。
  59. // 輸入  :9個數據的數組
  60. // 輸出  :中間3個數據的平均值
  61. /*********************************************************/
  62. unsigned long medina_filter(unsigned long *MED_buffer)  //xad - ADC轉換值   
  63. {   
  64.         
  65.         unsigned char i,j;
  66.         unsigned long xd;
  67.         u32 xxd;
  68.         
  69.         for(i = 0; i < MEDIAN_LEN; i ++)     
  70.         {   
  71.                 for(j = 0; j < MEDIAN_LEN - i; j ++)
  72.                 {
  73.                         
  74.                         if( MED_buffer[i] > MED_buffer[i + 1]) // 輪詢到的當前元素>AD值,則交換它們的值   
  75.                         { xd = MED_buffer[i]; MED_buffer[i] = MED_buffer[i + 1]; MED_buffer[i + 1] = xd;}
  76.                 }                        
  77.         }
  78.         xxd = MED_buffer[MEDIAN - 1] + MED_buffer[MEDIAN] + MED_buffer[MEDIAN + 1];
  79.         xd = xxd/3;
  80.         return xd; //中值     
  81. }

  82. /******************* (C) COPYRIGHT 2014 三峰電子開發工作室 *****END OF FILE****/
復制代碼
  1. #include "ads1256.h"
  2. #include "delay.h"
  3. #include "usart.h"

  4. u8 results1,results2,results3;

  5. /*******************************************************************************
  6. * Function Name  : SPI_FLASH_Init
  7. * Description    : Initializes the peripherals used by the SPI FLASH driver.
  8. * Input          : None
  9. * Output         : None
  10. * Return         : None
  11. *******************************************************************************/
  12. void SPI_ADS1256_Init(void)
  13. {
  14.   SPI_InitTypeDef  SPI_InitStructure;
  15.   GPIO_InitTypeDef GPIO_InitStructure;
  16.   
  17.   /* Enable SPI1 and GPIO clocks */
  18.   /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
  19.        SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
  20.        and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
  21.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);

  22.   /*!< SPI_FLASH_SPI Periph clock enable */
  23.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  24.   /*!< AFIO Periph clock enable */
  25.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  26.   
  27.   
  28.   /*!< Configure SPI_FLASH_SPI pins: RESET */
  29.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                            //
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                // 推免輸出
  31.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  32.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  33.   /*!< Configure SPI_FLASH_SPI pins:SCK | DIN */
  34.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;                    //
  35.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                        // 復用推免輸出
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  37.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  38.   /*!< Configure SPI_FLASH_SPI pins: DOUT */
  39.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                                            //
  40.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                        //上拉輸入
  41.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  42.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  43.   /* Deselect the FLASH: Chip Select high */

  44.   /* SPI1 configuration */
  45.   // 在SCLK下降沿,系統通過DIN向1256發送數據
  46.   // 在SCLK上升沿,系統通過DOUT 讀取1256數據
  47.   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;          //兩線全雙工
  48.   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                          //主機模式
  49.   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                  //8位模式
  50.   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                                                          //SCLK空閑時位低電平
  51.   SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                                                          //SCLK的下降沿采集數據
  52.   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                  //從機選擇信號,軟件模式,就是用GPIO選擇從機
  53.   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;          //APB2或者APB1總線頻率的1/2~1/256分頻
  54.   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                          //數據傳輸從MSB位開始
  55.   SPI_InitStructure.SPI_CRCPolynomial = 7;                                                                  //CRC值計算的多項式
  56.   SPI_Init(SPI1, &SPI_InitStructure);


  57.   /* Enable SPI1  */
  58.   SPI_Cmd(SPI1, ENABLE);
  59. }

  60. /*******************************************************************************
  61. * Function Name  : SPI_FLASH_SendByte
  62. * Description    : Sends a byte through the SPI interface and return the byte
  63. *                  received from the SPI bus.
  64. * Input          : byte : byte to send.
  65. * Output         : None
  66. * Return         : The value of the received byte.
  67. *******************************************************************************/
  68. u8 SPI_SendByte(u8 byte)
  69. {
  70.   /* Loop while DR register in not emplty */
  71.   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

  72.   /* Send byte through the SPI1 peripheral */
  73.   SPI_I2S_SendData(SPI1, byte);

  74.   /* Wait to receive a byte */
  75.   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

  76.   /* Return the byte read from the SPI bus */
  77.   return SPI_I2S_ReceiveData(SPI1);
  78. }


  79. /*******************************************************************
  80. 函數名:初始化DAC接口
  81. 函數原型:void ADC_gpio_init()
  82. 參數說明:無
  83. 返回:  無
  84. ********************************************************************/
  85. void ADS1256_GPIO_init(void)
  86. {
  87.         GPIO_InitTypeDef GPIO_InitStructure;
  88.         /////////CS  reset 引腳設置
  89.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  90.         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4 | GPIO_Pin_3;
  91.         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;        //--推免輸出模式
  92.         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz;         //--GPIO翻轉速度為50MHz

  93.         GPIO_Init(GPIOA , &GPIO_InitStructure);        //--將配置寫入對應的GPIO寄存器中        


  94. //        GPIO_InitTypeDef GPIO_InitStructure;
  95.     ///////// DRDY引腳設置
  96.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  97.         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2;
  98.         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING;        //--浮點輸入模式
  99.         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz;         //--GPIO翻轉速度為50MHz
  100.         GPIO_Init(GPIOA , &GPIO_InitStructure);        //--將配置寫入對應的GPIO寄存器中

  101. }

  102. //-----------------------------------------------------------------//
  103. //        功    能:ADS1256 寫數據
  104. //        入口參數: /
  105. //        出口參數: /
  106. //        全局變量: /
  107. //        備    注: 向ADS1256中地址為regaddr的寄存器寫入一個字節databyte
  108. //-----------------------------------------------------------------//

  109. void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
  110. {
  111.     ADS_CS_LOW();
  112.         while(ADS_DRDY);//當ADS1256_DRDY為低時才能寫寄存器
  113.         //向寄存器寫入數據地址
  114.     SPI_SendByte(ADS1256_CMD_WREG | (regaddr & 0xF));
  115.     //寫入數據的個數n-1
  116.     SPI_SendByte(0);
  117.     //向regaddr地址指向的寄存器寫入數據databyte
  118.           delay_us(5);
  119.     SPI_SendByte(databyte);
  120.         ADS_CS_HIGH();
  121. }

  122. //-----------------------------------------------------------------//
  123. //        功    能:ADS1256 讀寄存器數據
  124. //        入口參數: /
  125. //        出口參數: /
  126. //        全局變量: /
  127. //        備    注: 從ADS1256中地址為regaddr的寄存器讀出一個字節databyte
  128. //-----------------------------------------------------------------//

  129. unsigned char ADS1256RREG(unsigned char regaddr)
  130. {
  131.     //從ADS1256中地址為regaddr的寄存器讀出一個字節
  132.     unsigned char r=0;
  133.     ADS_CS_LOW();
  134.         while(ADS_DRDY);//當ADS1256_DRDY為低時才能寫寄存器
  135.         //寫入地址
  136.     SPI_SendByte(ADS1256_CMD_RREG | (regaddr & 0xF));
  137.     //寫入讀取數據的個數n-1
  138.     SPI_SendByte(0);
  139.           delay_us(10);  //min=50*(1/fCLKIN)=50*(1/7.68MHZ)=6500ns;max=whatever
  140.     //讀出regaddr地址指向的寄存器的數據
  141.     r=SPI_SendByte(0);
  142.           ADS_CS_HIGH();

  143.     return r;//返回數據
  144. }

  145. //-----------------------------------------------------------------//
  146. //        功    能:ADS1256初始化子程序
  147. //        入口參數: /
  148. //        出口參數: /
  149. //        全局變量: /
  150. //        備    注: /
  151. //-----------------------------------------------------------------//
  152. void ADS1256_Init(void)
  153. {     
  154.         ADS_CS_LOW();
  155.         RESET_HIGH();
  156.         delay_us(100);
  157.         SPI_SendByte(ADS1256_CMD_REST);
  158.         delay_ms(10);
  159.         while(ADS_DRDY);                                //當ADS1256_DRDY為低時才能寫寄存器
  160.         SPI_SendByte(ADS1256_CMD_SYNC);                 //同步命令
  161.         SPI_SendByte(ADS1256_CMD_WAKEUP);               //同步喚醒
  162.         
  163.         while(ADS_DRDY);
  164.         SPI_SendByte(ADS1256_CMD_WREG | ADS1256_STATUS);//連續寫入4個寄存器
  165.         SPI_SendByte(3);
  166.         SPI_SendByte(0x04);                             //高位在前,使用內部校準,不使用緩存
  167.         SPI_SendByte(ADS1256_MUXP_AIN2 | ADS1256_MUXN_AIN3);//端口輸入A2為正,A3位負
  168.         SPI_SendByte(ADS1256_GAIN_1);                   //放大倍數設置
  169.         SPI_SendByte(ADS1256_DRATE_2_5SPS);             //采集速度設置
  170.         delay_us(100);
  171.         
  172.         while(ADS_DRDY);                                //當ADS1256_DRDY為低時才能寫寄存器
  173.         SPI_SendByte(ADS1256_CMD_SELFCAL);              //偏移和增益自動校準
  174.         
  175.     ADS_CS_HIGH();
  176.         delay_ms(100);

  177. }

  178. //-----------------------------------------------------------------//
  179. //        功    能:
  180. //        入口參數: /
  181. //        出口參數: /
  182. //        全局變量: /
  183. //        備    注:
  184. //-----------------------------------------------------------------//

  185. unsigned long ADS1256ReadData(void)  
  186. {
  187.     unsigned char i=0;
  188.     unsigned long sum=0;
  189.                 unsigned long r=0;
  190.                 ADS_CS_LOW();

  191.                 while(ADS_DRDY);               //當ADS1256_DRDY為低時才能寫寄存器         
  192.                 SPI_SendByte(ADS1256_CMD_SYNC);
  193.                 SPI_SendByte(ADS1256_CMD_WAKEUP);
  194.                 SPI_SendByte(ADS1256_CMD_RDATA);
  195.                 delay_us(10);                  //min=50*(1/fCLKIN)=50*(1/7.68MHZ)=6500ns;max=whatever
  196.                         for(i=0;i<3;i++)
  197.                         {
  198.                                 sum = sum << 8;
  199.                         r = SPI_SendByte(0);  
  200.                                 sum |= r;
  201.                         }
  202.                 ADS_CS_HIGH();                 
  203.     return sum;
  204. }

  205. //-----------------------------------------------------------------//
  206. //        功    能:讀取ADS1256單路數據
  207. //        入口參數: /
  208. //        出口參數: /
  209. //        全局變量: /
  210. //        備    注: /
  211. //-----------------------------------------------------------------//
  212. void sendChar(unsigned char ch)
  213. {
  214.   USART_SendData(USART1, (unsigned char) ch);
  215.   while (!(USART1->SR & USART_FLAG_TXE));
  216. }


  217. unsigned char i=0;
  218.         long ulResult;
  219.         long double ldVolutage;

  220. unsigned long ADS_sum(unsigned char road)
  221. {
  222.         unsigned long results=0;
  223.         unsigned long Result_sum=0;
  224.         unsigned long fVoltage;
  225.         unsigned char buf[10],i,rod;

  226.         ADS1256WREG(ADS1256_MUX,road);                //設置通道
  227.         SPI_SendByte(ADS1256_CMD_SELFCAL);    //偏移和增益自動校準
  228.         
  229.         rod = (road >> 4)  ;
  230. //        printf("第");
  231. //        sendChar(rod);
  232. //        printf("路:");

  233.         Result_sum = ADS1256ReadData();//讀取AD值,返回24位數據。
  234.     ulResult= ADS1256ReadData();//讀取AD值,返回24位數據。
  235. //        return results;

  236.         if(Result_sum<0x800000)    //測得電壓值為正的情況
  237.         {
  238. //                fVoltage=Result_sum*985;  //954=2*2.5/2^19*100000000   2.5為基準電壓  100000000為為了計算的準確性轉換為整形計算。理論為954,實際修正為985
  239. //                buf[0]=(unsigned char)(fVoltage/100000000);
  240. //                buf[0]=buf[0]+0x30;
  241. //                buf[1]='.';
  242. //                buf[2]=(unsigned char)((fVoltage%100000000)/10000000);
  243. //                buf[2]=buf[2]+0x30;
  244. //                buf[3]=(unsigned char)((fVoltage%10000000)/1000000);
  245. //                buf[3]=buf[3]+0x30;
  246. //                buf[4]=(unsigned char)(fVoltage%1000000/100000);
  247. //                buf[4]=buf[4]+0x30;
  248. //                buf[5]=(unsigned char)(fVoltage%100000/10000);
  249. //                buf[5]=buf[5]+0x30;
  250. //                buf[6]=(unsigned char)(fVoltage%10000/1000);
  251. //                buf[6]=buf[6]+0x30;
  252. //                buf[7]=(unsigned char)(fVoltage%1000/100);
  253. //                buf[7]=buf[7]+0x30;      
  254. //                buf[8]='V';                        //V      
  255. //                buf[9]=0x20;
  256.                
  257.                 if( ulResult & 0x800000 )
  258.                         {
  259.                                  ulResult = ~(unsigned long)ulResult;
  260.                                 ulResult &= 0x7fffff;
  261.                                 ulResult += 1;
  262.                                 ulResult = -ulResult;
  263.                         }
  264.                
  265.                         ldVolutage = (long double)ulResult*0.59604644775390625;

  266.                         printf("第%d通道:",rod);
  267.                         printf("%lf",ldVolutage);         //double
  268.                         printf("uV\r\n");


  269.          }
  270. ……………………

  271. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


代碼可能有錯誤,請各位大神指導:
24位ADS1256.7z (291.4 KB, 下載次數: 200)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:588192 發表于 2019-7-22 16:06 | 只看該作者
大佬,你這個使用的單片機是什么單片機呀?能說明一下型號和廠家嗎
回復

使用道具 舉報

板凳
ID:588192 發表于 2019-7-26 12:39 | 只看該作者
這個代碼用不了,不能實現的能不能不要發呀
回復

使用道具 舉報

地板
ID:588192 發表于 2019-7-27 11:36 | 只看該作者
不能用的程序能不能注明一下僅供參考
回復

使用道具 舉報

5#
ID:825270 發表于 2020-12-6 22:04 | 只看該作者
發這種費代碼,浪費時間
回復

使用道具 舉報

6#
ID:387410 發表于 2022-1-13 13:47 | 只看該作者
既然不能用,就不下了,但還是感恩你的分享,如果發的能用的代碼,那就更好了
回復

使用道具 舉報

7#
ID:201953 發表于 2023-11-20 16:16 | 只看該作者
這么長時間了,終于用上了。
回復

使用道具 舉報

8#
ID:201953 發表于 2023-11-20 16:17 | 只看該作者
終于用上ADS1256了。感謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91av视频在线观看 | 国产观看 | 国产成人精品久久 | 日本成人福利视频 | 精品久久久久久亚洲综合网站 | 一区二区不卡视频 | 欧美日韩亚洲一区 | 亚洲欧美中文日韩在线v日本 | 久操伊人| 在线观看深夜视频 | 91亚洲国产成人久久精品网站 | 成人国产精品久久久 | 蜜桃久久 | 国内精品视频免费观看 | 亚洲一区二区三区在线播放 | 欧美一区二区另类 | 免费午夜视频在线观看 | 91免费版在线观看 | 91视频麻豆 | 成人国产精品免费观看视频 | 天天拍天天草 | 国产免费观看久久黄av片涩av | 51ⅴ精品国产91久久久久久 | 国产午夜视频 | 嫩草国产| 欧美爱爱视频网站 | 国产精产国品一二三产区视频 | 91夜色在线观看 | 黄色日批视频 | 亚洲一区二区在线 | 91在线电影 | 日韩色图视频 | 日本精品免费在线观看 | 久久福利电影 | 黄片毛片免费看 | 国产欧美精品 | 视频第一区 | 99国产精品99久久久久久 | 久久四虎 | 久久精品一级 | 日日草夜夜草 |