查看: 4748|回复: 0

[原创] 基于LPC55S69双核ARM-M33的真有效值三相交流电压表

[复制链接]
  • TA的每日心情
    开心
    2023-12-29 09:54
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    8

    主题

    274

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    5287
    最后登录
    2025-8-15
    发表于 2019-7-6 11:54:39 | 显示全部楼层 |阅读模式
    本帖最后由 wenyangzeng 于 2019-7-6 19:22 编辑

    基于LPC55S69双核ARM-M33的真有效值三相交流电压表

    0.png

    一、项目名称
    基于LPC55S69双核ARM-M33的真有效值三相交流电压表

    二、项目概述
        一般对交流供电电压的测量基本上是采用将交流电经分压整流后测量其有效值的方法。由于整流二极管的非线性特性,从而不能得到最真实的有效值测量结果,尤其对于测量非正弦波形的交流电,误差更大。要获得真有效值测量结果,需要使用专用真有效值测量芯片。这将增加测试工具的成本。

        基于LPC55S69双核ARM-M33的真有效值三相交流电表,充分利用LPC55S69强大的双核协同运算特性,使得对交流电真有效值的测量无需使用专用芯片就能实现。LPC55S69的ADC连续对交流电的一个周期进行多次采样,并按下式进行运算,就能得到交流电的真有效值电压值。

    1.jpg

    三、项目的实施
    双核任务的规划:

        项目中主要分为0#模块(OLED显示)和1#模块(ADC采样、数学运算),0#模块分配给Core0,1#模块分配给Core1。经过实验,反过来分配也完全可以。申请了一个内存共享区,用以数据共享和双核通讯协调工作。总共需要7个uint16_t的变量,其中6个保存三相交流电的R、S、T的线对线(L-L)和线对零(L-N)电压值,一个用于握手信号,1#模块运算任务完成时置1,0#模块接收到握手信号,进行数据显示。
    硬件资源:
        实现项目的功能至少需要LPC55S69的3路ADC输入和用于驱动OLED的5条GPIO口线。这些都从板子上的ARDUINO插座上引出。
    外扩资源:

    需要外扩ADC外部输入电路,见图1。

    2.png

                                   图1

        3只1:1的电压互感器T1-T3用于交流电高压端与低压端LPC55S69的电气安全隔离。3只高阻值电阻串接在T1-T3初级,保证绕组工作在线性区且不过流。T1-T3次级经过R7-R9、C1-C3的RC滤波后连接到LPC55S69的ADC0、ADC2、ADC4输入端。并联在次级绕组两端的R4-R6阻尼了次级的反峰压,以保护LPC55S69不至于过压而损坏。T1-T3次级公共点连接到1/2VCC,将交流电的负峰值垫高到GND电平,使得ADC能够完整采样整个交流电的波形。

        为了在没有三相交流电的场所方便演示,本DEMO板增设了三相交流电模拟信号发生器,输出相位差120°的正弦波信号,连接到LPC55S69的3个ADC输入端,在没有三相交流电时,在P3端接上9V层叠电池就能产生相位差120°的三相正弦波,用来模拟真实的380V三相交流电接入时的真实工作情况。见图2。图中左下角的4个测试点为模拟信号测试点N、R、S、T,可以用示波器观察。
    3.png

                           图2
    开发环境:
        IAR8.32.1。工程模块使用双核Hello_world修改而成。在双核共享内存变量中的data[6]用于双核通讯调度的联络信号。Core1完成50×3次的ADC采样转换、计算后,将6个最终值保存在dada[0]-data[5]中,并置位data[6]为1。Core0检测到data[6]为1后读取dada[0]-data[5]的数据刷新OLED屏幕,并清零data[6]。下一轮数据交换开始。

    双核调试:

    首先在Core0中调试ADC,正常后才移植到Core1。要让ADC能正常工作,需要在工程的drivers中添加fsl_lpadc.c。见图3



    4.png
    图3


        在hello_world_core0.c(移植后是在hello_world_core1.c)添加头文件

    #include "fsl_lpadc.h"和#include "fsl_power.h"。

        在调试过程中发现所有ADC转换结果都是4095。经过摸索发现固件库Fsl_lpadc.C演示代码中中默认的Vref选项被设置连接到GND为0V。需要在初始化ADC时连接到VCC:改为:

    mLpadcConfigStruct.referenceVoltageSource =kLPADC_ReferenceVoltageAlt2;

        调试完成后ADC任务移植到Core1,并由Core0激活Core1进行ADC转换时,发现ADC只启动一次就停止工作了。这个LPC55S69的lp_adc功能非常强大,即有单端ADC,又有差分ADC,转换分辨率有16bit、12bit....。在Fsl_lpadc.C演示代码中转换开始前有一个自动校准函数,可以做不少参数的自校准,包括增益调节。可能本项目的ADC选择12bit单端ADC,这个自校准功能对其校准参数有要求,而我只知其一不知其二,照搬套用,结果挂了。在微信群各位老大的指导下,将这个自校准功能:

    LPADC_DoAutoCalibration(DEMO_LPADC_BASE);

    先注释掉。终于把这个ADC运行故障排除了。

    总结:

        这片全球最先进的Cortex-M33芯片,功能非常强大,本项目只使用其功能的冰山一角。对比LPC54114,原设计54114的M0做完ADC后,需要将运算和显示工作交付M4来进行,这样需要开辟一大片数据缓冲区,读写数据浪费运行时间。现在LPC55S69的Core1独自ADC转换完并执行浮点运算后,只要传输6个数据变量就够了,大大减少RAM读写时间。

    视频链接:





    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-16 02:59 , Processed in 0.089320 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表