计量芯片 RN7302 使用流程简介(寄存器配置流程)

RN7302用户手册下载地址:
https://u20002878.pipipan.com/fs/20002878-374667856

这个芯片使用spi通讯,建议每次进行写寄存器操作的时候,都要先关闭写保护,写完后再打开写保护。
关闭写保护 (0xe5 是写入数据,0x0180 是写入地址,1是写入字节数)
0xe5 0x0180 1
开启写保护
0xdc 0x0180 1
废话不多说,直接上流程~

1、芯片上电

关闭写保护

2、芯片软复位
写入数据0xFA,
写入地址0x0182
字节数1

3、选择模式(三相三线还是四线制)
写入数据:0x00表示三相四线,0x33表示三相三线
写入地址 0x0186
写入 1 个字节

4、切换到EMM模式(可以理解为计量模式)
写入数据:0xA2
写入地址 :0x0181
写入 1 个字节

5、设置CF1Cfg寄存器,具体作用看手册
写入数据:0
写入地址 :0x0160
写入 3 个字节

如果要计量电量的话,还要配置以下内容

6、HFConst1
写入数据:480
写入地址 :0x100
写入 2 个字节

7、HFConst2
写入数据:480
写入地址 :0x101
写入 2 个字节

8、使能ABC有功能量计算
写入数据:0x07
写入地址 :0x162
写入 3 个字节

9、配置通道使能等参数,具体看手册
写入数据:0x400000
写入地址 :0x0161
写入 3 个字节

打开写保护

然后是读取采样数据,除了电量是读了清0,其他参数都可以随便读取,然后校准~~

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用STM32和RN7302计量芯片测量电流的示例代码: ```C #include "stm32f4xx.h" #include "stdio.h" #define RN7302_ADDR 0x88 I2C_HandleTypeDef hi2c1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); uint8_t data[2]; uint16_t current; while (1) { // 发送读取电流的指令 data[0] = 0x00; data[1] = 0x13; HAL_I2C_Master_Transmit(&hi2c1, RN7302_ADDR, data, 2, 1000); // 读取电流值 HAL_I2C_Master_Receive(&hi2c1, RN7302_ADDR, data, 2, 1000); current = ((uint16_t)data[0] << 8) | data[1]; // 将电流值转换为实际电流值 float real_current = (float)current * 0.0002; // 输出电流值 printf("Current: %.2f A\n", real_current); HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 16; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 在此示例中,我们使用STM32的I2C接口与RN7302计量芯片通信。代码使用HAL库进行编写,通过发送指令并读取响应来获取电流值。在读取电流值后,我们将其转换为实际电流值,并通过串口输出。为了使代码更加易于理解,我们在代码中使用了一些宏定义,例如RN7302_ADDR表示RN7302的I2C地址。 请注意,此示例代码仅供参考。要使用此代码,请根据实际硬件连接和RN7302寄存器映射进行适当修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值