打印
[开发板]

求助FOC代码解释

[复制链接]
610|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
21iscolor|  楼主 | 2025-2-28 08:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求以下代码的解释:不太理解以下的代码含义求高手指点
1 void Svpwm_CalcDuration函数中
  i32Q15_InvVbus = Q27_BASE / i32Q12_Vbus;                                                                                                                               
    i32T1 = ((((i32Q12_V1 * i32Q15_InvVbus + Q11_BASE) >> 12) * pstc->i32PeakCnt) >> 15);                       
    i32T2 = ((((i32Q12_V2 * i32Q15_InvVbus + Q11_BASE) >> 12) * pstc->i32PeakCnt) >> 15);

    if (Q15(i32T1 + i32T2) > pstc->i32Q15_MaxDutyCnt) {//如果T1+T2超过了最大周期计数器值,则需要转换得到相电压Va/Vb
        int32_t i32Q15_K = (pstc->i32Q15_MaxDutyCnt) / (i32T1 + i32T2);
        i32T1 = ((i32Q15_K * i32T1) >> 15);
        i32T2 = ((i32Q15_K * i32T2) >> 15);
        pstc->i32Q12_VaReal = ((i32Q15_K * i32Q12_Va) >> 15);
        pstc->i32Q12_VbReal = ((i32Q15_K * i32Q12_Vb) >> 15);
        pstc->u8OvFlag = 1;                                                                                                                                                //溢出标识
    }

    else {
        pstc->i32Q12_VaReal = i32Q12_Va;
        pstc->i32Q12_VbReal = i32Q12_Vb;
        pstc->u8OvFlag = 0;
    }

    pstc->u16T1 = (uint16_t)(i32T1);                        //计算T1,T2,T0的值
    pstc->u16T2 = (uint16_t)(i32T2);
    i32Temp = pstc->i32PeakCnt - (int32_t)pstc->u16T1 - (int32_t)pstc->u16T2;
    pstc->u16T0 = (uint16_t)i32Temp;

2 Svpwm_7SegSymmPwm函数中
if (1U == u8Sector)
    {
        pstc->u16Uon = (u16T0 >> 1U);
        pstc->u16Von = pstc->u16Uon + u16T1;
        pstc->u16Won = pstc->u16Von + u16T2;
    }
    /** sector 2: [0, 1, 0] -> [1, 1, 0] **************************************/
    else if (2U == u8Sector)
    {
        pstc->u16Von = (u16T0 >> 1);
        pstc->u16Uon = pstc->u16Von + u16T1;
        pstc->u16Won = pstc->u16Uon + u16T2;
    }
    /** sector 3: [0, 1, 0] ->[0, 1, 1] ***************************************/
    else if (3U == u8Sector)
    {
        pstc->u16Von = (u16T0 >> 1);
        pstc->u16Won = pstc->u16Von + u16T1;
        pstc->u16Uon = pstc->u16Won + u16T2;
    }
    /** sector 4: [0, 0, 1] -> [0, 1, 1] **************************************/
    else if (4U == u8Sector)
    {
        pstc->u16Won = (u16T0 >> 1);
        pstc->u16Von = pstc->u16Won + u16T1;
        pstc->u16Uon = pstc->u16Von + u16T2;
    }
    /** sector 5: [0, 0, 1] -> [1, 0, 1]***************************************/
    else if (5U == u8Sector)
    {
        pstc->u16Won = (u16T0 >> 1);
        pstc->u16Uon = pstc->u16Won + u16T1;
        pstc->u16Von = pstc->u16Uon + u16T2;
    }
    /** sector 6: [1, 0, 0] -> [1, 0, 1] **************************************/
    else if (6U == u8Sector)
    {
        pstc->u16Uon = (u16T0 >> 1);
        pstc->u16Won = pstc->u16Uon + u16T1;
        pstc->u16Von = pstc->u16Won + u16T2;
    }
    else
    {
        pstc->u16Uon = 0xffff;
        pstc->u16Von = 0xffff;
        pstc->u16Won = 0xffff;
    }
    pstc->u16Uoff = pstc->u16Uon;
    pstc->u16Voff = pstc->u16Von;
    pstc->u16Woff = pstc->u16Won;

使用特权

评论回复
沙发
21iscolor|  楼主 | 2025-3-3 16:52 | 只看该作者
芯源的技术在吗?没人能回答吗?

使用特权

评论回复
板凳
probedog| | 2025-3-4 10:57 | 只看该作者
这两段代码是用于实现空间矢量脉宽调制算法的一部分,通常用于电机控制中

使用特权

评论回复
地板
classroom| | 2025-3-5 10:00 | 只看该作者
这两段代码共同实现了SVPWM算法的核心部分,包括计算每个相的开通时间、处理溢出情况,以及根据扇区设置具体的开通和关断时间。SVPWM算法通过精确控制每个相的开通和关断时间,可以在电机中产生近似正弦的电流波形,从而提高电机的效率和性能。

使用特权

评论回复
5
21iscolor|  楼主 | 2025-3-6 12:00 | 只看该作者
能否结合代码详细说下,意图我明白,想知道这段代码的操作意图使怎样处理的

使用特权

评论回复
6
小小蚂蚁举千斤| | 2025-3-13 22:18 | 只看该作者
FOC主要是进行相关的程序学习

使用特权

评论回复
7
jf101| | 2025-3-20 17:31 | 只看该作者
其实主要是先学习FOC的基础知识

使用特权

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

本版积分规则

3

主题

12

帖子

0

粉丝