ADC芯片CS1238,CS1237介绍和代码

2023-11-06

一.芯片介绍

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的输入只有一组差分输入。最后附上工程代码和资料,需要的可以联系我(不是白嫖的)。
在这里插入图片描述

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

ADC芯片CS1238,CS1237介绍和代码 的相关文章

  • MapReduce处理csv

    MapReduce处理csv csv是由逗号 来分割的文件 在编写Mapper类的时候需要以 分割成一个个的数据 查看一下csv数据 以上是为了测试做的数据 要处理的结果就是经过mapreduce再原封不动的出来 因为是测试 所以内容不做任
  • 搭建虚拟专网络服务器

    搭建虚拟专网络服务器 准备环境 一台windows server2008R2 服务器 没有安装ad域服务的 IP地址为 192 168 4 92 一台物理机windows 10 家庭版 1 首先安装 网络策略和访问服务 第二步 勾选上远程访
  • 为什么普通人赚钱这么难?普通人的赚钱之路在哪里

    前几天听一个老家的朋友说 辛辛苦苦一整年 发现并没有赚到什么钱 付出与收入不成正比 首先要知道勤奋 努力并不一定就能够赚到钱 像送外卖的 工地上班的 厂里上班的哪个不勤奋 但他们即使非常努力工作一个月 扣除基本开支 也存不了多少钱 那普通人
  • GNS3-GREvpn

    GREvpn 发一下这些日忙的东西 实验拓扑 以R2为界限的左半边运行ospf 各个链路已经ping通 用R7模拟PC1 PC1和R2的f0 0来回链路没问题 右半边同左半边做相应的配置也成功ping通 在R2和R3之间建立vpn隧道 网段

随机推荐

  • 利用Matlab绘制图像中的某一行或者某一列的灰度曲线

    filename C Users Administrator Desktop 透视变换 包含裂缝的整个图片 123 jpg imgData imread filename imshow imgData 该函数可以用来显示已经读入的数据 A
  • 解决AD中pcb原件移动提示绿色报错问题

    有可能以下三个原因之一所导致的 1 不符合DRC规则 比如原件之间距离过近 就是报错 2 右下角ROOM没有删除 右键清楚就可以啦 3 如果以上两个确证都是正常的 还是报错的话 终极解决方案 step1 在pcb界面下 点击design n
  • 主线3.1DeepFM模型论文阅读:DeepFM: A Factorization-Machine based Neural Network for CTR Prediction

    文章目录 一 摘要 二 模型演变和各模型间的对比 1 CTR的任务要求 2 DeepFM模型的引入 3 各模型间的对比 4 DeepFM优势 三 DeepFM模型介绍 1 FM部分 2 Deep部分 一 摘要 对于一个基于CTR预估的推荐系
  • selenium小项目实践

    1 斗鱼爬虫 爬取斗鱼直播平台的所有房间信息 游戏直播 全部游戏直播 斗鱼直播 1 1 思路分析 数据的位置 每个房间的数据都在id live list contentbox的ul中 实现翻页和控制程序结束 selenium中通过点击就可以
  • 基于麻雀搜索算法(SSA)优化长短期记忆神经网络参数SSA-LSTM冷、热、电负荷预测(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 冷负荷 2 2 热负荷 2 3 电负荷 3 参考文献 4 Python代码 数据 1
  • 虚拟滚动之原理及其封装

    本文分享自微信公众号 一Li小麦 gh c88159ec1309 作者 一li小麦 目前GitHub上只放出demo的版本 将在 https github com dangjingtao vList git 持续更新 前端的业务开发中会遇到
  • python输入输出+文件+OS

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 Python输入和输出 输出格式美化 Python三种输出值的方式 表达式语句 p
  • BSN区块链服务网络底十六章

    1 1 简介 服务网络的设计和建设理念完全借鉴互联网 互联网是由TCP IP协议将所有数据中心连接而形成的 服务网络是通过建立一套区块链运行环境协议将所有数据中心连接而组成 与互联网一样 服务网络也是跨云服务 跨门户 跨底层框架的全球性基础
  • MPEG I,B,P的顺序

    MPEG视频压缩算法的特点 数字化后的数据量之大非常惊人 如果不对原始视频图像数据进行压缩 则在与VCD 相同的光盘上只能存储20秒钟的中等分辨率 彩色视频图像 和JVC公司在制定VCD标准时采用了MPEG 1数字图像压缩编码国际标准 IS
  • 【Matlab】矩阵操作

    矩阵操作 生成矩阵 生成行矩阵的方式 冒号表达式 x 1 1 5 1 2 3 4 5 以步长为1 从1到5生成数值 构成行矩阵 若不设置步长 则默认步长为1 linspace a b n linspace 1 5 5 1 2 3 4 5 从
  • JavaScript typeof操作符确认数据类型

    返回 number typeof 1 typeof new Date getTime 返回 undefiend typeof undefined typeof console log 1 先打印1 再打印 undefined 返回 stri
  • Xilinx ISE、MicroBlaze系列教程

    本文是Xilinx MicroBlaze系列教程的第0篇文章 这个系列文章是我个人最近两年使用Xilinx MicroBlaze软核的经验和笔记 以Xilinx ISE 14 7和Spartan 6 Vivado 2018 3和Artix
  • 《TCP/IP网络编程》阅读笔记--并发多进程服务端的使用

    目录 1 并发服务器端 2 进程 2 1 进程的相关概念 2 2 fork 创建进程 2 3 僵尸进程 2 4 wait 和waitpid 销毁僵尸进程 3 信号处理 3 1 signal 函数 3 2 sigaction 函数 3 3 利
  • 熵权法stata程序

    Edited by Linhao Cui 公式部分参考 https wenku baidu com view a2600818bd64783e09122bf6 html 仅供学习交流使用 如有疑问或者问题 欢迎质疑讨论 如有侵权 请联系撤回
  • python 监听 其他程序发消息_python进程之间消息监控程序

    外界调用向mgr进程发送消息 mgr根据不同消息启动或关闭相应进程 启动的进程 独占用 只启动一个 若有进程程退出 则mgr向外界发出信号 外界代码 usr bin python coding utf 8 import sys import
  • 【python环境搭建】一台电脑下安装不同python版本时如何安装模块

    我的环境中安装了2个版本的python 一个时Anaconda的 一个是python3 10 多个版本python的安装 卸载 pip使用 详细方法可以看这个贴子 Windows环境同时安装多个版本的Python解释器 pip的使用 安装p
  • 网络安全笔记6——数字证书与公钥基础设施

    网络安全笔记6 数字证书与公钥基础设施 参考课程 中国大学MOOC 网络安全 北京航空航天大学 文章目录 网络安全笔记6 数字证书与公钥基础设施 公钥基础设施 PKI 证书机构CA Certificate Authority 注册机构RA
  • unity 从本地文件夹获取图片并赋值给UI作为贴图

    1 引用命名空间 2 首先定义变量 public string Path Assets Textures Logo public string texname nike png private Texture2D m Tex 3 然后在St
  • 解决浏览器隐私链接“NET::ERR_CERT_AUTHORITY_INVALID“

    问题 相信大家都遇到过这种问题 访问某个网站 无论正经 or 不正经 偶尔都会弹出此页面 此时要么是关闭此网页 要么是继续前往 偶尔一两次还行 如果次数多了就会很烦人 解决方式 地址栏输入 chrome net internals hsts
  • ADC芯片CS1238,CS1237介绍和代码

    一 芯片介绍 CS1238是一款高精度 低功耗 模数转换芯片 两路差分输入通道 内置温度传感器和高精度振荡器 MCU可以通过2线的SPI 接口SCLK DRDY与CS1237进行通信 对其进行配置 例如通道选择 PGA选择 输出速率选择等