543|2

258

帖子

0

TA的资源

纯净的硅(初级)

【B-G431B-ESC1-无刷电机板】3-开环VF强拖 [复制链接]

本期测评让电机进行开环强拖,电角度使用自增电角度。上期测评我们已经把工程配置的差不多了,这期就直接上代码了。

先上总的控制框图:

image.png   而我们本期做的是下面这个部分

image.png  

开环强拖分为3部分:

  1. 反park变换
  2. svpwm
  3. 电角度

1. 反park变换

参考公式

image.png  

void ipark(Motor_State *motor)
{
	voltage_int(motor);
	motor->v_alpha = motor->vd_int * motor->theta_cos - motor->vq_int * motor->theta_sin;
	motor->v_beta = motor->vq_int * motor->theta_cos + motor->vd_int * motor->theta_sin;
}

 这里voltage_int函数我们后面再解释。

 

2.svpwm

void svpwm(Motor_State *motor, uint32_t PWMFullDutyCycle)
{


	float ts = 1,k_svpwm;
	ipark(motor);
	float u1 = motor->v_beta;
	float u2 = -0.8660254037844386 * motor->v_alpha - 0.5 * motor->v_beta;
	float u3 = 0.8660254037844386 * motor->v_alpha - 0.5 * motor->v_beta;

	uint8_t sector = (u1 > 0.0) + ((u2 > 0.0) << 1) + ((u3 > 0.0) << 2);

	if (sector == 5)
	{
		float t4 = u3;
		float t6 = u1;
		float sum = t4 + t6;
		if (sum > ts)
		{
			k_svpwm = ts / sum;
			t4 = k_svpwm * t4;
			t6 = k_svpwm * t6;
		}
		float t7 = (ts - t4 - t6) / 2;
		motor->ta = t4 + t6 + t7;
		motor->tb = t6 + t7;
		motor->tc = t7;
	}
	else if (sector == 1)
	{
		float t2 = -u3;
		float t6 = -u2;
		float sum = t2 + t6;
		if (sum > ts)
		{
			k_svpwm = ts / sum;
			t2 = k_svpwm * t2;
			t6 = k_svpwm * t6;
		}
		float t7 = (ts - t2 - t6) / 2;
		motor->ta = t6 + t7;
		motor->tb = t2 + t6 + t7;
		motor->tc = t7;
	}
	else if (sector == 3)
	{
		float t2 = u1;
		float t3 = u2;
		float sum = t2 + t3;
		if (sum > ts)
		{
			k_svpwm = ts / sum;
			t2 = k_svpwm * t2;
			t3 = k_svpwm * t3;
		}
		float t7 = (ts - t2 - t3) / 2;
		motor->ta = t7;
		motor->tb = t2 + t3 + t7;
		motor->tc = t3 + t7;
	}
	else if (sector == 2)
	{
		float t1 = -u1;
		float t3 = -u3;
		float sum = t1 + t3;
		if (sum > ts)
		{
			k_svpwm = ts / sum;
			t1 = k_svpwm * t1;
			t3 = k_svpwm * t3;
		}
		float t7 = (ts - t1 - t3) / 2;
		motor->ta = t7;
		motor->tb = t3 + t7;
		motor->tc = t1 + t3 + t7;
	}
	else if (sector == 6)
	{
		float t1 = u2;
		float t5 = u3;
		float sum = t1 + t5;
		if (sum > ts)
		{
			k_svpwm = ts / sum;
			t1 = k_svpwm * t1;
			t5 = k_svpwm * t5;
		}
		float t7 = (ts - t1 - t5) / 2;
		motor->ta = t5 + t7;
		motor->tb = t7;
		motor->tc = t1 + t5 + t7;
	}
	else if (sector == 4)
	{
		float t4 = -u2;
		float t5 = -u1;
		float sum = t4 + t5;
		if (sum > ts)
		{
			k_svpwm = ts / sum;
			t4 = k_svpwm * t4;
			t5 = k_svpwm * t5;
		}
		float t7 = (ts - t4 - t5) / 2;
		motor->ta = t4 + t5 + t7;
		motor->tb = t7;
		motor->tc = t5 + t7;
	}
	motor->pwma = motor->ta * PWMFullDutyCycle;
	motor->pwmb = motor->tb * PWMFullDutyCycle;
	motor->pwmc = motor->tc * PWMFullDutyCycle;
}

这里大家可以参考这篇文章:深入浅出FOC控制-CSDN博客

我直接贴出重点

image.png  

我的代码中,让这个地方的K等于1了,这样可以减少计算,这样前面传入的数据也必须除以K,所以上面代码的voltage_int就是做的这个事情,可以理解成这里将vd和vq标幺化成了1,如下

void voltage_int(Motor_State *motor)
{
	motor->vd_int = (motor->vd) / (motor->v_bus) * ONE_BY_SQRT3;
	motor->vq_int = (motor->vq) / (motor->v_bus) * ONE_BY_SQRT3;
}

 

3.电角度自增

这里我人为给一个电角度,用来强拖电机

   image.png  

4.现象

首先给大家看一下svpwm的马鞍波

img_v3_02in_25dff58a-f5ce-4cda-b0cd-47beabab5a7g.jpg  

最后给大家看一下电机转动的情况

VID20250120174059

 

 

此帖出自电机控制论坛

最新回复

我是硬件工程师,会设计电机驱动电路但是不会软件,学习一下。  详情 回复 发表于 2025-1-21 14:15

回复
举报

1634

帖子

0

TA的资源

五彩晶圆(初级)

我是硬件工程师,会设计电机驱动电路但是不会软件,学习一下。
此帖出自电机控制论坛

点评

共同学习  详情 回复 发表于 2025-2-5 18:42

回复

258

帖子

0

TA的资源

纯净的硅(初级)

lkh747566933 发表于 2025-1-21 14:15 我是硬件工程师,会设计电机驱动电路但是不会软件,学习一下。

共同学习

此帖出自电机控制论坛

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表