[控制算法]

article/2025/10/6 23:52:08

[常用控制算法]

0.博览众长

0.1 视频

1. DR_CAN b站

0.2 文章

1.控制算法整理

0.3 传统 VS 现代控制算法

1. 传统

传统控制算法:PID模糊神经网络控制算法

2. 现代

现代控制算法有比例LQR算法(用于线性系统),自适应控制算法滑模控制算法

1. PID

1. 知乎

2.PID控制算法

3. 一文搞懂PID控制算法

1.1 PID真容

参考:CSDN
参考:B站
非常亲民的参考:CSDN

  1. PID(proportion integration differentiation)其实就是指比例,积分,微分控制。
  2. PID控制框图:
    在这里插入图片描述
  3. 标准的(连续的、模拟的)PID表达式:
    请添加图片描述
  4. 对P、I、D三个参数的感觉
  • 上述Kp只是一个系数
  1. 仅用比例项会存在稳态误差
  2. 积分项可以消除稳态误差
  3. 微分项防止超调?
  • P可以提高系统响应时间
  • I可以消除静态误差
  • D可以预判系统的变化 也起到阻尼作用削弱系统振动
  1. 个人的理解:

A、拿控制小车直线行驶到一个目的地来说
我们控制的是小车的速度,(位置式)
1.如果只根据误差量 乘以 kp 作为速度输出,那么到达终点时速度可能不为零,那么就会超调和震荡;
2.此时加入微分量Kd,根据误差的变化率(一般为负值)来削弱快到终点的速度,就可以减弱超调和震荡;
3.由于快到终点(在终点前或者超过终点)时控制量(不管是比例项还是微分项)都会变得很小,会导致小车永远到达不了终点,因此加入积分项,把当前所有误差累加起来作为正反馈,在此时变大控制量激励小车继续向前。
B、拿控制一个电机的PWM让其达到一个速度(增量式)
我们并不知道到达该速度需要多大的PWM占空比,或者电机老化了摩擦增大

  1. 根据误差 乘以 Kp 获得第一次的占空比值,此时与目标速度仍有差距
  2. 因此再多次次由误差算得一个占空比,若最后一次占空比提供的力矩刚好和摩擦力平衡,
    并且由此时的误差算到的占空比数值与此时占空比相等,那么控制系统就平衡(蚌埠)住了,
    就无法到达目标点了。
  3. 因此需要加上KI,KD控制。
  1. 离散的PID表达式
    请添加图片描述
    DR_CAN 大佬视频
    在这里插入图片描述
    请添加图片描述
    上式经过拉普拉斯变换 得到各项的传递函数
    在这里插入图片描述
    大佬总结:
    真实的浴缸冷热水温度控制是控制龙头的阀门开度,涉及到水流的动力学,涉及到冷热水混合的热力学,这个数学模型非常复杂;
    但是使用到PID之后,其实是简化了控制系统的设计。(我的理解是,PID使用反馈,和Kp、Ki、Kd的调参就可以实现对这个数学模型的“仿制”)。

1.2 实用PID(离散&增量)

1. 模拟PID到离散型PID的转换

参考:模拟PID到离散型PID的转换

  • 模拟(连续)PID :
    在这里插入图片描述

这是模拟PID公式,对于这个公式,你要知道:
Kp :放大系数
e(t):误差(t代表第t时刻采样得到的误差)
Ti :积分时间常数
Td:微分时间常数

我们使用单片机进行PID运算,是不能采用模拟型PID的,因为单片机本身就是一个数字系统,里面只有0和1,因此不能处理模拟信号,(单片机中DAC处理模拟信号是将连续的模拟量转化为离散的数字量)只能将模拟信号转换成离散的数字信号,才能被单片机所用。
单片机实际上也不能连续积分,只能离散化的拟合积分

  • 离散PID :
    在这里插入图片描述
  • 模拟PID和离散PID的区别 :
  1. 积分项的变化
    采用矩形拟合面积:
    在这里插入图片描述
    因此积分项可以写成:
    在这里插入图片描述

Sk:是积分输出项
Ek:表示误差(第k次采样的误差)
T:采样时间
Ti:积分常数

  1. 微分项的变化
    用曲线上两点连接成的斜线拟合曲线的切线
    在这里插入图片描述

2. PID使用注意事项:

  1. 积分项是将所有误差都累加起来的,因此在第一次到达目标值时,会累积很大一个误差,此时P项没有作用了,但系统还是会继续向前,这就造成系统产生过冲,最直观的表现就是下图中,第一次超过目标值产生的过冲现象
    在这里插入图片描述
    **解决办法:(积分分离)**就是一开始不加入积分项,如果目标温度是100℃当温度到达一定值,比如80℃时,在加入积分项。

3. 位置式PID和增量式PID

以上说的PID公式属于位置式PID

  • 位置式PID的输出与整个过去的状态有关,用到了误差的累加值
  • 而增量式PID的输出只与当前拍和前两拍的误差有关。
    就温控系统来说,位置式PID输出的结果就是PWM占空比最终值,如果用增量式就是PWM占空比相比上次输出增加(减少)的值。
    举个例子:
    比如用位置式控制,计算结果是100,那么占空比就是100%,如果用增量式控制,计算结果是20,那么占空比就是(上次输出值+20)%。
  1. 增量式推导:
    本次增量值 = 本次PID输出 - 上次PID输出
    在这里插入图片描述
    简化得:
    在这里插入图片描述

Ek是当前误差
Ek-1是上次的误差
Ek-2是上上次的误差

  1. 增量式PID和位置式PID的区别
    1.位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;
    2.增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
    3.由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。

4. 增量式PID实战(代码实现)

首先定义一个当前误差iError和一个计算出来的增量值iIncpid当前误差iError=目标值SetPoint-传感器采集的当前值PresentPoint,之后进行增量式PID运算,得出增量值iIncpid。

/********************增量式PID控制设计************************************/
int IncPIDCalc(int PresentPoint) 
{int iError , iIncpid;       //iIncpid增量值   iError当前误差iError = SetPoint-PresentPoint;                    //增量计算iIncpid =(Proportion * iError)                  //E[k]项-(Integral * LastError)     //E[k-1]项+(Derivative * PrevError);  //E[k-2]项PrevError = LastError;LastError=iError;return (iIncpid);
}

代码解答:增量式的简化
在这里插入图片描述

5. 位置式PID实战

在这里插入图片描述

/********************位置式 PID 控制设计************************************/
unsigned int LocPIDCalc(int NextPoint)
{int iError,dError;iError = SetPoint - NextPoint; //求出当前偏差SumError += iError; //对偏差进行积分dError = iError - LastError; //对偏差求微分LastError = iError;		//转换赋值//返回位置式PID计算结果return(Proportion * iError //比例项+ Integral * SumError //积分项+ Derivative * dError); //微分项
}

DJI GM6020 控制 DEMO运用的也是位置模式

float pid_calc(pid_struct_t *pid, float ref, float fdb)
{pid->ref = ref;pid->fdb = fdb;pid->err[1] = pid->err[0];                //上次误差pid->err[0] = pid->ref - pid->fdb;   //本次误差pid->p_out  = pid->kp * pid->err[0];pid->i_out += pid->ki * pid->err[0];pid->d_out  = pid->kd * (pid->err[0] - pid->err[1]);          //个人推断积分的累加频率就是while( )循环的频率LIMIT_MIN_MAX(pid->i_out, -pid->i_max, pid->i_max);pid->output = pid->p_out + pid->i_out + pid->d_out;LIMIT_MIN_MAX(pid->output, -pid->out_max, pid->out_max);return pid->output;     //输出的是一个电压给定值,在main( )中被限定在3000
}

6. 关键问题思考

  1. 关于while()循环问题:

通过外部中断检测mpu6050INT引脚,检测到信号之后就进行一次pid运算。以此来严格控制PID计算周期。可能有些人会有疑问,为什么不放到while中循环检测?因为放在while循环的话,这个循环是可以被中断打断的。小车平衡对实时性要求高,如果在while循环里,姿态矫正时,程序被其他模块中断,小车就立不起来了。因此外部中断的优先级要配置成最高。

  1. 关于位置式输出的疑惑:位置模式如果只有P的话,当快趋近于目标值的时候误差变小了,输出量也就变小了,输出量就会平稳在到达目标值之前,但是可以加入I项来用历史累计误差逼迫输出值被继续抬高,最终获得预期的输出。
    参考:CSDN

1.3 PID应用 - 平衡小车

参考:CSDN
关键词:

  • 串级PID
  • PID离散化
  • 位置式PID
  • 增量式PID
  • 直立环
  • 速度环
  • 转向环

1. 串级PID

由于速度环直立环都是控制小车电机的转速,因此两者需串在一起。又因为平衡小车最主要的是直立,因为速度环的输出作为直立环的输入,直立环的输出最终作用到小车电机上。最终形成下图框图的形式:
在这里插入图片描述

1.1 串级PID流程

1.给定目标速度,电机转动,编码器就会输出脉冲,单片机通过编码器模式检测脉冲值获得轮速,并把该值代入速度环计算出一个角度输出;
2.上述速度环计算得到的角度作为直立环的输入,直立环努力保持这个角度,输出PWM给电机,以此循环。

速度环和直立环分离框图:
在这里插入图片描述
表达式:
在这里插入图片描述

a1是速度环算出的角度,并把这个角度作为直立环的输入
a是直立环的输出

这样把速度控制系统输出看做是一个角度,原本要保持角度为零就变成保持一个小的角度a1,所以我们就有了一个这样的算法,两个式子合并。

在这里插入图片描述

2. 串级PID实战

2.1 直立环

在这里插入图片描述

/**************************************************************************
函数功能:直立PD控制
入口参数:角度、角速度
返回  值:直立控制PWM
作    者:平衡小车之家
**************************************************************************/
int balance(float Angle,float Gyro)
{  float Bias;int balance;Bias=Angle-ZHONGZHI;                       //===求出平衡的角度中值 和机械相关balance=Balance_Kp*Bias+Gyro*Balance_Kd;   //===计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数 return balance;
}

2.2 速度环

/**************************************************************************
函数功能:速度PI控制 修改前进后退速度,请修Target_Velocity,比如,改成60就比较慢了
入口参数:左轮编码器、右轮编码器
返回  值:速度控制PWM
作    者:平衡小车之家
**************************************************************************/
int velocity(int encoder_left,int encoder_right)
{  static float Velocity,Encoder_Least,Encoder,Movement;static float Encoder_Integral,Target_Velocity;//=============速度PI控制器=======================//	Encoder_Least =(encoder_left+encoder_right)-0;                    //===获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零) Encoder *= 0.7;		                                                //===一阶低通滤波器       Encoder += Encoder_Least*0.3;	                                    //===一阶低通滤波器    Encoder_Integral +=Encoder;                                       //===积分出位移 积分时间:10ms//Encoder_Integral=Encoder_Integral-Movement;                       //===接收遥控器数据,控制前进后退if(Encoder_Integral>10000)  	Encoder_Integral=10000;             //===积分限幅if(Encoder_Integral<-10000)	Encoder_Integral=-10000;              //===积分限幅	Velocity=Encoder*Velocity_Kp+Encoder_Integral*Velocity_Ki;        //===速度控制	return Velocity;
}

2.3 转向环

 /**************************************************************************
函数功能:转向控制  修改转向速度,请修改Turn_Amplitude即可
入口参数:左轮编码器、右轮编码器、Z轴陀螺仪
返回  值:转向控制PWM
作    者:平衡小车之家
**************************************************************************/
int turn(int encoder_left,int encoder_right,float gyro)//转向控制
{static float Turn_Target,Turn,Encoder_temp,Turn_Convert=0.9,Turn_Count;float Kd=1.3;     //=============转向PD控制器=======================//Turn=-gyro*Kd;                 //===结合Z轴陀螺仪进行PD控制return Turn;
}

2.4 最终整合

 int EXTI9_5_IRQHandler(void)
{int PWM_out;if(EXTI_GetITStatus(EXTI_Line5)!=0)//一级判定{if(PBin(5)==0)//二级判定{EXTI_ClearITPendingBit(EXTI_Line5);//清除中断标志位//进入中断首先读取数据----编码器数据和角度数据Encoder_Left=-Read_Encoder(2);               //===读取编码器的值Encoder_Right=Read_Encoder(4);              //===读取编码器的值mpu_dmp_get_data(&Pitch,&Roll,&Yaw);		//角度MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//陀螺仪MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//加速度Balance_Pwm =balance(Pitch,gyroy);          //===角度环Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);                  //===速度环PID控制	 记住,速度反馈是正反馈,就是小车快的时候要慢下来就需要再跑快一点Turn_Pwm =turn(Encoder_Left,Encoder_Right,gyroz);            	//===转向环PID控制     PWM_out=Balance_Pwm - Balance_Kp*Velocity_Pwm;//最终输出Moto1=PWM_out+Turn_Pwm;                            //===计算左轮电机最终PWMMoto2=PWM_out-Turn_Pwm;                            //===计算右轮电机最终PWMXianfu_Pwm();                                                       //===PWM限幅Set_Pwm(Moto1,Moto2);                                               //===赋值给PWM寄存器  }}return 0;	
}

注意:PWM_out=Balance_Pwm - Balance_Kp*Velocity_Pwm;//最终输出
由于是串行PID,因此速度环的输出就是直立环的输入,如上面的框图和整合表达式一样。

1.4 管道机器人姿态控制

基于串级PID的整合版姿态控制

DJI GM6020电机PID控制程序

float pid_calc(pid_struct_t *pid, float ref, float fdb)
{pid->ref = ref;pid->fdb = fdb;pid->err[1] = pid->err[0];pid->err[0] = pid->ref - pid->fdb;pid->p_out  = pid->kp * pid->err[0];pid->i_out += pid->ki * pid->err[0];pid->d_out  = pid->kd * (pid->err[0] - pid->err[1]);LIMIT_MIN_MAX(pid->i_out, -pid->i_max, pid->i_max);pid->output = pid->p_out + pid->i_out + pid->d_out;LIMIT_MIN_MAX(pid->output, -pid->out_max, pid->out_max);//printf("pid->output = %f", pid->output);return pid->output;
}

管道机器人姿态控制代码(位置模式)

float pid_calc(pid_struct_t *pid, float Angle, float Gyro_Y)
{}
target speed1 = rc.ch4/3.5; //CH1和CH4通道混控
target speed2 = rc.ch4/3.5 - 2*pid->output;

2.FOC

FOC平衡小车

参考:稚晖君
FOC(Field-Oriented Control),直译是磁场定向控制,也被称作矢量控制(VC,Vector Control),是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最优方法之一。

FOC分类
有感FOC(依靠传感器获取电机位置)
无感FOC (需要的算法更复杂,但机械安装简单)

1.BLDC

(BLDC:Brushless Direct Current Motor)

0.基础知识和原理

  1. BLDC:无刷直流电机
  2. PMSM: 永磁同步电机
    BLDC和PMSM被称为同步电机,他们的转子都为永磁体
    两者的主要区别在于他们转子产生的反电动势
    在这里插入图片描述
  • BLDC: 反电动势为梯形,一般采用六步换向或者梯形控制
  • PMSM:反电动势为正弦,使用磁场定向控制
  1. BLDC工作原理
    转子在A、B、C线圈的作用下稳定后的位置,但此时转子输出力矩为零,当转子和定子磁场互成90度角时,会产生最大扭矩。
    在这里插入图片描述
    如果适时改变A、B、C线圈的电流(根据转子所在位置去改变),就可以让转子不断地旋转下去。
    思考:常用的航模电机和控制器(电调)之间只有三根动力线,没有传感器信号线,推测这种电调可以直接根据三根动力线的反电动势(或者电流值)判断电子转子所在的区域,从而控制定子产生相应的磁场,转子的磁场永远追不上定子的磁场,因此电机便可持续转动。
    在这里插入图片描述

在这里插入图片描述

1.灵魂思考1(转子位置)

  • 不管使用六步换向法还是FOC,知道转子的位置是不是无刷直流电机转动的必要条件?

一般无刷直流电机原理视频上都说需要知道转子位置才能准确的控制定子线圈产生对应的磁场。
参考:浅析无刷电机之FOC第5部分
当然也有电调这种无感无刷驱动器,只是不适合低速带载。

1.对于六步换向法

  1. 解答1:(这估计是电调的原理)
    直流无刷电机为获得转子当前位置,需要采用某种转子位置检测环节。
    1.在有位置传感器的系统中,转子位置的检测是通过一系列霍尔效应传感器来实现的。
    2.但位置传感器的存在诸多缺点;
    3.因此,使用无感直流无刷电机控制,具有其一定的优势。
    在这里插入图片描述
    解决办法:反电动势法
    无感直流无刷电机的转子位置检测分析
    对于无位置传感器的直流无刷电机,必须通过一定的方法检测转子位置信息才能准确换相反电动势法是其中最成熟和应用最广泛的位置检测方法。在六步换相控制中,每一个换相周期,将有一相绕组处于不导通状态。因此通过检测第三相反电动势信号,可检测到转子磁极在该绕组经过的时刻。如上图所示,在AB绕组通电时,应检测C相反电动势电压。

  2. 解答2:
    如果位置不匹配,在不同的启动位置,有可能出现电机实际转向与期待转向完全相反的危险情况。
    因此,转子位置的检测十分重要。
    检测转子位置通常是有霍尔的做法,还有一种无转子传感器的,通常是通过反电动势过零检测。

  3. 解答3:
    由于BLDC电机中没有电刷,因此换向是电子控制的。为了使电机旋转,必须顺序地给定子绕组通电,并且必须知道转子的位置(即转子的北极和南极)才能精确地给一组特定的定子绕组通电。

2. 对于FOC

参考:浅析无刷电机之FOC第5部分

  1. FOC当然也是要根据转子位置来“换向”,既然是矢量控制,那么就可以非常方便、随意的来进行控制了。

  2. 依靠Park变换获得“转子位置”
    Park变换负责把两相静止坐标系α和β,变换成两相旋转坐标系。反过来就是Park逆变换或者叫反Park变换。变换的结果就是我们只要给定旋转坐标系的电流,不用关注转子角度就可以让无刷电机持续的旋转起来了(就和有刷电机一样,只要通电就行了)。 对于用户来说就只需要给定电流大小,因此效果就和直流有刷一样,给定电流就可以转,给的越大转得越快,反着给电流就反转。所以也有不严谨的说法是FOC把无刷变成了有刷

  3. 无感FOC转子位置来源于估算器在这里插入图片描述

2. 灵魂拷问2(灯哥V1.0板子)

在这里插入图片描述

  • 灯哥FOC1.0的板子,没有电流采集电路,不用编码器实现开环速度控制的原理吗,因为之前看到的无刷电机驱动原理都提到了要知道转子的位置或者所在扇区才能用六步换向法让电机转起来。

  • 解答:
    请添加图片描述
    原来这个驱动芯片就有电流反馈功能

请添加图片描述
SENSE1、2:连接到该引脚的感测电阻为桥1和2的电机电流控制提供反馈

在这里插入图片描述
但灯哥这里除了三个IN引脚,单片机之和EN引脚连接了????

3. BLDC驱动方法

无刷直机电机的驱动方式按不同类别可分多种驱动方式,它们各有特点。

  1. 按驱动波形:
    方波驱动,这种驱动方式实现方便,易于实现电机无位置传感器控制;

  2. 正弦驱动:
    这种驱动方式可以改善电机运行效果,使输出力矩均匀,但实现过程相对复杂。同时,这种方法又有SPWM和SVPWM(空间矢量PWM)两种方式,SVPWM的效果好于SPWM。

2. FOC (field-oriented-control)

1. FOC的必要性

采用FOC可以克服六步换向法产生的速度和扭矩波动的问题
(在六步换向法中,定子磁场和转子磁场之间的角度在60度-120度之间波动,因此导致电机速度和扭矩波动)

在这里插入图片描述
下图左侧和右侧分别是BLDC六步换向和PMSM FOC控制时,转子磁场(蓝色箭头)和定子磁场的关系。
在这里插入图片描述

在六步换向法中,定子磁场和转子磁场之间的角度在60度-120度之间周期性的变化;
在FOC中,定子磁场和转子磁场之间始终保持正交,所能输出的扭矩最大化。
磁场定向控制大大降低了系统响应的波纹,使电机运行更加平稳。

2. 六步换向法 和 FOC 区别

1.FOC需要更复杂的控制算法
FOC使用的是交流电而不是直流电来控制电机

3. FOC控制框图、

参考:稚晖君
在这里插入图片描述

控制框图包含
1.Clarke/Park 正变换和逆变换
2.正交量iq和id的两路PI控制器

3.1PID控制

在FOC控制中主要用到三个PID环,从内环到外环依次是:电流环速度环位置环

也就是说:我们通过电流反馈来控制电机电流(扭矩) -> 然后通过控制扭矩来控制电机的转速 -> 再通过控制电机的转速控制电机位置

  1. 电流环控制框图
    .

  2. 速度环:
    在这里插入图片描述

  3. 位置环:
    可以控制电机旋转到某个精确的角度并保持
    在这里插入图片描述

3. Clarke/Park 正变换和逆变换

4. SVPWM(空间电压矢量脉宽调制)

参考:CSDN

1. SVPWM简介

SVPWM出现在SPWM之后,是针对电机负载对SPWM的做出改良后的技术。
  1. SVPWM全称Space Vector Pulse Width Modulation,意为空间矢量脉冲宽度调制,简称空间矢量脉宽调制。矢量控制和直接转矩控制变频器均基于SVPWM技术。
  2. SVPWM是由三相功率逆变器的六个功率开关元件组成的特定开关模式产生的脉宽调制波,能够使输出电流波形尽可能接近于理想的正弦波形
  3. SVPWM技术与SPWM相比较,绕组电流波形的谐波成分小,使得电机转矩脉动降低,旋转磁场更逼近圆形,而且使直流母线电压的利用率有了很大提高,且更易于实现数字化。

SVPWM算法的目的就是使用三相桥的开关状态把在空间中旋转的U(t)矢量表示出来

2. SVPWM基本原理

  1. 想要让BLDC电机转子旋转并获得最大力矩,那就让定子线圈产生的合磁场呈现旋转的姿态

  2. 要得到一个恒定大小的旋转磁场,可以先来得到一个恒定大小的旋转电压矢量。如下图:
    请添加图片描述

  3. 我们可以通过互差120度,大小随着时间按正弦规律变化的3个分矢量来合成一个大小不变旋转的总矢量。
    UA、UB、UC
    图1

  4. 如下图,将这三个分量加以一定的相位的正弦变化特性便能产生一个旋转合磁场
    下图不太准确,意义不大仅用于引发想象
    请添加图片描述

  5. 想控制这三个分量得控制三相功率逆变器的三组MOS管(a、b、c三组)开闭获得
    1.六个功率开关元件其实就是6个MOS管
    在这里插入图片描述
    2.用 1 or 0 代表a、b、c三组MOS管的开闭情况;
    在这里插入图片描述
    3.只要某组MOS管开闭时间合适,就可以获得一个SPWM波,使得其对应的线圈获得一个正弦变化的电压输入,从而产生一个正弦变化的磁场
    请添加图片描述

  6. 那么a、b、c三组MOS管如何配合呢?
    1.我们先把360度分为6个扇区,并把UA、UB、UC(对应U4、U2、Uc)三个分量放进去,
    在这里插入图片描述
    2.a、b、c三组MOS管全部可能组合共有八个
    6个非零矢量:
    Ul(001)、U2(010)、U3(011)、U4(100)、U5(101)、U6(110)、
    和两个零矢量 :
    U0(000)、U7(111),(不产生转矩)
    8种情况产生的磁场的相位关系放在扇区图中:
    在这里插入图片描述
    上图中,6个非零矢量幅值相同,相邻的矢量间隔60度。两个零矢量幅值为零,位于中心。

  7. 先拿扇区I来分析
    可以通过公式算出来此时为了生成Uref 对应的U4和U6的占空比(Tn/T)
    在这里插入图片描述

  8. 下面就是产生此时需要的方波
    1.为了减少开关次数
    SVPWM 调制方案中,零矢量的选择是最具灵活性的,适当选择零矢量,可最大限度地减少开关次数,尽可能避免在负载电流较大的时刻的开关动作,最大限度地减少开关损耗。

**疑问:**为啥只用两个分量去合成Uref,不考虑第三个分量的贡献了??????????????
在这里插入图片描述

1.上图中的T0/2等指的是两竖直虚线之间的耗时
2.上图A、B、C对应的是三组MOS管的高低电平,不是指三组线圈的PWM波形or占空比
3.A、B、C三组MOS管的高低电平(1 or 0)便可对应U1-U6矢量的发力,如下图所示:
在这里插入图片描述

3. FOC与SVPWM的配合

FOC算法,框图如下:
在这里插入图片描述

  1. 上图中的第7部分就是SVPWM,其作为FOC最终的执行部分,接收FOC传来的Uα 和Uβ,然后通过上面的过程转换成MOS开关的控制信号,控制定子绕组产生旋转磁场。

  2. FOC与SVPWM的对接
    1.首先接收FOC传来的Uα 和Uβ,做合成矢量Uref所处扇区N 的判断 (推测是和转子当前位置呼应)
    (推测:SVPWM是根据FOC提供的包含编码器角度信息的参数Uα 和Uβ,进行实时计算的)
    2.然后基本矢量作用时间计算与三相 PWM 波形的合成

FOC与SVPWM的对接就变成了,先根据N=4C+2B+A判断合成矢量所在扇区,然后查表2-4得出两非零矢量的作用时间,最后得出三相开关管PWM波的占空比,查表让算法更高效。

4. 思考

taon、tbon、tcon的波形呈马鞍形,如下:
在这里插入图片描述
在这里插入图片描述

  1. 如上图、SVPWM相电压波形为马鞍形?,线电压波形为正弦波?
  2. **疑问:**为啥只用两个分量去合成Uref,不考虑第三个分量的贡献了

5. FOC实战(代码实现)

3.自适应算法


http://chatgpt.dhexx.cn/article/kKnMkNW0.shtml

相关文章

求树的直径证明

树的直径&#xff08;最长路&#xff09; 的详细证明 主要是利用了反证法&#xff1a; 假设 s-t这条路径为树的直径&#xff0c;或者称为树上的最长路 现有结论&#xff0c;从任意一点u出发搜到的最远的点一定是s、t中的一点&#xff0c;然后在从这个最远点开始搜&#xff0c;就…

树的直径和树的重心

1.树包括有根树和无根树&#xff0c;有根树是有向图的子图&#xff0c;无根树是无向图的子图&#xff0c;都满足边数等于节点数减一。根是入度为零或没有父亲的节点 2.树的直径&#xff1a;树上最长的简单路径&#xff08;不重复经过点的路径&#xff09; 3.求解算法&#xf…

树的直径总结

树的直径 一、定义 在一棵树中&#xff0c;最远的两个子节点之间的距离被称为树的直径&#xff1b; 链接这两个点的路径被称为树的最长链&#xff1b; 有两种求法&#xff0c;时间复杂度均为 O ( n ) O(n) O(n) &#xff1b; 二、树形DP 1. 状态 由于一个点的最长路通过…

基础算法 - 树的直径

题目地址&#xff1a;https://leetcode-cn.com/problems/tree-diameter/ 1245. 树的直径 难度中等48收藏分享切换为英文接收动态反馈 给你这棵「无向树」&#xff0c;请你测算并返回它的「直径」&#xff1a;这棵树上最长简单路径的 边数。 我们用一个由所有「边」组成的数…

树的直径-c++

题目 实验室里原先有一台电脑(编号为1)&#xff0c;最近氪金带师咕咕东又为实验室购置了N-1台电脑&#xff0c;编号为2到N。每台电脑都用网线连接到一台先前安装的电脑上。但是咕咕东担心网速太慢&#xff0c;他希望知道第i台电脑到其他电脑的最大网线长度&#xff0c;但是可怜…

求树的直径算法以及证明

以下为两次dfs&#xff08;bfs&#xff09;的做法以及正确性证明。 算法步骤 &#xff08;1&#xff09;任取树上一点S&#xff0c;以S为源点BFS得S到各个顶点的d值&#xff1b; &#xff08;2&#xff09;取d值最大者之一为P&#xff0c;再以P为源点BFS得P到各个顶点的d值&am…

求树的直径

树的直径&#xff0c;即树上的最长路径&#xff0c;显然&#xff0c;树的直径可以有很多条&#xff08;考虑一棵菊花&#xff09;。 接下来我们考虑如何求出一棵树的直径。有很多种O(n)的算法。 算法1&#xff1a;我们任取树中的一个节点x&#xff0c;找出距离它最远的点y&am…

数据结构 树的直径

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。 学习日记 目录 学习日记 一、定义 二、两次DFS 定理&#xff1a; 反证法证明&#xff1a; 1、若y在d(t,s)上 2、若y不在d(s,t)上&#xff0c;且d(y,z)与d(s.t)…

树的直径(最长的简单路径)

题解&#xff1a;分析一下&#xff0c;由于是树&#xff0c;所以两点之间的路径有且只有一条&#xff0c;为了求出欧拉路&#xff0c;所以必然会向回走&#xff0c;从递归的角度来看&#xff0c;假设x看作一个树根&#xff0c;有t个孩子y1…yt。其中每个孩子为根的子树欧拉路都…

树的直径概念及求解

文章目录 1. 使用两次DFS求得树的直径2. 使用树形DP求得树的直径3. 性质4. 参考文献和习题 树上任意两节点之间最长的简单路径即为树的「直径」。显然&#xff0c;一棵树可以有多条直径&#xff0c;他们的长度相等。可以用两次 D F S / B F S DFS/BFS DFS/BFS 或者树形 D P D…

树的直径两种求法

首先先介绍一下什么是树的直径&#xff0c;树的直径就是树中所有最短路经距离的最大值。 求树的直径通常有两种方法&#xff0c;一种是通过两次搜索&#xff08;bfs和dfs均可&#xff09;&#xff0c;另一种就是通过树形dp来求了。 先来介绍一下用两次深搜来求树的直径&#x…

树的直径的概念

树的直径的定义: 在一棵树中&#xff0c;每一条边都有权值&#xff0c;树中的两个点之间的距离&#xff0c;定义为连接两点的路径上边权之和&#xff0c; 那么树上最远的两个点&#xff0c;他们之间的距离&#xff0c;就被称之为&#xff0c;树的直径。 树的直径的别称&#x…

树的直径

【定义】 我们将一棵树T ( V&#xff0c;E )的直径定义为maxδ ( u&#xff0c;v ) ( u&#xff0c;v ∈ V )&#xff0c;也就是说&#xff0c;树中所有最短路径距离的最大值即为树的直径。 【做法】 例题传送门Cow Marathon&#xff08;POJ 1985&#xff09; 对于树的直径…

浅谈树的直径

一、定义&#xff1a; 我们将一棵树T(V,E)的直径定义为max(u,v) (u,v∈V)&#xff0c;也就是说&#xff0c;树中所有最短路径距离的最大值即为树的直径。&#xff08;就是树中的最长路径的长度&#xff09; 二、求解树德直径&#xff1a; 求得树的直径有两种方法&#xff0c;一…

3.网络基础-三层路由网络

3.1、IP地址 初识IP地址 • 在IP网络中&#xff0c;通信节点需要有一个唯一的IP地址&#xff1b; • IP地址用于IP报文的寻址以及标识一个节点&#xff1b; • IPv4地址一共32bits&#xff0c;使用点分十进制的形式表示&#xff1b; IP地址的分类 E类是保留地址 公有IP及私有…

计算机网络——配置动态路由实验

配置动态路由实验 实验目的实验软件实验要求实验知识实验步骤实验结果 实验目的 掌握 RIP 协议配置。RIP 协议配置的命令为&#xff1a;router(config)#network <connected-network> 其中参数 <connected-network> 表示路由器的直连网络号。 实验软件 Cisco Pac…

路由技术基础

路由技术是在网络拓扑结构中为不同节点的数据提供传输路径的技术&#xff0c;路由选择算法是其核心内容。路由选择算法分为静态路由选择算法和动态路由选择算法。 一.路由基础 1.路由的基本概念 路由、路由器 &#xff08;1&#xff09;路由 路由是指导IP报文从源发送到目…

网络路由交换 -- 静态路由 和 缺省路由

1.IP路由基础 1.什么是静态路由&#xff1f; 静态路由是由管理员手工添加的路由条目&#xff1b;通过静态路由添加的都是非直连网段。 2.静态路由的特点&#xff1f; 静态路由的添加和删除都需要手工完成&#xff1b;静态路由无法适应网络的动态变更&#xff0c;即缺乏适应…

cisco packet tracer配置网络路由

广州大学 计算机网络实验 配置网络路由 利用packet tracer搭建如图网络 中间是三个路由器&#xff0c;两边各接一台计算机。 首先先把网络搭建出来 1是路由器&#xff0c;2是终端设备&#xff0c;3是连接设备的线缆。左键点击1或者2或3&#xff0c;区域4就会出现不同的路由器…

路由的几个基本概念-直连路由/网关路由/主机路由/网络路由/动态路由/静态路由/默认路由

1.动态路由/静态路由 1&#xff09;动态路由 路由选择器自动共享路由信息 自动构造路由表&#xff0c;需要一个路由协议&#xff0c;如RIP或OSPF 2&#xff09;静态路由 路由选择器不共享路由信息&#xff08;单方向路由&#xff09; 手工构造路由表 2.直连路由/网关路由…