2024-10-10 12:07
61 次阅读|
0 个评论
01 概述 CSE7759B 为单相多功能计量芯片,其提供高频脉冲 CF 用于电能计量,通过 UART 可以直接读取电流、电压和功率的相关参数(如:系数、周期);串口波特率为 4800 bps(±2%),8 位数据,1 位偶校验,1 停止位。本芯片采用 SOP8 封装。 CSE7759B 使用 SOP8 封装。 02 芯片应用 如图 2 所示,在 CSE7759B 的电源端,应并联两个小电容,以滤除来自电网高频及低频噪声。电流信号通过锰铜电阻采样后接入 CSE7759B,电压信号则通过电阻网络后输入到 CSE7759B。 注:CSE7759B 为免校准电能计量芯片,芯片出厂校准后偏差为±2%,那么外部器件的精度最终影响客户产品的整体精度,图 2 中标识的 1%精度器件,其精度越高则客户整机精度越高。 从图 2 可看出,电流通道影响电流精度的元器件为 1mR 锰铜电阻,电压通道影响电压精度的元器件为 1M 电阻和与之相连的 1K 电阻,当这三个元器件精度均在±1%内时,则 CSE7759B 免校准整机误差可控制在±3%内。 电压通道 1M 电阻应选择耐高压 1000V 1%电阻(或更高精度);否则需拆分成 5 个 0805 1%(或更高精度)电阻。避免使用过程中由于电阻耐压值不够,造成整机损坏。 CSE7759B 部分采集强电信号,根据安规标准任何人体可能触碰的地方需进行隔离,图 2 中使用光耦隔离(客户自行选择隔离方式,并不限制)。 选择零线做地或火线做地均可,建议使用零线做地。 图 3 为 CSE7759B 非隔离方案,MCU 工作电压 3.3V。 若 MCU 工作电压 5V,则 TI 与 MCU 之间接 200R 电阻。 03 数据协议 用户可以通过 UART 串口协议(RI、TI)读取电压、电流、功率、电量的相关参数,通过运算得到电压、电流、功率、电量。目前该串口只支持 4800bps 的波特率(允许误差±2%),接收口 RI 暂时预留,没有实际功能。串口每隔 50ms 自动将电压系数、电压周期、电流系数、电流周期、功率系数、功率周期、校准次数、CF 脉冲个数的数据包通过 TI 发送(数据以十六进制发送)。数据包的具体格式为:包头(2*(1byte 数据+1bit 偶校验))→电压系数(3*(1byte 数据+1bit 偶校验))→电压周期(3*(1byte 数据+1bit 偶校验))→电流系数(3*(1byte 数据+1bit 偶校验))→电流周期(3*(1byte 数据+1bit 偶校验))→功率系数(3*(1byte 数据+1bit 偶校验))→功率周期(3*(1byte 数据+1bit 偶校验))→校准次数(1*(1byte 数据+1bit 偶校验))→CF 脉冲个数(2*(1byte数据+1bit 偶校验))→包尾(1byte 数据+1bit 偶校验)。共 24byte,4800bps 用时 54.912ms 将串口调试助手中接收到的数据提取出来,即 F2 5A 02 CD F8 06 DB 73 00 3F 70 03 CE 34 51 67 D8 B2 66 E6 61 00 00 BE F2 5A 02 CD F8 06 E0 30 00 3F 70 05 DA 3D 51 67 D8 6C E7 AB 61 00 00 97 F2 5A 02 CD F8 06 E0 30 00 3F 70 05 DA 3D 51 67 D8 6E 81 10 61 00 00 98 F2 5A 02 CD F8 06 E0 30 00 3F 70 05 DA 3D 51 67 D8 70 1A 75 61 00 00 98 F2 5A 02 CD F8 06 E0 30 00 3F 70 05 DA 3D 51 67 D8 71 B4 D9 61 00 00 97 按照“CSE7759B 用户手册 V1.1”文档 3.4 章节介绍,将第一次数据数据细化后为 F2 5A 包头 2 字节 02 CD F8 电压系数 3 字节 06 DB 73 电压周期 3 字节 00 3F 70 电流系数 3 字节 03 CE 34 电流周期 3 字节 51 67 D8 功率系数 3 字节 B2 66 E6 功率周期 3 字节 61 校准次数 1 字节 00 00 CF 脉冲个数 2 字节 BE 句尾 checksum1 1 字节 共 24 字节 注:由用户手册表 3-1 可知,每颗芯片的电压系数、电流系数、功率系数为固定值(第一行黑色粗体字)。 04 组件的使用 注意:芯片供电电压为5V,所以串口电平也是5V,接主控需要注意。串口波特率4800. 硬件使用开源 4G 空开 DTU 和 CSE7759B 评估板 1 Gitee链接地址 Demo位于amaziot_bloom_os_sdk\sample\3rd\6.0_CSE7759B Gitee源码地址:https://gitee.com/ning./hongdou Github源码地址:https://github.com/ayumid/hongdou 编译指令:.\build.bat -l .\amaziot_bloom_os_sdk\sample\3rd\6.0_CSE7759B 2 组件功能介绍 接收CSE7795B的串口数据,计算出电压,电流,功率等参数,并通过OLED实时显示。 3 代码讲解 1 am_ty_sw_deal_uart_data 功能:该函数用于,处理串口数据,从数据中计算出电压,电流,功率等参数。 参数: 参数 释义 inData 串口数据指针 recvlen 串口数据长度 返回值:1 正常,-1 错误 示例: if (uart_data.port == 0) am_ty_sw_deal_uart_data(uart_data.data,uart_data.len); 2 am_ty_sw_get_VIP_value 功能:该函数用于,获取电压、电流、功率的有限数据。 参数: 参数 释义 arr 参数数组 返回值:0 示例: voltage_t = am_ty_sw_get_VIP_value(voltage_a); 3 am_ty_sw_need_updata 功能:该函数用于,检测电压电流功率是否需要更新。 参数: 参数 释义 arr 当前参数 dat 保存的旧参数 返回值:无 示例: menu_handle_init(hMENU); // 初始化 4 am_ty_sw_updata_VIP_value 功能:该函数用于,更新电压、电流、功率的列表。 参数: 参数 释义 arr 参数数组 dat 更新值 返回值:无 示例: am_ty_sw_updata_VIP_value(voltage_a,voltage_t); 5 am_ty_sw_reset_VIP_value 功能:该函数用于,更新菜单选中下标。 参数: 参数 释义 arr 参数数组 dat 更新值 返回值:无 示例: am_ty_sw_reset_VIP_value(power_a,power_t); 4 Demo实战 4.1 创建一个Demo 复制4.2_hal_UART示例工程,到同一个文件夹下,修改文件名为6.0_CSE7759B,如图: 4.2 修改makefile 增加文件组件所在目录头文件路径,和源文件路径,如图: 4.3 增加头文件 使用代码编辑器,将新建的工程文件加入代码编辑器中,打开main.c,修改main.c,加入am.h等头文件,如图: 4.4 修改代码 在Phase2Inits_exit 创建一个任务,如图: 4.5 宏定义介绍 sample_uarts_uart_printf 输出日志到DEBUG 串口,日志比较少,可以输出到这个串口,如果日志比较多,需要输出到usb口,以免不必要的问题出现 sample_uarts_catstudio_printf 输出日志到USB 串口,使用catstudio查看,catstudio查看日志需要更新对应版本mdb.txt文件,软件打开filtter过滤日志,只查看用户输出的日志 SAMPLE_CSE7759B_TASK_STACK_SIZE 栈空间宏定义 4.6 全局变量介绍 sample_cse7795b_task_stack 任务栈空间,本例使用动态内存实现,用户在做项目时,可以预先估算下当先任务需要的大致栈空间,OS没有提供可以查看栈空间使用情况的API sample_cse7795b_task_ref 任务指针 sample_cse7759b_oled_stack_ptr 任务栈空间,本例使用动态内存实现,用户在做项目时,可以预先估算下当先任务需要的大致栈空间,OS没有提供可以查看栈空间使用情况的API sample_cse7759b_oled_task_ref OLED任务指针 4.7 函数介绍 Phase1Inits_enter 底层初始化,本例空 Phase1Inits_exit 底层初始化,本例空 Phase2Inits_enter 底层初始化,本例空 Phase2Inits_exit 创建主任务,初始化消息队列,定时器,任务等。 代码片段: OSA_STATUS status; sample_cse7759b_uart_printf("%s : starting...\n", __FUNCTION__, __LINE__); status = OSAMsgQCreate(&sample_cse7795b_msgq, "sample_cse7795b_msgq", sizeof(uartParam), 300, OS_FIFO); ASSERT(status == OS_SUCCESS); sample_cse7795b_task_stack = malloc(SAMPLE_CSE7759B_TASK_STACK_SIZE); ASSERT(sample_cse7795b_task_stack != NULL); status = OSATaskCreate(&sample_cse7795b_task_ref, sample_cse7795b_task_stack, SAMPLE_CSE7759B_TASK_STACK_SIZE, 82, "sample_cse7759b_uart_thread", sample_cse7759b_uart_thread, NULL); ASSERT(status == OS_SUCCESS); status = OSAMsgQCreate(&sample_cse7795b_oled_msgq, "sample_cse7795b_oled_msgq", sizeof(eleParam), 300, OS_FIFO); ASSERT(status == OS_SUCCESS); sample_cse7759b_oled_stack_ptr = malloc(SAMPLE_CSE7759B_OLED_STACK_SIZE); ASSERT(sample_cse7759b_oled_stack_ptr != NULL); status = OSATaskCreate(&sample_cse7759b_oled_task_ref, sample_cse7759b_oled_stack_ptr, SAMPLE_CSE7759B_OLED_STACK_SIZE, 100, "cse7759b_oled_task", sample_cse7759b_oled_task, NULL); ASSERT(status == OS_SUCCESS); sample_uarts_main_uart_recv_cbk 串口回调函数,提供给UART_OPEN 调用。 代码片段: { uartParam uart_data = {0}; OSA_STATUS osa_status; // UART_SEND_DATA(recv_data, recv_len); char *tempbuf = (char *)malloc(recv_len); memset(tempbuf, 0x0, recv_len); memcpy(tempbuf, (char *)recv_data, recv_len); // // sample_cse7759b_uart_printf("%s : recv_len:%d", __FUNCTION__, __LINE__, recv_len); uart_data.data = (UINT8 *)tempbuf; uart_data.len = recv_len; uart_data.port = 0; osa_status = OSAMsgQSend(sample_cse7795b_msgq, sizeof(uartParam), (UINT8*)&uart_data, OSA_NO_SUSPEND); ASSERT(osa_status == OS_SUCCESS); sample_cse7759b_uart_thread 串口数据接收任务,收到回调函数的消息后,处理消息中的数据。 代码片段: while (1) { memset(&uart_data, 0x00, sizeof(uartParam)); status = OSAMsgQRecv(sample_cse7795b_msgq, (UINT8 *)&uart_data, sizeof(uartParam), OSA_SUSPEND); //recv data from uart if (status == OS_SUCCESS) { if (uart_data.data) { // for(i = 0; i quantity; free(uart_data.data); uart_data.data = NULL; } } } sample_cse7759b_oled_task OLED任务,显示收到的电压,电流,功率,电量到OLED。 代码片段: quantity); drv_ssd1315_show_string(36, 0, (UINT8*)vol, 16, 1); drv_ssd1315_show_string(36, 16, (UINT8*)curr, 16, 1); drv_ssd1315_show_string(36, 32, (UINT8*)power, 16 ,1); drv_ssd1315_show_string(36, 48, (UINT8*)quant, 16, 1); } drv_ssd1315_refresh(); free(uart_data.data); uart_data.data = NULL; } } } 4.8 编译 在SDK根目录打开命令行,输入命令.\build.bat -l .\amaziot_bloom_os_sdk\sample\3rd\6.0_CSE7759B\ 1.270(MB)| |------------------------------------------------------------------------------------| cp_1606L.axf cp_1606L.bin cp_1606L.map gnumake: Leaving directory `F:/3.asr-b/cat.1-asr1606/1.software/BlOOM_OS_1606_OPENCPU_1191_A09_WIHT_NEWRF/amaziot_bloom_os_sdk/sample/3rd/6.0_CSE7759B' "copy NEZHAC_CP_CNR_MIFI_TX.bin to ./ " 已复制 1 个文件。 4.9 生成固件 参考入门中开发工具,生成工具。 4.10 测试 测试步骤: 参考编译教程,和文档开头的编译指令,进行编译 按照编译教程选择对应的选项 烧录 4.11 固件 上电后,debug串口会打印出计算出的数据; OLED屏幕会显示参数信息 本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki: Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf) 注:本文部分内容来源于网络,如有侵权,请及时联系我们。