stm32 + RN8209C单相计量芯片使用心得_rn8209c程序-程序员宅基地

技术标签: STM32驱RN8209  RN8209C单相计量芯片使用心得  计量芯片驱动程序  

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.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;   //PA.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率50M
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);      //初始化GPIOA.2
    //USART2_RX  GPIOA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
    
    //USART2初始化配置
    USART_InitStructure.USART_BaudRate = 4800;//波特率4800
    USART_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.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率50M
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
    GPIO_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}; //写使能     0xEA
         g_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倍      0x00
         g_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.982hz
         g_IRn8209C.RN_Write(0x17, Temp_emucon2, 2);
         
         u8 Temp_hfconst[2] = {
    0xC1, 0xA7};//HFConst
         g_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};//0x06
         g_IRn8209C.RN_Write(0x07, Temp_phsa, 1);
         
         u8 Temp_phsb[1] = {
    0x06};//0x06
         g_IRn8209C.RN_Write(0x08, Temp_phsb, 1);
         
         u8 Temp_aposa[2] = {
    0xF1, 0x0A};//APOSA有功offset
         g_IRn8209C.RN_Write(0x0A, Temp_aposa, 2);
         
         u8 Temp_aposb[2] = {
    0xF1, 0x0A};//APOSB有功offset
         g_IRn8209C.RN_Write(0x0B, Temp_aposb, 2);
         
         u8 Temp_iarmsos[2] = {
    0xA4, 0xEB};//IARMSOS有效offset
         g_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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33315912/article/details/83382008

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search