GD32F303RET6读取SGM58031电压值

1、SGM58031芯片详解

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


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

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

(4)SGM58031的引脚说明

(5)参考电压

可以修改配置寄存器里面的值  来  配置FS的值,也就是参考电压的值,读转换寄存器0x00里面可以读取电压值,转换关系是  V=读取值/32768*FS

除以32768的原因是:SGM58031是一个16位精度的ADC采样,但是由于该芯片可以采集正负电压值,因为刻度是65536的一半,也就是15位

2、SGM58031寄存器详解

首先SGM58031有以下7个寄存器

第一个转换寄存器:用于存储ADC的转换结果

第二个配置寄存器:主要用于配置ADC的采样条件,如下所示,其中比特11-9的可编程增益放大器主要决定的是ADC采样的电压上限范围(其FS的值越大,其AD采样的精度就越小,因为刻度一定的情况下,参考电压越大,则每一个刻度代表的值越大),比如当我们出现不管怎样改变外界环境,读取到的电压值都是7FFF,那么说明我们需要修改配置,让FS的值增大。

 

第3和4个寄存器:低阈值寄存器和高阈值寄存器,主要用于模拟输入电压和阈值寄存器的值进行比较。(注:低阈值默认值=8000h,高阈值默认值=7FFFh。)

如果模拟输入电压 > 高阈值寄存器,则输出数字信号1

如果模拟输入电压 < 低阈值寄存器,则输出数字信号0

3、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)

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要配置STM32F303RET6,您需要按照以下步骤进行操作: 1. 安装STM32CubeMX:这是一个图形化配置工具,可帮助您轻松配置和生成STM32微控制器的初始化代码。您可以从STMicroelectronics的官方网站下载并安装它。 2. 打开STM32CubeMX并创建新项目:启动STM32CubeMX后,选择"New Project"选项,并选择相应的芯片型号(在这种情况下是STM32F303RET6)。 3. 配置引脚:使用STM32CubeMX的引脚配置选项,将芯片的引脚分配给您的应用程序所需的功能。例如,您可以将某些引脚配置为GPIO、UART、SPI等。 4. 配置时钟和系统设置:使用STM32CubeMX的时钟和系统配置选项,设置系统时钟和时钟源。您可以选择使用内部RC振荡器或外部晶体振荡器,并设置时钟分频器以获得所需的系统时钟频率。 5. 配置外设:根据您的应用程序需求,配置和启用所需的外设模块,例如USART、SPI、I2C、ADC等。使用STM32CubeMX的外设配置选项,您可以设置外设的参数和功能。 6. 生成代码:完成以上配置后,点击"Project"菜单中的"Generate Code"选项,生成初始化代码。您可以选择使用CubdeMX生成的代码作为基础,并在其上进行开发,或者将其集成到您现有的工程中。 以上是一个简单的STM32F303RET6配置的步骤示例。根据您的具体应用需求,您可能还需要进行其他配置和设置。建议您参考STMicroelectronics提供的文档和例程,以获取更详细的配置指南和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值