ADS1256驱动程序

2023-11-18

1,初始化

接口:
/********************************************
     SPI2           STM32      ADS1256
    
    NSS      --  PB12   --   CS
    SCK      --  PB13   --  SCLK
    MISO    --  PB14   --  DOUT
    MOSI    --  PB15   --  DIN
                       PB10   --  DRDY
             PB11   --  RESET
    
    
********************************************/

2,ADS_sum(a,b):函数功能,测量电压a-b
          ADS1256_MUXP_AIN(0~7)代表通道0~7,差分正 P:positive
           ADS1256_MUXN_AIN(0~7)代表通道0~7,差分负 N:negative
            
            例:差分测量通道0和1:ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AIN1);    返回通道0-通道1的电压值
                   单端测量通道0:   ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);  返回通道0对地的电压值

 


#include <stdio.h>
#include "stm32f10x_gpio.h"
#include "ADS1256.h"


void SPI2_Init(void)
{
 SPI_InitTypeDef  SPI_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 /****Initial SPI2******************/
 
 /* Enable SPI2 and GPIOB clocks */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
 
 

 /* Configure SPI2 pins: NSS, SCK, MISO and MOSI */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 //SPI2 NSS 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_SetBits(GPIOB, GPIO_Pin_12);
 
  /* SPI2 configuration */ 
 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                    
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                   
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                 
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                  
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;      
 SPI_InitStructure.SPI_CRCPolynomial = 7;       
 SPI_Init(SPI2, &SPI_InitStructure);
 /* Enable SPI2  */
 SPI_Cmd(SPI2, ENABLE);  
}  

//ADS1256 GPIO
void Init_ADS1256_GPIO(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_ADS1256Reset | RCC_ADS1256DRDY, ENABLE); 

  	GPIO_InitStructure.GPIO_Pin = GPIO_RCC_ADS1256Reset; 
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
  	GPIO_Init(GPIO_RCC_ADS1256Reset_PORT, &GPIO_InitStructure);  
  	GPIO_ResetBits(GPIO_RCC_ADS1256Reset_PORT, GPIO_RCC_ADS1256Reset );


	GPIO_InitStructure.GPIO_Pin = GPIO_ADS1256DRDY; 
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
  	GPIO_Init(GPIO_ADS1256DRDY_PORT, &GPIO_InitStructure);  

	SPI2_Init();
}



unsigned char SPI_WriteByte(unsigned char TxData)
{
  unsigned char RxData=0;

  while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET); //                                                   
  SPI_I2S_SendData(SPI2,TxData);

   while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);

   RxData=SPI_I2S_ReceiveData(SPI2);

    return RxData;
} 


void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_12);
	while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
	
    SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
   
    SPI_WriteByte(0x00);
   
    SPI_WriteByte(databyte);
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
}


//ADS1256
void ADS1256_Init(void)
{
	ADS1256WREG(ADS1256_STATUS,0x06);               
//	ADS1256WREG(ADS1256_MUX,0x08);                  
	ADS1256WREG(ADS1256_ADCON,0x00);               
	ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS);  
	ADS1256WREG(ADS1256_IO,0x00);               
}


unsigned int ADS1256ReadData()  
{
    unsigned char i=0;
    unsigned int sum=0;
	unsigned int r=0;
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);;

	while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));      

         
//	ADS1256WREG(ADS1256_MUX,channel);		
	SPI_WriteByte(ADS1256_CMD_SYNC);
	SPI_WriteByte(ADS1256_CMD_WAKEUP);	               
	SPI_WriteByte(ADS1256_CMD_RDATA);

   	sum |= (SPI_WriteByte(0xff) << 16);
	sum |= (SPI_WriteByte(0xff) << 8);
	sum |= SPI_WriteByte(0xff);

	GPIO_SetBits(GPIOB, GPIO_Pin_12); 
    return sum;
}



unsigned int ADS_sum(unsigned char channel)
{
	ADS1256WREG(ADS1256_MUX,channel);		
	return ADS1256ReadData();
}

 

 

2主函数

int main(void)
{
unsigned char i=0;
long ulResult;
long double ldVolutage;
uart_init(9600);
Init_ADS1256_GPIO(); 
ADS1256_Init();

	while(1)
	{	
		for(i = 0;i < 8;i++)
		{
			 //ulResult = ADS_sum( (i << 4) | ADS1256_MUXN_AINCOM);	  //8路测量时放开
			ulResult = ADS_sum( ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM); //单测0路	
			if( ulResult & 0x800000 )
			{
			 	ulResult = ~(unsigned long)ulResult;
				ulResult &= 0x7fffff;
				ulResult += 1;
				ulResult = -ulResult;
			}
		
			ldVolutage = (long double)ulResult*0.59604644775390625;

		//	printf("第%d路:",(i & 0x07)?(i & 0x07) - 1:7);
			printf("第1路");
			printf("%lf",ldVolutage); 	
			printf("uV\r\n");
                        delay_ms(1000);
			//printf("%x",(unsigned long)ulResult);//16
			Delay(0x3fFFF);
		}
	}
		
 

}

3.中值滤波


#define MEDIAN_LEN  5                     //中直滤波的总长度,一般选取奇数   
#define MEDIAN      2                     //中值在滤波数组中的位置
unsigned long   AD_buffer[MEDIAN_LEN];    //ad采集数组缓存
//unsigned long   MED_buffer[MEDIAN_LEN];   //中值滤波数组缓存
unsigned char   medleng = 0;          //存入缓存的数据个数
/**********************************************************/
// 函数名:中值滤波函数
// 描述  :提取前9次采集的数据,去掉高3个,去掉低3个,然后中间的
// 描述  :3个数据求平均值,该算法可尽可能的滤掉干扰数据,并不影响采集速度。
// 输入  :9个数据的数组
// 输出  :中间3个数据的平均值
/*********************************************************/
unsigned long medina_filter(unsigned long *MED_buffer)  //xad - ADC转换值   
{   
	
	unsigned char i,j;
	unsigned long xd;
	u32 xxd;
	
	for(i = 0; i < MEDIAN_LEN; i ++)     
	{   
		for(j = 0; j < MEDIAN_LEN - i; j ++)
		{
			
			if( MED_buffer[i] > MED_buffer[i + 1]) // 轮询到的当前元素>AD值,则交换它们的值   
			{ xd = MED_buffer[i]; MED_buffer[i] = MED_buffer[i + 1]; MED_buffer[i + 1] = xd;} 
		}			
	} 
	xxd = MED_buffer[MEDIAN - 1] + MED_buffer[MEDIAN] + MED_buffer[MEDIAN + 1];
	xd = xxd/3;
	return xd; //中值     
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ADS1256驱动程序 的相关文章

  • STM32+ESP8266+MQTT连接阿里云(1)

    ESP8266连接阿里云的流程 发送 目的是让ESP8266退出透传 AT RESTORE 让模块恢复出厂设置 AT 判断模块的好坏及工作状态 正常就会回复OK ATE0 关闭回显 这个没什么好说的 AT CWMODE CUR 1 设置为s
  • ANDROID

    1 环境构建 2 模拟测试 3 Activity 4android中的资源 5 UI 6 各种控件
  • QT基础学习(12)---事件过滤

    文章目录 事件过滤 一 事件过滤 实现该功能的方法就是在目标部件 自定义的图片显示部件 上注册事件过滤器 此时的事件过滤器就是我们所说的监视对象 完成这些步骤之后 当目标部件有事件产生后 首先会传递给监视对象 事件过滤器 进行处理而不是该事
  • 嵌入式学习:stm32学习路线推荐之思维导图

    从9月1日开始学习STM32后 对于STM32的一些个人总结 1 对于STM32和51的区别 对于 STM32来说 基本的大概都和51单片的内容相似 但是由于STM的引脚和寄存器的数量较多 所以需要一个更加完善的管理机制 导致了 时钟 的产
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • modbus总线协议(一)modbus rtu

    一 介绍 Modbus协议由Modicon公司开发出来 现在Modbus是工业领域全球最流行的协议 硬件支持RS 232 RS 422 RS 485和以太网设备 应用在PLC DCS 智能仪表等工控领域 图片来源于网络 二 modbus协议
  • iOS逆向工程之App脱壳

    本篇博客以微信为例 给微信脱壳 砸壳 在iOS逆向工程中是经常做的一件事情 因为从AppStore直接下载安装的App是加壳的 其实就是经过加密的 这个 砸壳 的过程就是一个解密的过程 未砸壳的App是无法在Class dump Hoppe
  • stm32USB之模拟U盘

    STMF0 W25Q32模拟U盘 1 第一次写博客 如有错误 请及时指正 如有表达不通顺的地方 敬请谅解 2 本篇文章主要描述如何使用STM32cube配置USB 使用的主控为STM32F072 Flash为W25Q32 使用的主控RAM只
  • 新唐NUC980使用记录(5.10.y内核):u-boot & linux & rootfs 编译与烧录测试(基于SD1位置SD卡)

    文章目录 目的 基础准备 烧录环境 开发编译环境 SD卡分区 制作和设置编译工具链 制作toolchain和rootfs 拷贝rootfs内容到SD卡 设置编译工具链 u boot编译与测试 下载 配置与编译 烧录u boot与环境变量 l
  • main.c(31): warning: #223-D: function “uart_init“ declared implicitly

    Keil5编程之warning 223 D function xxx declared implicitly 1 函数没有头文件中进行声明 在头文件中添加声明 2 定义错误 字母大小可能不一致 仔细看一下出现问题的函数是否在声明和调用时使用
  • 嵌入式 在开发板显示bmp图片、jpeg图片

    嵌入式 在开发板显示bmp图片 jpeg图片 一 简述 记 在GEC6818开发板 800W 480H 显示24位的bmp图片 使用开源的jpeg库显示jpeg图片 代码 链接 https pan baidu com s 1G3jzvdnc
  • 按键的短按和长按检测

    方法一 常用的加延时函数 在中断服务函数中加一个比如10ms的延时函数 延时时间的长短取决于实际所用的按键特性 只要延时时间比抖动时间略大即可 原理很简单 加了延时就避开了抖动的这段时间 在延时之后判断引脚电平 如果为低电平就表示是按下 v
  • 用于Arduino的S4A图形化编程图文详解

    文章结构 1 说明 2 实操 2 1 S4A安装 2 2 Arduino IDE 安装 2 3 下载S4A的固件 2 4 连接 2 5 刷入S4A固件 2 6 打开S4A并测试 3 附录 Uno引脚图 1 说明 作者还拥有个人公众号 会写一
  • 在vmware里面看不到已经设置的共享文件夹

    查看你是否设置了共享文件夹 vmware hgfsclient 在上图的虚拟机点击安装vmware tools 之后会在vmware tools文件里面有一个压缩的文件 把它复制到自己创的文件夹并解压 自己创建文件夹使用mkdir p mo
  • 解决Keil调试模式下无法设置断点的问题

    问题描述 使用Keil打开工程文件 进入调试模式后 只有main c文件里面可以设置断点 其余文件都不可以设置断点 可能的原因及解决方案 原因1 工程路径包含中文 解决方案1 更换为全英文路径 原因2 工程没有全部Rebuild 解决方案2
  • 四位数显表头设计

    去年帮别人定制了一个四位数显小表头 可以用于测量4 20mA或者0 5V 0 10V输出的的各种传感器 可设置显示范围 上下限报警灯 由于后面更改方案 此方案暂时搁置不用 今天来分享一下软硬件的设计过程 1 硬件设计 1 1电源 电源采用一
  • FreeRTOS中断管理

    目录 说明 一 中断基础 1 1 中断理解 1 2 中断执行步骤 1 3 中断寄存器选择位 1 4 中断优先级分类 二 中断优先级分组设置 2 1 分类 2 2 特点 三 中断有关寄存器 3 1 SHPR1寄存器 3 2 SHPR2寄存器
  • 32位的Ubuntu16.04安装QT5.8,并编译实现window环境下的代码

    开始 这是本人的第一篇博客 自己经常在网上找问题的解决方法 发现有些问题很难找到合适的解决方法 所以自己也写写 希望能帮助到大家 有错的地方大家指出 安装环境 linux环境 Ubuntu16 04 32位系统 使用apt get命令进行安
  • Java的引用类型有几种?区别是什么?

    nbsp Java的引用类型有几种 区别是什么 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n

随机推荐

  • linux创建文件夹主机名,Linux创建、删除文件和文件夹命令

    今天学习了几个命令 是创建 删除文件和文件夹的 在linux里 文件夹是目录 下面说下我学习的命令 接下来是小编为大家收集的Linux创建 删除文件和文件夹命令 欢迎大家阅读 Linux创建 删除文件和文件夹命令 创建文件夹 mkdir 一
  • Zotero使用笔记—文献管理、做笔记、文献引用、数据备份

    先贴一张zotero的大头照 步入正题 依次介绍zotero的几大功能 一 中英文 文献管理 先看了视频1和视频2这两个基本使用教程 浏览器又搜了一点 学到了 zotero用一个条目存储一篇文献的基本信息和PDF zotero中添加一个条目
  • 注册表:无法打开 XXX 由于某个错误无法打开该密钥。详细信息:拒绝访问

    错误原因 没有注册表用户权限 正确添加用户权限的步骤如下 跟着图片步骤 右击该项 权限 选中想要添加为当前所有者的用户后 点击应用 如果没用户显示 可以从 其他用户或组 中添加进来 权限添加完毕 转载于 https www cnblogs
  • 什么吃掉了我的硬盘?

    什么吃掉了我的硬盘 http www am82 com houzan archives 4550 posted on 2010 08 15 20 29 lexus 阅读 评论 编辑 收藏 转载于 https www cnblogs com
  • L2TP和PPTP的区别

    用最短的时间搞清楚L2TP和PPTP的区别 一 相关知识铺垫 1 虚拟隧道协议 一种通过公共网络的基础设施 在专用网络或专用设备之间实现加密数据通信的技术 通信的内容是可以是任何通信协议的数据包 隧道协议将这些协议的数据包重新封装在新的包中
  • 离散系统的变换域分析【数字信号处理四】

    离散系统的变换域分析 一 求系统H z 的零 极点 幅频响应和相位响应 二 用Matlab验证DFT运算的对称性质 三 产生数字线性调频信号 分析时域波形和频谱特性 四 设计简单的OFDM系统 并验证循环前缀的作用 一 求系统H z 的零
  • (黑客)自学笔记

    一 自学网络安全学习的误区和陷阱 1 不要试图先成为一名程序员 以编程为基础的学习 再开始学习 行为 从编程开始掌握 前端后端 通信协议 什么都学 缺点 花费时间太长 实际向安全过渡后可用到的关键知识并不多 很多安全函数知识甚至名词都不了解
  • Xception论文解读

  • make/makefile的使用

    make makefile 文章目录 make makefile 初步认识makefile的工作流程 依赖关系和依赖方法 make的使用 总结 make是一个命令 是一个解释makefile中指令的命令工具 makefile是一个文件 当前
  • oracle数据库中输入date类型的数据

    给oracle数据库已有记录中更新date类型的数据 插入date类型的格式 to date 2016 01 03 12 23 19 yyyy mm dd hh24 mi ss 2016 01 03 12 23 19 表示想要插入的时间 y
  • 华为鸿蒙os今日新闻,华为正式发布鸿蒙OS,却再次被质疑

    6月2日 市场瞩目的鸿蒙产品发布会成功举办 此次华为还连发三款搭载鸿蒙系统的硬件 华为 MatePad Pro 平板 华为 Watch 3 智能手表和华为 FreeBuds 4 TWS 耳机 但事情总有两面性 喜欢你的不论你做什么都会被看好
  • 小白入坑-利用express构建一个简单的Node项目

    做了部分前端的东西 当然不能局限眼前的成果 梦想能成为全栈的大佬 然后左手一个小姐姐 右手一个富萝莉 走远了 奈于java对前端来说比较难 耗费的学习时间也比较长 所以先从node下手过一下瘾儿 首先 win r打开windows的运行框
  • 什么是堡垒机

    什么是堡垒机 1 堡垒机是用来解决 运维混乱 的 堡垒机是用来干什么的 简而言之一句话 堡垒机是用于解决 运维混乱 的 何谓运维混乱 当公司的运维人员越来越多 当需要运维的设备越来越多 当参与运维的岗位越来越多样性 如果没有一套好的机制 就
  • Git入门超详细文档

    Git Git概述 Git是一个免费的 开源的分布式版本控制系统 可以款速高效的处理从小型到大型的各种项目 Git易于学习 占地面积小 性能极佳 它具有廉价的本地库 方便的暂存区域和多个工作流分支等特性 其性能优于Subversion CV
  • 试除法判定质数模板题

    试除法判定一个数是否为质数类似于这道题 代码 include
  • mac文件夹权限的@

    demo是网站根目录 终端下执行 cd到demo ls l 显示 drwxr xr x 9 andy admin 306 10 12 17 43 demo 这里的 貌似是mac特有的 第一次使用file put contents往根目录添加
  • QMutex使用时遇到的错误

    class A public explicit A QObject parent 0 A public QMutex m mutex class B public explicit B QObject parent 0 B private
  • C语言笔记 第三章 键盘输入与输出

    文章目录 1 printf 1 1 整型 1 2 字符型 1 3 浮点型 1 4 其他 1 4 1 标志 1 4 2 输出最小宽度 1 4 3 精度 1 4 4 类型长度 1 5 转义字符 2 scanf 2 1scanf 函数的一般形式
  • 网络安全----应急响应入侵排查

    系列文章目录 Web网络安全 红蓝攻防之信息收集 Web网络安全 Log4j高危漏洞原理及修复 Shell分类详解 图形界面 命令行式 Linux安全 应急溯源常用命令 记一次实战成功溯源反制getshell 文章目录 系列文章目录 一 应
  • ADS1256驱动程序

    1 初始化 接口 SPI2 STM32 ADS1256 NSS PB12 CS SCK PB13 SCLK MISO PB14 DOUT MOSI PB15 DIN PB10 DRDY PB11 RESET