svpwm 不同ualpha ubeta 对应的 占空比波形

探讨SVPWM技术中ualpha与ubeta参数如何影响PWM信号的占空比变化,揭示当两者相等时形成马鞍波,不相等时波形变化规律,以及duty1、duty2和duty3之间的对称和镜像关系。

使用svpwm 改变ualpha 和ubeta 比例观测占空比变化(比较器值) 看以看出当ualpha =ubeta时 占空比都是马鞍波

如果不相等 就波形会变化,但是duty1始终自身中心对称,duty2和duty3两个保持镜像关系。Ualfa 大的时候duty2两边低中心高,svpwm是一种电压调制方式,我们给定一个模拟量Ualfa和Ubeta,怎么通过pwm生成相应的占空比呢。。svpwm就是生成占空比的方式。

 

 

void svpwm_calculate(SVPWM *svpwm, float Ualpha, float Ubeta, float Vdc, float Ts, float duty[3]) { // 预计算常用常量 const float k = SQRT3 * Ts / Vdc; const float half_sqrt3 = 0.5f * SQRT3; // Clarke逆变换得到三相虚拟电压 float X = Ubeta; float Y = -0.5f * Ualpha + half_sqrt3 * Ubeta; float Z = -0.5f * Ualpha - half_sqrt3 * Ubeta; // 扇区判断 int sector = 0; if (X > 0) sector |= 1; if (Y > 0) sector |= 2; if (Z > 0) sector |= 4; // 修正扇区映射关系 switch (sector) { case 3: sector = 1; break; case 1: sector = 2; break; case 5: sector = 3; break; case 4: sector = 4; break; case 6: sector = 5; break; case 2: sector = 6; break; default: sector = 0; break; } svpwm->sector = sector; // 作用时间与占空比计算 float T1 = 0, T2 = 0, T0 = 0; float Ta = 0, Tb = 0, Tc = 0; switch (sector) { case 1: // 扇区1 T1 = k * (half_sqrt3 * Ubeta - 0.5f * Ualpha); T2 = k * Ualpha; break; case 2: // 扇区2 T1 = k * Ualpha; T2 = k * (-half_sqrt3 * Ubeta - 0.5f * Ualpha); break; case 3: // 扇区3 T1 = k * (-half_sqrt3 * Ubeta - 0.5f * Ualpha); T2 = k * (-Ualpha); break; case 4: // 扇区4 T1 = k * (-Ualpha); T2 = k * (-half_sqrt3 * Ubeta + 0.5f * Ualpha); break; case 5: // 扇区5 T1 = k * (-half_sqrt3 * Ubeta + 0.5f * Ualpha); T2 = k * Ualpha; break; case 6: // 扇区6 T1 = k * (half_sqrt3 * Ubeta + 0.5f * Ualpha); T2 = k * (-half_sqrt3 * Ubeta + 0.5f * Ualpha); break; default: // 异常情况 T1 = T2 = 0; break; } // 计算零矢量时间并处理过调制 T0 = Ts - T1 - T2; if (T0 < 0) { // 过调制处理:按比例缩放T1和T2 float total = T1 + T2; if (total > 1e-6f) { float scale = Ts / total; T1 *= scale; T2 *= scale; T0 = 0; } else { T1 = T2 = T0 = 0; } } // 根据扇区计算占空比 switch (sector) { case 1: Ta = (T1 + T2 + T0 / 2) / Ts; Tb = (T2 + T0 / 2) / Ts; Tc = (T0 / 2) / Ts; break; case 2: Ta = (T1 + T0 / 2) / Ts; Tb = (T1 + T2 + T0 / 2) / Ts; Tc = (T0 / 2) / Ts; break; case 3: Ta = (T0 / 2) / Ts; Tb = (T1 + T2 + T0 / 2) / Ts; Tc = (T2 + T0 / 2) / Ts; break; case 4: Ta = (T0 / 2) / Ts; Tb = (T1 + T0 / 2) / Ts; Tc = (T1 + T2 + T0 / 2) / Ts; break; case 5: Ta = (T2 + T0 / 2) / Ts; Tb = (T0 / 2) / Ts; Tc = (T1 + T2 + T0 / 2) / Ts; break; case 6: Ta = (T1 + T2 + T0 / 2) / Ts; Tb = (T0 / 2) / Ts; Tc = (T1 + T0 / 2) / Ts; break; default: // 异常处理 Ta = Tb = Tc = 0.5f; break; } svpwm->T1 = T1; svpwm->T2 = T2; svpwm->T0 = T0; // 限幅到[0,1] duty[0] = fmaxf(fminf(Ta, 1.0f), 0.0f); duty[1] = fmaxf(fminf(Tb, 1.0f), 0.0f); duty[2] = fmaxf(fminf(Tc, 1.0f), 0.0f); }结合这个算法,重新生成一份代码
07-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DKZ001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值