GD32F303RET6读取SGM58031电压值

news2024/9/20 14:42:00

1、SGM58031芯片详解

(1)SGM58031是一款低功耗,16位精度,delta-sigma (ΔΣ)模数转换器(ADC)。它从3V到5.5V供电。


(2)SGM58031包含一个片上参考和振荡器。它有一个I2C兼容接口,可以选择四个I2C从地址。

(3)SGM58031有两种工作模式:单次发射模式和连续转换模式。
在单次触发模式下,ADC执行一次转换并给出完整的固定数据,无需丢弃任何数据。一旦ADC完成转换,它就会进入低功率关闭模式。
在连续模式中,ADC在先前的转换完成后自动开始新的转换。给出了每一个转换结果。数据速率等于配置的数据速率。

(4)SGM58031的引脚说明

(5)参考电压

2、SGM58031工程代码编写

iic.c

#include "iic.h"

#define I2C1_SLAVE_ADDRESS7 0x90

void i2c_config(void)
{
	/* enable GPIOB clock */
    rcu_periph_clock_enable(RCU_GPIOB);
	
    /* enable I2C1 clock */
    rcu_periph_clock_enable(RCU_I2C1);
	rcu_periph_clock_enable(RCU_AF);
	
	/* connect PB10 to I2C1_SCL */
    /* connect PB11 to I2C1_SDA */
    gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ,  GPIO_PIN_10 | GPIO_PIN_11);
	
    i2c_clock_config(I2C1, 100000, I2C_DTCY_2);
    i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_SLAVE_ADDRESS7);
    i2c_enable(I2C1);
    i2c_ack_config(I2C1, I2C_ACK_ENABLE);
}

/* I2C写函数 */
void i2c_write(uint8_t reg_addr, uint16_t send_data)
{
		
	uint8_t high_val=0x00;
	uint8_t low_val=0x00;
	
	low_val = send_data&0x00ff;				
	high_val = (send_data>>8)&0x00ff;

    //写开始时序
	/* wait until i2c bus is idle */
	while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY));
	/* send a start condition to I2C bus */
	i2c_start_on_bus(I2C1);
	/* wait until SBSEND bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));    
	/* send slave address to I2C bus */

    //写从机地址时序
	i2c_master_addressing(I2C1, I2C1_SLAVE_ADDRESS7, I2C_TRANSMITTER);
	/* wait until ADDSEND bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
	/* clear ADDSEND bit */
	i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
	/* wait until the transmit data buffer is empty */
	while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));

    //写寄存器地址时序
	i2c_data_transmit(I2C1, reg_addr);
	/* wait until the TBE bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_BTC));
	
    //写 写入数据 时序
	/* data transmission */
	i2c_data_transmit(I2C1, high_val);//先发送高8位数据
	/* wait until the TBE bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_BTC));
	i2c_data_transmit(I2C1, low_val);//再发送低8位数据
	/* wait until the TBE bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_BTC));
	
    //写停止时序	
	/* send a stop condition to I2C bus */
	i2c_stop_on_bus(I2C1);
	/* wait until stop condition generate */ 
	while(I2C_CTL0(I2C1)&0x0200);
}


/* I2C读函数 */
uint16_t i2c_read_byte(uint8_t reg_addr)
{
	uint8_t high_val=0x00;
	uint8_t low_val=0x00;
	uint16_t recv_val = 0x0000;

    //写开始时序
	/* wait until i2c bus is idle */
	while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY));
	/* send a start condition to I2C bus */
	i2c_start_on_bus(I2C1);
	/* wait until SBSEND bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));    

    //写 从机地址+写 时序
	/* send slave address to I2C bus */
	i2c_master_addressing(I2C1, I2C1_SLAVE_ADDRESS7, I2C_TRANSMITTER);
	/* wait until ADDSEND bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
	/* clear ADDSEND bit */
	i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
	/* wait until the transmit data buffer is empty */
	while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
	
    //写 读寄存器地址 时序
	i2c_data_transmit(I2C1, reg_addr);
	/* wait until the BTC bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_BTC));
	
    //写停止时序
	i2c_stop_on_bus(I2C1);
	while(I2C_CTL0(I2C1)&0x0200);
	
    //写开始时序	
	i2c_start_on_bus(I2C1);
	/* wait until SBSEND bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));

    //写 从机地址+读 时序
	/* send slave address to I2C bus */
	i2c_master_addressing(I2C1, I2C1_SLAVE_ADDRESS7, I2C_RECEIVER);
	/* wait until ADDSEND bit is set */
	while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
	/* clear the ADDSEND bit */
	i2c_flag_clear(I2C1,I2C_FLAG_ADDSEND);
	/* wait until the RBNE bit is set	and clear it*/
	while(!i2c_flag_get(I2C1, I2C_FLAG_RBNE));
	
    //接收数据 时序
	high_val = i2c_data_receive(I2C1);
	while(!i2c_flag_get(I2C1, I2C_FLAG_RBNE));
	i2c_ack_config(I2C1, I2C_ACK_DISABLE);
    i2c_ackpos_config(I2C1,I2C_ACKPOS_NEXT);
	
	low_val = i2c_data_receive(I2C1);
	/* wait until the BTC bit is set */
	//while(!i2c_flag_get(I2C1, I2C_FLAG_BTC));代码卡死,屏蔽后不卡死,可以成功读取数据		

    //写停止时序
	/* send a stop condition to I2C bus */
	i2c_stop_on_bus(I2C1);
	/* wait until stop condition generate */ 
	while(I2C_CTL0(I2C1)&0x0200);

	recv_val = (high_val<<8)|low_val;
	
	i2c_ack_config(I2C1, I2C_ACK_ENABLE);

	return recv_val;
}

iic.h

#ifndef __IIC_H
#define __IIC_H

#include "gd32f30x.h"
#include "string.h"

void i2c_config(void);
void i2c_write(uint8_t reg_addr, uint16_t send_data);
uint16_t i2c_read_byte(uint8_t reg_addr);

#endif

main.c

    // 使能 RDY输出功能
	i2c_write(0x03,0x8000); // Write 0x8000 to Hi_Thresh
	i2c_write(0x02,0x0000); // Write  0x0000  to Lo_Thresh
	
	// 配置ADC输入, 启动连续转换模式
	i2c_write(0x01,0xC4e0);//Write config, OS=1, AIN0 to GND, G=2(+/-2.048V input range),
									 //continuous mode conversion, DR=800, others default 
									 //COMP_QUE = 00

	
    Vbat = i2c_read_byte(0x00);//读取电压值

    //转换  Vbat/65535*参考电压(比如4.096V)

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

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

相关文章

keepalived高可用集群

一、keepalived&#xff1a; 1.keepalive是lvs集群中的高可用架构&#xff0c;只是针对调度器的高可用&#xff0c;基于vrrp来实现调度器的主和备&#xff0c;也就是高可用的HA架构&#xff1b;设置一台主调度器和一台备调度器&#xff0c;在主调度器正常工作的时候&#xff0…

如何抓取和处理天气网站数据

目的 在进行气象研究时&#xff0c;获取准确的历史天气数据是至关重要的。本文将分享如何从天气网站收集数据并将其转化为表格形式&#xff0c;以便于后续分析。然而&#xff0c;在直接抓取数据时&#xff0c;可能会遇到API接口保护的问题。本文将详细解释解决这些问题的步骤&…

【人工智能】-- 受限玻尔兹曼机

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;受限玻尔兹曼机 &#x1f348;RBM的结构 &#x1f34d;RBM的架构图 &#x1f34d;RBM的经典实现 &…

“论软件维护方法及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后&#xff0c;直至软件被淘汰的整个时间范围内&#xff0c;为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中&#xff0c;软件需要维护的原因是多种多样的&#xff0c; 根据维护的原因不同&#xff0c;可以将软件维护…

AI版Siri要明年见,研究表明ChatGPT暂无法取代程序员,Kimi推出浏览器插件

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 根据彭博社记者马克古尔曼的最新消息&#xff0c;苹果公司今年不会推出全新的Apple Intelligence驱动的Siri&#xff0c;该公司计划在明年1月开始测试&#xff0c;并在iOS 18.4中才推出正式版本。 此前…

2.5 计算机网络

声明&#xff1a;文章参考的《系统架构设计师教程&#xff08;第二版&#xff09;》&#xff0c;如有侵权&#xff0c;本人将立即修改和删除。 利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来&#xff0c;并依靠网络软件以及通信协议实现…

[迫真保姆级教程]在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上

目录 前言 阅前提示 导言 使用基于vcpkg的&#xff0c;于msvc19编译器编译的Tessereact OCR动态库 使用vcpkg辅助我们的编译 正文 使用msys2环境下的&#xff0c;使用mingw64编译器编译的Tessereact OCR动态库 什么是msys2 安装前&#xff0c;我们也许。。。 [Option]…

入门PHP就来我这(高级)24 ~ Session判断用户登录

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 上一篇我们介绍了Session管理部分的概念&#xff0c;本文通过session来改写一些用户登录&…

git批量删除本地包含某字符串的特定分支

git批量删除本地包含某字符串的特定分支 git branch -a | grep 分支中包含的字符串 | xargs git branch -D git删除本地分支_git查看删除本地分支-CSDN博客文章浏览阅读989次。git branch -d <分支名>可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删…

防火墙基础实验

首先交换机配置 [LSW7]undo info-center enable [LSW7]vlan batch 2 3 [LSW7]int g0/0/2 [LSW7-GigabitEthernet0/0/2]port link-type access [LSW7-GigabitEthernet0/0/2]port default vlan 2 [LSW7-GigabitEthernet0/0/2]int g0/0/3 [LSW7-GigabitEthernet0/0/3]port link-…

静态时序分析:Leaf Cell(叶单元)

相关阅读​​​​​​​静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 在DC中&#xff0c;leaf cell&#xff08;叶单元&#xff09;有时会出现在描述中&#xff0c;例如set_input_delay的-reference_pin选项的参数&#xff0c;就必须是一个端口或…

怎么将mkv视频格式转为mp4?这四种转换方法你肯定要试试!

怎么将mkv视频格式转为mp4&#xff1f;你是否曾被MKV格式的魅力深深吸引&#xff0c;仿佛踏入了一个充满奇幻色彩的多媒体秘境&#xff0c;那里&#xff0c;音频如溪流潺潺&#xff0c;视频似画卷铺展&#xff0c;字幕则如同夜空中最亮的星&#xff0c;三者交织成一场视听盛宴&…

Doze和AppStandby白名单配置方法和说明

机制 配置路径 配置案例 说明 影响机制 调试命令 Doze /platform/frameworks/base /data/etc/platform.xml allow-in-power-save 【系统应用Doze白名单配置】 Doze\Job\AppStandby\Alarm\WakeLock\Sync 查看Doze白名单:adb shell dumpsys deviceidle 添加Doze白名单…

多输入多输出 | Matlab实现Transformer多输入多输出预测

多输入多输出 | Matlab实现Transformer多输入多输出预测 目录 多输入多输出 | Matlab实现Transformer多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现Transformer多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.da…

OS_同步与互斥

2024-07-04&#xff1a;操作系统同步与互斥学习笔记 第9节 同步与互斥 9.1 同步互斥的基本概念9.1.1 同步关系9.1.2 互斥关系9.1.3 临界资源9.1.4 临界区9.1.5 同步机制应遵循规则 9.2 软件同步机制9.2.1 单标志法9.2.2 双标志先检查法9.2.3 双标志后检查法9.2.4 peterson算法 …

windows安装Docker Desktop及国内镜像

简介 Docker 是一个开源的应用容器引擎&#xff0c;它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。通过Docker工具&#xff0c;简化了应用的部署、配置和管理过程&#xff0c;提高…

Python 核心编程

Python 核心编程 1. 数据类型1.1 整型 int1.2 浮点数 float1.3 布尔类型 bool1.4 字符串 str1.5 列表 list1.6 元组 tuple1.7 集合 set1.8 字典 dict 2. 逻辑结构、文件操作2.1 分支结构和三元表达2.2 循环和遍历2.3 目录和路径2.4 文件操作 3. 函数、类、异常处理3.1 函数3.2 …

int类型变量表示范围的计算原理

文章目录 1. 了解2. 为什么通常情况下int类型整数的取值范围是-2147483648 ~ 21474836473. int类型究竟占几个字节4. 推荐 1. 了解 通常情况下int类型变量占4个字节&#xff0c;1个字节有8位&#xff0c;每位都有0和1两种状态&#xff0c;所以int类型变量一共可以表示 2^32 种状…

p15 p16 c语言实现三子棋

具体的实现代码 game.c #include "game.h"void InitBoard(char board[ROW][COL], int row, int col) {int i 0;int j 0;for (i 0; i < row; i) {for (j 0; j < col; j) {board[i][j] ;}} }void DisplayBoard(char board[ROW][COL], int row, int col) …

C++:组合和继承的区别

组合介绍以及与继承对比 什么是组合 (1)composition&#xff0c;组合&#xff0c;就是在一个class内使用其他多个class的对象作为成员 (2)用class tree做案例讲解 (3)组合也是一种代码复用方法&#xff0c;本质也是结构体包含 #include <iostream> #include <vector…