打印
[技术讨论]

STM32F103+RN7302功率法校表相位校正问题

[复制链接]
2981|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
khc2019|  楼主 | 2021-10-29 18:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
khc2019|  楼主 | 2021-10-29 18:42 | 只看该作者
目前读取电压电流没什么问题,我还需要测用电量,需要用到能量寄存器,上面的问题会造成什么影响吗

使用特权

评论回复
板凳
khc2019|  楼主 | 2021-10-29 18:43 | 只看该作者
uint16_t RN8302_CalibratePx_PHSL(uint8_t phase)
{
    uint8_t regbuf[5],i;
    uint32_t regtemp[5],regtotal=0;
    float err = 0;
    const uint16_t regGPx[]={0x0131,0x0132,0x0133};
    const uint16_t regGQx[]={0x0134,0x0135,0x0136};
    const uint16_t regArry[]={0x0014,0x0015,0x0016};
    uint32_t pGain;
    uint32_t data;
   
        RN7302_Read(regArry[phase],regbuf);
        printf("Arry_Reg=%02x%02x%02x%02x  \r\n",regbuf[0],regbuf[1],regbuf[2],regbuf[3]);
        regtotal = regbuf[0]<<24|regbuf[1]<<16|regbuf[2]<<8|regbuf[3];
    data = regtotal*1.0;
        printf("data=%f\n",data);
    //err = (data-9179115)*1.0/9179115;
    err = (data-19669533)*1.0/19669533;
        printf("err1=%f\n",err);
    err = -err/1.732;
        printf("err2=%f\n",err);
    if(err > 0){
        pGain = (uint16_t)(err*32768);
    }
    else{
        pGain = (uint16_t)(err*32768+65536);
    }

    StDef_RN8302Para_Reg.Cst_Px_PHSL[phase] = pGain;
    StDef_RN8302Para_Reg.Cst_Qx_PHSL[phase] = pGain;
    printf("pGain=%d\r\n",pGain);
    printf("Cst_Px[phase]=%d\r\n",StDef_RN8302Para_Reg.Cst_Px_PHSL[phase]);
    return pGain;
}

使用特权

评论回复
地板
tyw| | 2021-10-29 18:44 | 只看该作者
本帖最后由 tyw 于 2021-10-29 19:09 编辑

21ic下载_RN7302与STM32通信代码.zip (2.36 MB)
RN7302用户手册_V1.pdf (10.61 MB)
RN7302三相不平衡检测应用笔记V10.pdf (965.58 KB)
RN7302校表应用笔记V10.pdf (1.36 MB)


使用特权

评论回复
5
khc2019|  楼主 | 2021-10-29 18:45 | 只看该作者
上面是我做相位校正的函数,下面是我串口打印出来的消息。
Arry_Reg=ffffffff  
data=0.000000
err1=217.356339
err2=-125.494423
pGain=0

使用特权

评论回复
6
怀揣少年梦| | 2021-10-30 08:16 | 只看该作者
有没有可能计算公式不对或者使用的数据类型不对,之前做三相伏安表的时候遇到公式不对,就会出现数据错误的情况。

使用特权

评论回复
评论
khc2019 2021-10-30 09:59 回复TA
这方面仔细对过了,但是还是找不到问题,我下面把详细代码也发上来,您看看有没有问题 
7
andychina88| | 2021-10-30 09:15 | 只看该作者
应该不会吧

使用特权

评论回复
8
andychina88| | 2021-10-30 09:16 | 只看该作者
是不是SPI驱动代码有问题

使用特权

评论回复
9
khc2019|  楼主 | 2021-10-30 09:57 | 只看该作者
andychina88 发表于 2021-10-30 09:16
是不是SPI驱动代码有问题

SPI我是直接用stm32库函数,然后参考一个网上的例程写的

使用特权

评论回复
10
cooldog123pp| | 2021-10-30 09:59 | 只看该作者
虽然我不是很明白,但是路过了就帮忙楼主顶贴一下,希望楼主问题早日解决。

使用特权

评论回复
11
khc2019|  楼主 | 2021-10-30 09:59 | 只看该作者
怀揣少年梦 发表于 2021-10-30 08:16
有没有可能计算公式不对或者使用的数据类型不对,之前做三相伏安表的时候遇到公式不对,就会出现数据错误的 ...

这方面仔细对过了,但是还是找不到问题,我下面把详细代码也发上来,您看看有没有问题

使用特权

评论回复
12
khc2019|  楼主 | 2021-10-30 10:01 | 只看该作者
cooldog123pp 发表于 2021-10-30 09:59
虽然我不是很明白,但是路过了就帮忙楼主顶贴一下,希望楼主问题早日解决。 ...

谢谢,第一次做这个,对电这方面的知识完全不懂,好多词百度都找不到。

使用特权

评论回复
13
khc2019|  楼主 | 2021-10-30 10:02 | 只看该作者
andychina88 发表于 2021-10-30 09:16
是不是SPI驱动代码有问题

我在下面把SPI代码发出来,您看看有没有啥问题。

使用特权

评论回复
14
khc2019|  楼主 | 2021-10-30 10:03 | 只看该作者
u8 RN7302_Read(u16 wReg,u8 *pBuf)                                                //00计量参数寄存器,01配置和状态寄存器
{
        u8 temp;
        printf("%x\n",wReg);
       
        RN7302_CS=0;
        SPI1_ReadWriteByte(wReg);    //发送读取寄存器地址
        temp = (((u8)(wReg >> 4)) & 0xf0)^0xff + 0x10;
        SPI1_ReadWriteByte(temp);    //发送读取寄存器地址
        delay_us(10);
        pBuf[0]=SPI1_ReadWriteByte(0xff);
        pBuf[1]=SPI1_ReadWriteByte(0xff);
        pBuf[2]=SPI1_ReadWriteByte(0xff);
        pBuf[3]=SPI1_ReadWriteByte(0xff);
        RN7302_CS=1;       
    return(1);
}

void RN7302_Write(u16 wReg,u8 *pBuf,u8 DatLen)                        //00计量参数寄存器,01配置和状态寄存器
{
        u8 num,temp;
        u8 cs;
       
        RN7302_CS=0;
        temp = (u8)(wReg & 0x00ff);
        SPI1_ReadWriteByte(temp);    //发送读取寄存器地址
        temp = (((u8)(wReg >> 4)) & 0xf0) + 0x80;
        SPI1_ReadWriteByte(temp);    //发送读取寄存器地址
        cs=wReg+temp;
        delay_us(10);
        for(num=0;num<DatLen;num++)
        {
        SPI1_ReadWriteByte(pBuf[num]);
        cs+=pBuf[num];
        }
        cs=~cs;
        SPI1_ReadWriteByte(cs);
        RN7302_CS=1;       
}

void RN7302_Write(u16 wReg,u8 *pBuf,u8 DatLen)                        //00计量参数寄存器,01配置和状态寄存器
{
        u8 num,temp;
        u8 cs;
       
        RN7302_CS=0;
        temp = (u8)(wReg & 0x00ff);
        SPI1_ReadWriteByte(temp);    //发送读取寄存器地址
        temp = (((u8)(wReg >> 4)) & 0xf0) + 0x80;
        SPI1_ReadWriteByte(temp);    //发送读取寄存器地址
        cs=wReg+temp;
        delay_us(10);
        for(num=0;num<DatLen;num++)
        {
        SPI1_ReadWriteByte(pBuf[num]);
        cs+=pBuf[num];
        }
        cs=~cs;
        SPI1_ReadWriteByte(cs);
        RN7302_CS=1;       
}
这是SPI的代码

使用特权

评论回复
15
怀揣少年梦| | 2021-10-30 10:28 | 只看该作者
khc2019 发表于 2021-10-30 09:59
这方面仔细对过了,但是还是找不到问题,我下面把详细代码也发上来,您看看有没有问题  ...

你能正常读取电压幅值,说明你的读写是没有问题的。看看你的寄存器地址对不对,还有相位校准的条件是什么

使用特权

评论回复
16
khc2019|  楼主 | 2021-10-30 11:01 | 只看该作者
怀揣少年梦 发表于 2021-10-30 10:28
你能正常读取电压幅值,说明你的读写是没有问题的。看看你的寄存器地址对不对,还有相位校准的条件是什么 ...

相位校准要什么条件吗,这个我没注意到,我按照手册的功率校表法举例步骤写的,ABC电压电流校正完成后,直接读A相有功功率寄存器(地址0x14)

使用特权

评论回复
17
Zhang445465853| | 2021-10-30 11:12 | 只看该作者
666666

使用特权

评论回复
18
nbtypec| | 2021-10-30 12:04 | 只看该作者
牛X,学习了

使用特权

评论回复
19
怀揣少年梦| | 2021-10-30 13:43 | 只看该作者
khc2019 发表于 2021-10-30 11:01
相位校准要什么条件吗,这个我没注意到,我按照手册的功率校表法举例步骤写的,ABC电压电流校正完成后, ...

3相4线校准单点校准相位时,是功率因数为0.5的时候校准。另外你可以打印你计算出来的系数与写进寄存器的系数是不是一样的。还有你不校准,打印寄存器的值是不是正常的。

使用特权

评论回复
20
khc2019|  楼主 | 2021-10-30 14:09 | 只看该作者
怀揣少年梦 发表于 2021-10-30 13:43
3相4线校准单点校准相位时,是功率因数为0.5的时候校准。另外你可以打印你计算出来的系数与写进寄存器的 ...

感谢您的建议,我在电压电流校准后发现,我写入寄存器的值是0x4320,再读出该寄存器的值却是0xffff,是不是我SPI读的函数有问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

20

帖子

0

粉丝