ADC芯片CS1238,CS1237介绍和代码

news2025/1/12 18:18:32

一.芯片介绍

CS1238是一款高精度、低功耗 模数转换芯片,两路差分输入通道,内置温度传感器和高精度振荡器。MCU可以通过2线的SPI 接口SCLK、DRDY与CS1237进行通信,对其进行配置,例如通道选择、PGA选择、输出速率选择等。下面是CS1238和CS1237的一些特点。
在这里插入图片描述

二.硬件设计

CS1238的管脚定义如下

在这里插入图片描述
结合框架图,可以看出CS1238的使用方法比较简单,除去电源口就只有4个输入脚,CS1238和MCU的通信只要2个IO口模拟SPI。
在这里插入图片描述

三,程序设计

CS1238的程序设计比较简单,按照步骤为配置IO,写寄存器配置模式,读取ADC数据。一般只要配置两个IO口为输入和输出模式就可以。

在这里插入图片描述

//IO初始化
void CS1238_IO_Init(void)
{
	
	GPIO_InitTypeDef  GPIO_InitStructure;						
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;     
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA, GPIO_Pin_12);	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;   
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	GPIO_SetBits(GPIOA, GPIO_Pin_11);	
}

CS1238的程序重点在于他的读写时序,首先看下时序图。
在这里插入图片描述
在这里插入图片描述
CS1238一次完整的周期有48个时钟信号。每一个时钟的都有特定的作用,下面我们结合程序来看。首先写一个时钟周期。

//一个时钟周期
//高电平不能超过100uS,否则进入powerdown的休眠模式.
void cs1238_clock(void) 
{
    GPIO_SetBits(GPIOA, GPIO_Pin_12);
    delay_us(10);//延时10us
    GPIO_ResetBits(GPIOA, GPIO_Pin_12);
    delay_us(10);//延时10us
}

这里要注意到高电平的时间不可以超过100us,不然就会进入到睡眠模式。

在这里插入图片描述
我们1到24个时钟信号为读ADC数值,代码如下。

//CS1238读数据
int32_t read_cs1238_data(void)
{
	int i=0;
	uint32_t dat=0;//读取到的数据
	int32_t temp;

	//DOUT由高变低之后开始读取数据
	CS1238_OUT();
	GPIO_SetBits(GPIOA, GPIO_Pin_11);
	CS1238_IN();
	GPIO_ResetBits(GPIOA, GPIO_Pin_11);
	
	//等待芯片准备好,低电平准备好
	while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11))
	{
     delay_ms(1);
	 i++;
		 if(i>100)//检测100ms
		 {
		    u2_printf("CS1238 Data error \r\n");
		    return 0;
		 }

	}
	
/* 1: clk1 ~ clk24 ADC数据*/
	for(i=0;i<24;i++)//获取24位有效转换
	{
		dat <<= 1;
		cs1238_clock();
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11)==1)
		 {
			 dat |= 0x01; 
	 	 }
	} 
	
	
/* 1: clk25 ~ clk27 读取寄存器写操作状态*/	
	for(i=0;i<3;i++)
	{
     cs1238_clock();
	}	

	
	if(dat&0x00800000)// 判断是负数 最高位24位是符号位
	{
	  temp=(((~dat)&0x007FFFFF) + 1);// 补码变源码
		u2_printf("CS1238_data=  %x  \r\n", temp);
		return temp;

	} else temp=dat;// 正数的补码就是源码
	
	u2_printf("CS1238_data=  %x  \r\n", dat);
	return temp;
	
}

然后CS1238只有一个7位寄存器,功能为设置ADC的放大倍数和输出数据频率等。并且CS1238只有两个7bit的指令,为写寄存器和读寄存器的指令。
在这里插入图片描述

在这里插入图片描述
相对应的代码如下。

//写CS1238的寄存器,ad_reg为写入的寄存器数值
void	Write_AdReg(u8 ad_reg)
{
	int i;
	u8 Write_AdReg=0x00;
	
	 //DOUT由高变低之后开始读取数据
	CS1238_OUT();
	GPIO_SetBits(GPIOA, GPIO_Pin_11);
	CS1238_IN();
	GPIO_ResetBits(GPIOA, GPIO_Pin_11);
	
	//1-29,读ADC数值
	for(i=0;i<29;i++)
	{
	  cs1238_clock();
	}
	
	CS1238_OUT();
	Write_AdReg=0xCA;  //0X56为写命令,因为只有7个时钟,所以左移一位
	
/* 1: clk30 ~ clk36  写入写命令*/
	for(i=0;i<7;i++)   //30-36
	{
		if(Write_AdReg & 0x80)
		  {
		    GPIO_SetBits(GPIOA, GPIO_Pin_11);	// DATA=1
		  }
		else
		  {
				GPIO_ResetBits(GPIOA, GPIO_Pin_11);	// DATA=0;
		  }
	
		Write_AdReg = Write_AdReg << 1;
		cs1238_clock();  
	}
	
	//clk37切换写入写出方向
	cs1238_clock();   //37
  CS1238_OUT();
	
/* 1: clk38 ~ clk45  写入寄存器配置*/	
	Write_AdReg=ad_reg; //寄存器配置
	for(i=0;i<8;i++)    
	 {
	   if(Write_AdReg&0x80)
		  {
				GPIO_SetBits(GPIOA, GPIO_Pin_11);	// DATA=1
		  }
			else
			{
				GPIO_ResetBits(GPIOA, GPIO_Pin_11);	// DATA=0;
			}
			Write_AdReg = Write_AdReg << 1;
		  cs1238_clock();   
	 }
	
	GPIO_SetBits(GPIOA, GPIO_Pin_11);
	//clk46
	cs1238_clock();

}
//读CS1238寄存器
uchar_t Rd_AdReg(void) 
{
  int i;
	u8 RD_AdReg=0x00;
	
 //DOUT由高变低之后开始读取数据
	CS1238_OUT();
	GPIO_SetBits(GPIOA, GPIO_Pin_11);
	CS1238_IN();
	GPIO_ResetBits(GPIOA, GPIO_Pin_11);
	
	//1-29,读ADC数值
	for(i=0;i<29;i++)
	{
	  cs1238_clock();
	}
	
	CS1238_OUT();
	RD_AdReg = 0xAC;  //0X56为读命令,因为只有7个时钟,所以左移一位
	
/* 1: clk30 ~ clk36  写入读命令*/	
	for(i=0;i<7;i++)  
	{
		
	 if((RD_AdReg & 0x80)!=0)
	   {
       GPIO_SetBits(GPIOA, GPIO_Pin_11);	// DATA=1;
	   }
	 else
		 {
		   GPIO_ResetBits(GPIOA, GPIO_Pin_11);	// DATA=0;
	   }
	
	 RD_AdReg<<=1;
	 cs1238_clock();   
	}
	
  //clk37切换写入写出方向
	cs1238_clock();
	CS1238_IN()
	
/* 1: clk38 ~ clk45 输出寄存器配置*/
	RD_AdReg=0x00;
	for(i=0;i<8;i++)   
	{
		RD_AdReg<<=1;
		cs1238_clock();
		if((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11)==1))
		 {
			  RD_AdReg |= 0x01;  //为了保证前面输入的数据不变新输入的数据为高电平1时可以传进来
		 }
	}
		GPIO_SetBits(GPIOA, GPIO_Pin_11);
	  cs1238_clock();   //第46CLK
	  return RD_AdReg;	
}

最后是CS1238的初始化。

//CS1238初始化
void	CS1238_Init(void)
{
   CS1238_IO_Init();
	 //关闭REF输出,ADC输出640HZ,PGA1,通道选择A
	 Write_AdReg(0x60);
   Rd_AdReg();
}

然后调用CS1238读ADC的函数是返回一个24bit的数据,一般我习惯把他换算成mV的单位。

//计算CS1238的输入电压
float Get_CS1238_Voltage(void)
{
     CS1238_DATA=read_cs1238_data();   //获取cs1238的AD数值
     CS1238_IN=(CS1238_DATA/8388607)*CS1238_REF;   //计算差分输入的电压,8388607位满载
	 CS1238_AINP1=CS1238_IN/2+CS1238_AINN1;       //计算CS1238的+输入
	 u2_printf("CS1238_IN=%.0fmV  \r\n",CS1238_IN);
	 u2_printf("CS1238_AINP1=%.0f mV  \r\n",CS1238_AINP1);
	 u2_printf("CS1238_AINN1=%.0f mV  \r\n",CS1238_AINN1);
}

CS1237和CS1238的用法一样,只不过CS1237的输入只有一组差分输入。最后附上工程代码和资料,需要的可以联系我(不是白嫖的)。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/936131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9. 解谜游戏

目录 题目 Description Input Notes 思路 暴力方法 递归法 注意事项 C代码&#xff08;递归法&#xff09; 关于DFS 题目 Description 小张是一个密室逃脱爱好者&#xff0c;在密室逃脱的游戏中&#xff0c;你需要解开一系列谜题最终拿到出门的密码。现在小张需要打…

解决CMake报“Compatible with CMake < 2.8.12 will be removed“问题

今天在使用CMake编译zlib开源库时&#xff0c;弹出编译警告"Compatibility with CMake < 2.8.12 will be removed from a future "&#xff0c;如图(1)所示&#xff1a; 图(1) CMake报版本太低错误 将CMakeList.txt里的cmake版本调高 出现该问题的原因是&#xff…

2023.08.27 学习周报

文章目录 摘要文献阅读1.题目2.重点3.引言4.方法5.实验结果6.结论 深度学习Majorization-Minimization算法1.基本思想2.要求3.示意图 总结 摘要 This week, I read a computer science on the prediction of atmospheric pollutants in urban environments based on coupled d…

PostgreSQL命令行工具psql常用命令

1. 概述 通常情况下操作数据库使用图形化客户端工具&#xff0c;在实际工作中&#xff0c;生产环境是不允许直接连接数据库主机&#xff0c;只能在跳板机上登录到Linux服务器才能连接数据库服务器&#xff0c;此时就需要使用到命令行工具。psql是PostgreSQL中的一个命令行交互…

达梦数据库修改超级管理员密码

ENABLE_LOCAL_OSAUTH0 开启认证 ENABLE_LOCAL_OSAUTH1不认证、免密登陆 谨慎操作 目录 修改账户密码 锁定解锁账户 登录成功 修改账户密码 alter user SYSDBA IDENTIFIED by "Passw0rd!!"; 锁定解锁账户 ALTER USER 用户名 ACCOUNT UNLOCK; 问题分析&#xff1a…

SD 总线引脚介绍

参考 https://www.cnblogs.com/justin-y-lin/p/12259851.html SD卡与TF卡的引脚定义 - 360文档中心

网络服务第一次作业

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆&#xff0c;能够实现客户端主机通过服务器端的redhat账户进行基于公钥验证方式的远程连接 timedatetectl---查看时间 修改配置文件 文件路径 vim /etc/chrony.conf-----修改服务…

学习ts(十)装饰器

定义 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c;访问符&#xff0c;属性或参数上&#xff0c;是一种在不改变原类和使用继承的情况下&#xff0c;动态的扩展对象功能。 装饰器使用expression形式&#xff0c;其中expression必须…

软考:中级软件设计师:网络类型与拓扑结构,网络规划与设计,ip地址与子网划分,特殊含义的IP地址

软考&#xff1a;中级软件设计师:网络类型与拓扑结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…

「料见」vol27.回顾 | 知名视觉SLAM专家高翔:一起来聊聊视觉SLAM在自动驾驶和机器人领域的实际应用

高翔老师继畅销书《视觉SLAM十四讲》之后&#xff0c;又推出了新作《自动驾驶与机器人中的SLAM技术》。该书自出版以来备受瞩目&#xff0c;为读者提供了关于SLAM技术的全面而深入的理解。 第27期“料见”闭门分享会&#xff0c;我“门”非常开心邀请到知名视觉SLAM专家———…

集合类的线程安全问题

集合类 原来的集合类,大部分都不是线程安全的 Vector, Stack, HashTable, 是线程安全的(不建议用), 其他的集合类不是线程安全的. 加了锁,不一定就是线程安全的,不加锁也不一定是线程不安全的,需要具体问题具体分析 虽然get,set方法都加了synchronized,但是如果不能正确使用,也…

RabbitMQ从原理到实战—基于Golang【万字详解】

文章目录 前言一、MQ是什么&#xff1f;优势劣势 二、MQ的用途1、应用解耦2、异步加速3、削峰填谷4、消息分发 三、RabbitMQ是什么1、AMQP 协议2、RabbitMQ 包含的要素3、RabbitMQ 基础架构 四、实战1、Simple模式(即最简单的收发模式)2、Work Queues 模型3、Publish/Subscribe…

ESP8266固件烧录

文章目录 硬件电路烧录工具完整固件资料+烧录工具硬件电路 烧写模式: GPIO0:0 此时通过REST复位引脚复位,8266进入烧写模式。 烧写通过串口烧写,波特率设置115200 运行模式: GPIO0:1 此时通过REST复位引脚复位,8266进入烧写模式。 烧录工具 烧写工具下载链接:https:…

Python功能制作之简单的绘画板

可能需要安装的库 pip install pillow pip install tk制作 我们使用Python的Tkinter库创建的一个简单绘画软件。 首先创建了一个简单的绘画应用&#xff0c;可以选择颜色、切换画笔和橡皮擦模式、清空画布以及绘制自由曲线。 里面的主要结构和功能是&#xff1a; 导入必要的…

计算机组成原理(主存储器的基本组成、 运算器的基本组成、 控制器的基本组成、完成一条指令的三个阶段)

主存储器的基本组成&#xff1a; 这个是读数据操作图&#xff1a; 读入数据与菜鸟驿站的取货流程差不多&#xff1a; 写入数据的过程与读入数据类似&#xff1a; 1、cpu 指明想要写入到那个位置&#xff08;写到MAR中&#xff09; 2、想要写入的数据会放到MDR中 3、c…

ctfshow-web-红包题第七弹

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先上来访问就是phpinfo。常规思路先扫一下目录。 发现一个.git文件403&#xff0c;这种情况通常都是存在文件夹&#xff0c;但是不能直接访问文件夹导致的。那么我们可以使用git_extract工具进行获取内容。…

WSL2连接不了外网怎么办?

某天忽然WLAN变成地球图标&#xff0c;上不了Internet&#xff0c;搞了半天网络适配器&#xff0c;仍然不行。回忆之前做过的操作&#xff0c;曾经运行过ZoogVPN&#xff0c;试着启动并连接&#xff0c;然后退出&#xff0c;WLAN神奇地恢复了连接&#xff0c;可以上Internet了。…

leetcode题解 滑动窗口总结

一、解题思路 滑动窗口使用思路&#xff08;寻找最长&#xff09; ——核心&#xff1a;左右双指针&#xff08;left&#xff0c;right&#xff09;在起始点&#xff0c;right向右逐位滑动循环 ——每次滑动过程中 如果&#xff1a;窗口内满足条件&#xff0c;right向右扩大…