RN8209C单相计量芯片使用心得

由于项目需求,最近使用了一下RN8209C单相电量计量芯片,用STM32读取外接用电器的有效功率。第一次接触肯定是看技术手册。
RN8209C技术手册V1.5
单相计量芯片应用笔记
手册中有电路设计方案,寄存器使用介绍。
下面直接上干货,由于我负责编写驱动程序,所以电路设计就不说了,按官方给的方案就行。

  1. STM32 UART配置
    RN8209C只支持串口通信,不支持SPI。注意需要把UART配置为9位,一位停止位,偶校验。固定波特率4800。
//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能USART2//USART2_TX  GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;   //PA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率50MGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);      //初始化GPIOA.2//USART2_RX  GPIOA.3GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3//USART2初始化配置USART_InitStructure.USART_BaudRate = 4800;//波特率4800USART_InitStructure.USART_WordLength = USART_WordLength_9b;//数据9位,偶校验算一位USART_InitStructure.USART_StopBits = USART_StopBits_1;//一位停止位USART_InitStructure.USART_Parity = USART_Parity_Even;//偶校验USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //收发模式USART_Init(USART2, &USART_InitStructure); //初始化UART2//USART2 NVIC初始化NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接收中断,RXNE读寄存器非空USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//使能接收一帧数据中断USART_ITConfig(USART2, USART_IT_TC, ENABLE);//开启发送中断,TC发送完成USART_Cmd(USART2, ENABLE);//使能串口2
  1. RN8209C复位
    RN8209C支持两只复位方式,一种是发送复位命令复位,另一种是拉低复位引脚25ms以上,复位引脚复用它的串口接收(RX)口,所以拉低STM32的TX端口25ms,然后拉高20ms,完成复位。上电执行复位时,先复位再初始化串口。
 GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//GPIOA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率50MGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2GPIO_ResetBits(GPIOA, GPIO_Pin_2);//RN8209C复位引脚拉低g_IRn8209C.Delay_ms(25);//延时25mm  GPIO_SetBits(GPIOA, GPIO_Pin_2);//RN8209C复位引脚拉高,复位结束  g_IRn8209C.Delay_ms(20);
  1. RN8209C写操作
    写操作就是给它相应的寄存器里发送值,用串口发送一帧数据包括 寄存器地址,数据,校验码。校验码如何算手册中有,这里就不啰嗦了。
    注意:
    (1)发送时高字节在前,低字节再后,写操作最高字节最高位为1,即寄存器地址|0x80;
    (2)写操作前必须先发送写使能命令 EA E5 30,EA是地址,E5是命令,30是校验码
    (3)使用前可以先测试一下芯片和MCU是否通信正常,发送 0X7F,如果收到
    “82 09 00 F5” 说明通信正常。

  2. 写校表参数
    校表参数的计算我就不说了,手册和笔记中有,如果你和我一样没有标准校表平台,需要的数据又不需要特别精确,可以用一块电子计量插座读出此时外部用电器的功率Pa,然后读出此时芯片功率寄存器中的值Pb,计算出Kp=Pa/Pb;(Kp可多次测量求平均值),下次直接用寄存器的值乘Kp就是功率有效值。
    校表参数写之前先写使能,等待使能命令发送完成后逐一发送要写的命令,而且必须等待前一个发送完成才能发送后一个,此处我用的是发送中断,发送完成后置标志位,while等待,如果标志位置位则继续发送下一个(备注:我用延时不行,可能延时不准确,两帧数据间的间隔有要求)

u8 Temp_wreg[1] = {0xE5}; //写使能     0xEAg_IRn8209C.RN_Write(0xEA, Temp_wreg, 1); //g_IRn8209C.RN_Read(0x7F, NULL, 0);//通讯测试命令,RN8209回复 82 09 00 F5           u8 Temp_syscon[2] = {0x55, 0x16};//SYSCON 电流通道B开启,电流A,B,电压增益为2倍      0x00g_IRn8209C.RN_Write(0x00, Temp_syscon, 2);u8 Temp_emucon[2] = {0x03, 0x28};//正反累加,无负g_IRn8209C.RN_Write(0x01, Temp_emucon, 2);u8 Temp_emucon2[2] = {0xC0, 0x00};//更新速度13.982hzg_IRn8209C.RN_Write(0x17, Temp_emucon2, 2);u8 Temp_hfconst[2] = {0xC1, 0xA7};//HFConstg_IRn8209C.RN_Write(0x02, Temp_hfconst, 2);u8 Temp_gpqa[2] = {0x7B, 0xFE};g_IRn8209C.RN_Write(0x05, Temp_gpqa, 2);u8 Temp_gpqb[2] = {0x7B, 0xFE};g_IRn8209C.RN_Write(0x06, Temp_gpqb, 2);u8 Temp_phsa[1] = {0x06};//0x06g_IRn8209C.RN_Write(0x07, Temp_phsa, 1);u8 Temp_phsb[1] = {0x06};//0x06g_IRn8209C.RN_Write(0x08, Temp_phsb, 1);u8 Temp_aposa[2] = {0xF1, 0x0A};//APOSA有功offsetg_IRn8209C.RN_Write(0x0A, Temp_aposa, 2);u8 Temp_aposb[2] = {0xF1, 0x0A};//APOSB有功offsetg_IRn8209C.RN_Write(0x0B, Temp_aposb, 2);u8 Temp_iarmsos[2] = {0xA4, 0xEB};//IARMSOS有效offsetg_IRn8209C.RN_Write(0x0E, Temp_iarmsos, 2);u8 Temp_disw[1] = {0xDC};//写保护g_IRn8209C.RN_Write(0xEA, Temp_disw, 1);
//发送完成while检测g_IRn8209C.RN_Send();while(!g_IRn8209C.SendFinsh);
  1. 读数据
    读数据比较简单,只需要发送要读寄存器的地址即可

这些坑你们也可能遇到

我驱这个芯片的时候遇到了很多坑,而且网上关于这芯片的资料太少了,基本上都出自一处。如果你们遇到和我一样的问题那你就很幸运了,这些问题我都解决了。
一、读出的功率值为负数,即最高位为1,手册上说如果读到为负需要舍去…,如果你的电路已经确定了,你也不想再改电路的话那就和我一样用程序解决。
经过我的“大数据“分析,我发现即便是负数它也是线性变化的,只是因为采样电流的方向反了,我们只需要按照补码转原码的方式求出原码即可,然后按照我第4点中的方法求出Kp和功率即可。
二、能读出数据但是就是写不进去,连写使能命令都写不进去,如果你也遇到这个问题,请按如下步骤检查。
1、最高位是否置1
2、请先检查你的写命令的函数,因为读操作只需要发送一字节数据,而写操作至少需要发送三字节,检查串口发送的时候是否出现漏字节,重复发送或多发的问题,串口发送一定要及时清空标志位。
3、发送的每一帧数据之间是否等待了发送完成,建议不要用延时,用while堵塞检测是否发送完成。
4、校验码计算是否正确
5、串口配置是否正确,波特率,偶校验,停止位,9位数据
6、如果你检测到还是不能写操作那建议你换芯片喽。
三、如果你需要连续读取有效值,但是发现读出的值不正确,抖动很大,那么请你这样操作。
1、连续读取的周期必须大于有效值的更新周期,13.982hz下周期为71.5ms,3.495hz下周期为286ms,所以必须等更新完成再读。
2、每次读操作前都进行一次校表参数配置,并且读0X2D寄存器的值看校表是否完成,有效值是否能用。

我的心得总结完了,希望能给你们带来一丝的帮助,如果里面说的没有你遇到的 问题,手册中也没有介绍到,你可以留言我们共同探讨,如果我这篇文章对你有帮助请支持我一下,谢谢,祝你早日解决BUG

stm32 + RN8209C单相计量芯片使用心得相关推荐

  1. 单相计量芯片RN8209C串口应用模块,百万级产品实测

    1 芯片介绍 1.1 芯片特性 1. 计量 提供三路Σ-△ADC 有功电能误差在8000:1动态范围内<0.1%,支持IEC62053-22:2003标准要求 无功电能误差在8000:1动态范围 ...

  2. 电能计量芯片应用心得之选型篇

    电能计量芯片应用心得之选型篇 什么是计量芯片 计量芯片是测量交流电信号的一类芯片,因最早是使用于电表产品,所以在行业内也俗称电表芯片,它可以统计用电负载的用电量.测量用电负载的功率大小和电流大小,以及 ...

  3. 单相计量芯片RN8209D使用经验分享(转)

    单相计量芯片RN8209D使用经验分享 转载于:https://www.cnblogs.com/LittleTiger/p/10736060.html

  4. 计量芯片应用心得之软件篇

    本文内容是我从对电表芯片应用中,积累的一些经验,以便于工程师朋友可以对计量芯片有更多的了解,在应用过程中能够有一些帮助和收获.我们以HLW8110为例,讲一讲软件处理前需要知道的一些芯片原理,和在软件 ...

  5. 计量芯片应用心得之硬件篇

    在计量芯片的应用过程中,我发现大多工程师朋友对给计量芯片的供电方式有疑问,尤其是在使用分流电阻采样方式设计原理图,对供电电源使用方式会进入一个误区,这个原因多是基于从安全角度考虑时引起的. ##电阻采 ...

  6. 免校准的电量计量芯片_技术 | 免校准电能计量芯片,让家电智能化更简单

    物联网时代,随着人们对节能环保,以及电器安全使用意识的提高,"能源智慧管理"."设备故障预判"."智能诊断"成为了智能电器产品的热门口号. ...

  7. 免校准的电量计量芯片_免校准电能计量芯片,让家电智能化更简单

    原标题:免校准电能计量芯片,让家电智能化更简单 物联网时代,随着人们对节能环保,以及电器安全使用意识的提高,"能源智慧管理"."设备故障预判"."智能 ...

  8. cse7761电能计量芯片驱动程序

    stm32+CSE7761电能芯片驱动 这篇文章介绍CSE7761电能计量芯片的驱动和应用的部分程序,如需要完整解决方案(电压.电流.功率.电量.过载.过零.漏电),请私信. spi引脚配置 GPIO ...

  9. 关于钜泉光电ATT7053C计量芯片使用的若干经验

    大家好!第一次写东西,完全是当作自己的一个笔记来写的,笔法不成熟,有些凌乱.如果对一些小伙伴有所帮助的话是我的荣幸,也欢迎各位小伙伴指出其中的问题. 首先说一下,使用这款芯片呢是因为一个项目需求,之前 ...

最新文章

  1. lua学习笔记之垃圾收集
  2. HINSTANCE和HANDLE的区别
  3. 2017西安交大ACM小学期 刷墙[折半枚举+异或]
  4. 具有ELK的APIGEE API网关日志管理(Elastic Search,Logstash和Kibana)
  5. 如何打造高效的多任务、高并发的网络服务器系统?
  6. 纯CSS实现table表头固定(自创备忘)
  7. 如何实现用Delphi访问Outlook Express的收发邮件箱中的邮件?
  8. stylus vue 报错_带你玩转webpack 从零构建Vue工程
  9. 如何干净完整卸载office2010
  10. 东芝B-SX5T标签打印机安装过程
  11. 所有网站都是用虚拟服务器吗,哪类网站不适合使用虚拟主机?
  12. ztree 更新配置后重新渲染树_zTree 树形控件 ajax动态加载数据
  13. 云计算作为一种新型的IT服务资源,主要分为几种服务类型
  14. Android 去掉标题栏
  15. 解决docker中启动Spring Boot微服务注册在Eureka后无法访问的问题
  16. MySQL数据库(一)服务器数据库的搭建和远程访问
  17. Java实现新浪微博第三方登录
  18. php参考文献博客,科学网—博客文章可否作为参考文献引用? - 王德华的博文
  19. 递归算法中的时间复杂度分析
  20. Oracle收款核销了怎么撤销,21应收收款-核销取消或核销调整

热门文章

  1. 基因组学中的深度学习
  2. 高压直流电源系统(直流ups)有哪些特点?
  3. 最新网站外链建设方法大全!
  4. 开关电源的缓启动Soft Start
  5. Windows 10 任务管理器重置偏好设置
  6. 【蓝桥杯摆烂篇】蓝桥模拟赛【摆烂day3】
  7. 从开辟蓝海到保卫蓝海(一)
  8. Python的函数返回值和参数
  9. 速卖通产品如何推广引流?速卖通如何引流?
  10. JEM software ticket45:Console output error of nQP when LCU level rate control is enabled