找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5313|回复: 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, 下载次数: 196)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:588192 发表于 2019-7-22 16:06 | 显示全部楼层
大佬,你这个使用的单片机是什么单片机呀?能说明一下型号和厂家吗
回复

使用道具 举报

ID:588192 发表于 2019-7-26 12:39 | 显示全部楼层
这个代码用不了,不能实现的能不能不要发呀
回复

使用道具 举报

ID:588192 发表于 2019-7-27 11:36 | 显示全部楼层
不能用的程序能不能注明一下仅供参考
回复

使用道具 举报

ID:825270 发表于 2020-12-6 22:04 | 显示全部楼层
发这种费代码,浪费时间
回复

使用道具 举报

ID:387410 发表于 2022-1-13 13:47 | 显示全部楼层
既然不能用,就不下了,但还是感恩你的分享,如果发的能用的代码,那就更好了
回复

使用道具 举报

ID:201953 发表于 2023-11-20 16:16 | 显示全部楼层
这么长时间了,终于用上了。
回复

使用道具 举报

ID:201953 发表于 2023-11-20 16:17 | 显示全部楼层
终于用上ADS1256了。感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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