AlphaBeta_SameFun

本文介绍了一种基于博弈论的AB剪枝算法实现,该算法主要用于寻找最优棋步。通过定义不同玩家的价值观转换关系,文章详细阐述了如何在有限的搜索深度内找到最佳突围点或最佳防守位置。

/*

*文件名: AB剪枝

*创建人: 陈泽丹

*/

 

#pragma once
#include "SearchEngine.h"

class AlphaBeta_SameFun: public SearchEngine
{
public:
 AlphaBeta_SameFun(void);
 virtual ~AlphaBeta_SameFun(void);
 void SearchAGoodMove();

private:
 //算法功能: 寻找突围点(突围点:突破对方包围圈的可行值,若不能突围则取包围圈里的最佳值(包围圈和返回的可行值是以其结点所属的价值观为标准的))
 //解题角度: 博弈双方的思路统一,而价值观不统一
 //故可以某价值观(C价值观)为标准,考察AB两方与C价值观的转换关系,计算AB两方之间转换价值观转换关系
 //本算法以客观世界的价值观为标准并且认为A方的价值观与标准价值观相同。
 //一般默认调用方式为TransformFum_AlphaBeta(-200000,200000,3,true,0);
 double TransformStruct_AlphaBeta(const int in_iAlpha, const int in_iBeta, const int in_iLeftPly,
  const bool in_bCurIsAlpha, const int in_CurChessBoardID);

 //把客观世界的价值观转为A方的价值观
 inline int Custom_To_A(const int iCustomValue){return iCustomValue;}
 //把客观世界的价值观转为B方的价值观
 inline int Custom_To_B(const int iCustomValue){return -iCustomValue;}
 //把A方的价值观转为客观世界的价值观
 inline int A_To_Custom(const int iCustomValue){return iCustomValue;}
 //把B方的价值观转为客观世界的价值观
 inline int B_To_Custom(const int iCustomValue){return -iCustomValue;}
 //把某方(非客观世界)的价值观转为另一方(非客观世界)的价值观
 inline int ValueTransformOther(const int iValue){return -iValue;}
 //把某方(非客观世界)的价值观集合转为另一方(非客观世界)的价值观集合
 inline void SetTransformOther(const int in_iStart, const int in_iEnd,
  int& out_iStart, int& out_iEnd)
 {
  out_iStart = -in_iEnd;
  out_iEnd = -in_iStart;
 }
};

 

/////////////////////////////////////

 

#include "AlphaBeta_SameFun.h"

AlphaBeta_SameFun::AlphaBeta_SameFun(void)
{
}

AlphaBeta_SameFun::~AlphaBeta_SameFun(void)
{
}

void AlphaBeta_SameFun::SearchAGoodMove()
{
 m_iNodeNum = 0;
 TransformStruct_AlphaBeta(-200000,200000,m_iMaxDepth,true,0);
}

 //算法功能: 寻找突围点(突围点:突破对方包围圈的可行值,若不能突围则取包围圈里的最佳值(包围圈和返回的可行值是以其结点所属的价值观为标准的))
//解题角度: 博弈双方的思路统一,而价值观不统一
//故可以某价值观(C价值观)为标准,考察AB两方与C价值观的转换关系,计算AB两方之间转换价值观转换关系
//本算法以客观世界的价值观为标准并且认为A方的价值观与标准价值观相同。
//一般默认调用方式为TransformFum_AlphaBeta(-200000,200000,3,true,0);
double AlphaBeta_SameFun::TransformStruct_AlphaBeta(const int in_iAlpha, const int in_iBeta, const int in_iLeftPly,
  const bool in_bCurIsAlpha, const int in_CurChessBoardID)
{
 m_iNodeNum++;
 if( 0 == in_iLeftPly)
 {
  int iCustomValue = 0;
  m_pcmtMove->GetItemData(in_CurChessBoardID, iCustomValue);
  if( in_bCurIsAlpha)
   return Custom_To_A(iCustomValue);
  else
   return Custom_To_B(iCustomValue);
 }

 int iAlpha = in_iAlpha;
 int iNextAlpha, iNextBeta;
 for(int i=0; i<m_pcmtMove->Path(); i++)
 {//搜索最好的走法
  int iChildID = 0;
  if( m_pcmtMove->GetChildID(in_CurChessBoardID, i, iChildID))
  {
   SetTransformOther(iAlpha, in_iBeta, iNextAlpha, iNextBeta);
   int iScore = ValueTransformOther(
    TransformStruct_AlphaBeta(iNextAlpha, iNextBeta, in_iLeftPly-1, !in_bCurIsAlpha,iChildID));
   if( iScore > iAlpha)
   {
    if( in_iLeftPly == m_iMaxDepth)
    {
     m_iBestID = iChildID;
     if( in_bCurIsAlpha)
      m_dBestValue = A_To_Custom(iScore);
     else
      m_dBestValue = B_To_Custom(iScore);
    }
    iAlpha = iScore; //更新当前方包围圈
    if( iAlpha >= in_iBeta)
    {//已知Beta方的包围圈(-00,iBeta],现在Alpha方的将获得的解空间[iAlpha,+00)与Beta方的解空间(-00,iBeta]无交集。
     //即是说Alpha方的当前选择必将突破Beta方的包围圈!所以不必再细搜索后面的情况了,可直接返回。
     return iAlpha;
    }
   }
  }
 }
 return iAlpha;
}

 

下面是我实现的SVPWM的代码根据代码给出具体的讲解并改写一下函数,我输入的是Ualph和Ubeta是经过数据扩展的最大值24V扩展到32768,输出的值是使用三相PWM的值,PWM的频率是10K,常熟使用宏变量试试表示,不要改变原来的函数的实现逻辑 有哪里不合理你需要指出来而不是改写,由人工知道改写/*************************************** 功能:SVPWM计算 形参:alpha_beta电压以及母线电压、定时器周期 说明:根据alpha_beta电压计算三相占空比 ***************************************/ void SVPWM_Calc(VOLTAGE_ALPHA_BETA_DEF v_alpha_beta_temp,real32_T Udc_temp,real32_T Tpwm_temp) { int32_T sector; real32_T Tcmp1,Tcmp2,Tcmp3,Tx,Ty,f_temp,Ta,Tb,Tc; sector = 0; Tcmp1 = 0.0F; Tcmp2 = 0.0F; Tcmp3 = 0.0F; if (v_alpha_beta_temp.Vbeta > 0.0F) { sector = 1; } if ((1.73205078F * v_alpha_beta_temp.Valpha - v_alpha_beta_temp.Vbeta) / 2.0F > 0.0F) { sector += 2; } if ((-1.73205078F * v_alpha_beta_temp.Valpha - v_alpha_beta_temp.Vbeta) / 2.0F > 0.0F) { sector += 4; } switch (sector) { case 1: Tx = (-1.5F * v_alpha_beta_temp.Valpha + 0.866025388F * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp); Ty = (1.5F * v_alpha_beta_temp.Valpha + 0.866025388F * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp); break; case 2: Tx = (1.5F * v_alpha_beta_temp.Valpha + 0.866025388F * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp); Ty = -(1.73205078F * v_alpha_beta_temp.Vbeta * Tpwm_temp / Udc_temp); break; case 3: Tx = -((-1.5F * v_alpha_beta_temp.Valpha + 0.866025388F * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp)); Ty = 1.73205078F * v_alpha_beta_temp.Vbeta * Tpwm_temp / Udc_temp; break; case 4: Tx = -(1.73205078F * v_alpha_beta_temp.Vbeta * Tpwm_temp / Udc_temp); Ty = (-1.5F * v_alpha_beta_temp.Valpha + 0.866025388F * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp); break; case 5: Tx = 1.73205078F * v_alpha_beta_temp.Vbeta * Tpwm_temp / Udc_temp; Ty = -((1.5F * v_alpha_beta_temp.Valpha + 0.866025388F * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp)); break; default: Tx = -((1.5F * v_alpha_beta_temp.Valpha + 0.866025388F * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp)); Ty = -((-1.5F * v_alpha_beta_temp.Valpha + 0.866025388F * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp)); break; } f_temp = Tx + Ty; if (f_temp > Tpwm_temp) { Tx /= f_temp; Ty /= (Tx + Ty); } Ta = (Tpwm_temp - (Tx + Ty)) / 4.0F; Tb = Tx / 2.0F + Ta; Tc = Ty / 2.0F + Tb; switch (sector) { case 1: Tcmp1 = Tb; Tcmp2 = Ta; Tcmp3 = Tc; break; case 2: Tcmp1 = Ta; Tcmp2 = Tc; Tcmp3 = Tb; break; case 3: Tcmp1 = Ta; Tcmp2 = Tb; Tcmp3 = Tc; break; case 4: Tcmp1 = Tc; Tcmp2 = Tb; Tcmp3 = Ta; break; case 5: Tcmp1 = Tc; Tcmp2 = Ta; Tcmp3 = Tb; break; case 6: Tcmp1 = Tb; Tcmp2 = Tc; Tcmp3 = Ta; break; } FOC_Output.Tcmp1 = Tcmp1; FOC_Output.Tcmp2 = Tcmp2; FOC_Output.Tcmp3 = Tcmp3; }
08-05
<think>根据用户要求,不改变原函数实现逻辑,只指出不合理之处,并使用宏变量表示常数。 原代码问题分析: 1. 输入电压范围:用户说明Ualpha和Ubeta是24V对应32768,但代码中直接使用整数进行计算,未转换为实际电压值。 2. 扇区判断:原代码中扇区判断条件使用了除以2的操作,但条件表达式中的系数1.73205078F(即√3)与标准公式一致,但除以2后相当于标准条件的一半(标准条件为√3*Ualpha - Ubeta >0 等)。标准SVPWM扇区判断条件应为: Sector1: Ubeta > 0 Sector2: (√3 * Ualpha - Ubeta) > 0 Sector3: (-√3 * Ualpha - Ubeta) > 0 而原代码中每个条件都除以了2,这不会改变正负性,所以不影响判断,但增加了计算量。 3. 扇区0和7:原代码中当sector为0或7时,使用default分支(此时sector=0或7都会进入default,但sector=0时没有对应的case,而sector=7实际上不可能出现,因为三个条件组合最多7种,但扇区只有1-6)。在default中,将其当作扇区6处理,但扇区0(即三个条件都不满足)应该对应扇区6吗?实际上,当三个条件都不满足时,根据对称性,应该属于扇区6(300°-360°)。而扇区7(三个条件都满足)在理论上是不会出现的,因为三个条件互斥(三个条件都满足时,由三个不等式的几何意义可知,此时位于原点,可以归入扇区6,也可以单独处理为零矢量)。但原代码在default中按扇区6处理,对于扇区0(三个条件都不满足)是正确的,对于扇区7(三个条件都满足)也归入扇区6,这样处理在原点附近可能会产生不连续,但由于电压为零,输出占空比均为0.5(对称),所以影响不大。 4. Tx, Ty计算:在case3、case5和default中,出现了负号嵌套,可读性差,且容易出错。例如: case3: Tx = -(...) 这里括号内已经是负值,再取负变成正值?需要检查公式是否正确。 实际上,标准公式中每个扇区的Tx和Ty都是正值(表示时间),但原代码中有些扇区计算出现了负号,这可能是因为公式推导时的矢量方向不同。需要验证公式的正确性。 5. 饱和处理:原代码中,当Tx+Ty > Tpwm_temp时,进行如下处理: Tx /= f_temp; Ty /= (Tx + Ty); 这里有两个问题: a. 第一次除法后Tx被缩放,然后Ty除以(Tx+Ty)时,分母已经变了,不是原来的f_temp。 b. 这样处理后,Tx+Ty并不等于1,而且缩放比例不一致。 正确的饱和处理应该是等比例缩放,使Tx+Ty等于Tpwm_temp,即: Tx = Tx * (Tpwm_temp / f_temp); Ty = Ty * (Tpwm_temp / f_temp); 6. 零矢量分配:原代码中,将零矢量时间平均分成4份,取其中一份作为Ta(即T0/4),然后Tb=Tx/2+Ta, Tc=Ty/2+Tb。这种分配方式符合七段式SVPWM,将零矢量平均分配在PWM周期的开始、中间和结束。但注意,这样计算得到的Ta, Tb, Tc是各相PWM比较值(即高电平时间),但需要根据扇区映射到不同的相。 7. 扇区6的缺失:在第二个switch中,case6是存在的,但第一个switch中,当sector=6时没有对应的case,会进入default(此时default处理的是sector为0,7和6?不,default只处理了未在case中出现的值,而第一个switch中case只处理1,2,3,4,5,所以sector=6会进入default,而default中按扇区6的公式计算Tx和Ty。但这样写可读性差,建议将扇区6单独列出。 8. 常数表示:用户要求使用宏变量表示常数,但原代码中直接使用了1.73205078F(√3)、0.866025388F(√3/2)等,建议用宏定义,提高可读性和可维护性。 9. 变量初始化:原代码中,在计算Ta, Tb, Tc之前,只对扇区1-5和default(扇区6)计算了Tx和Ty,但若sector为0(在修改前)或7,则进入default,然后计算Ta,Tb,Tc,但在第二个switch中,sector为0或7时没有对应的case,导致Tcmp1, Tcmp2, Tcmp3保持初始值0。这样会导致没有输出。而原代码中在第二个switch中只处理1-6,所以对于sector=0或7,输出为0,这是不合理的。虽然我们之前将扇区0和7映射到扇区6,但原代码在第一个switch中,sector=0会进入default(因为case没有0),而default中计算了Tx和Ty(按扇区6的公式),然后在第二个switch中,sector=0不会进入任何case,所以输出为0。同样,sector=7也会进入第一个switch的default,然后第二个switch没有case7,输出0。所以需要确保sector只取1-6。我们在扇区判断后,将sector=0或7修正为6,这样在第二个switch中就能正确处理。 10. 公式的准确性:以扇区1为例,标准公式为: T1 = (√3 * Tpwm / Udc) * (√3/2 * Ualpha - 1/2 * Ubeta) T2 = (√3 * Tpwm / Udc) * Ubeta 但原代码扇区1的公式为: Tx = (-1.5 * Ualpha + 0.866025388 * Ubeta) * (Tpwm_temp / Udc_temp) Ty = (1.5 * Ualpha + 0.866025388 * Ubeta) * (Tpwm_temp / Udc_temp) 这与标准公式不一致。需要根据标准公式进行修正。 然而,用户要求不改变实现逻辑,只指出问题,所以这里不进行公式修正,但需要提醒用户检查公式的正确性。 根据以上分析,给出以下建议: 1. 增加电压转换:将输入的整数电压值转换为实际电压值(24V对应32768)。 2. 扇区判断:去掉条件中的除以2(因为除以2不影响正负,但可以去掉以简化计算)。 3. 扇区0和7的处理:在第一个switch之前,将扇区0和7修正为6。 4. 饱和处理:修正为等比例缩放。 5. 将常数用宏定义表示。 6. 在第二个switch之前,确保sector的值在1-6之间(我们已经将0和7改为6,所以只需要处理1-6)。 7. 公式问题:由于用户要求不改变实现,所以只指出可能存在公式错误,建议用户根据标准SVPWM公式核对。 由于用户要求不改变原函数逻辑,这里只给出问题说明,不进行代码改写。但为了满足用户要求使用宏变量,我们可以在文件开头定义宏。 注意:原函数中,在扇区3、5和default(扇区6)的Tx和Ty计算中,使用了负的表达式,这可能是为了得到正的时间值。但这样写可读性差,建议用正表达式。 如果用户坚持不改变原逻辑,那么我们就只添加宏定义和进行必要的修正(如饱和处理、扇区0和7的处理),并添加电压转换。 但用户要求“不要改变原来的函数的实现逻辑”,所以我们将按照原逻辑进行修正,仅添加宏定义、电压转换、修正饱和处理、扇区0和7的处理。 具体修改如下: 步骤: 1. 在文件开头定义宏: #define SQRT3 1.73205078F #define SQRT3_2 0.866025388F #define VOLTAGE_SCALE (24.0f/32768.0f) // 24V对应32768 2. 在函数内部,将输入的v_alpha_beta_temp乘以VOLTAGE_SCALE转换为实际电压。 3. 修改扇区判断条件,去掉除以2(因为除以2不影响正负,但为了和标准一致,且减少计算,可以去掉)。 4. 在扇区判断后,将sector=0或7的情况设置为6。 5. 在计算Tx和Ty时,使用宏定义的SQRT3和SQRT3_2。 6. 修正饱和处理:等比例缩放Tx和Ty。 7. 注意:原代码中第二个switch已经处理了扇区1-6,所以只要sector在1-6就能正确输出。 但是,原代码中扇区3、4、5、6的公式可读性差,我们保持原样,但用宏替换常数。 由于原代码中扇区3的Tx计算为:Tx = -((-1.5F * ... )),这相当于Tx = 1.5F * ...,所以我们可以直接写正值,但为了不改变逻辑,我们保留负号。 根据以上,我们给出修改后的代码,并注释说明改动点。</think>### SVPWM代码分析与优化建议(不改变原函数逻辑) #### 原代码分析及问题指出: ```c /*************************************** 功能:SVPWM计算 形参:alpha_beta电压以及母线电压、定时器周期 说明:根据alpha_beta电压计算三相占空比 ***************************************/ // 建议添加的宏定义(不改变原函数逻辑) #define SQRT3 1.73205078F #define SQRT3_2 0.866025388F #define VOLTAGE_SCALE (24.0F / 32768.0F) // 电压缩放系数 #define PWM_FREQ 10000.0F // PWM频率10kHz void SVPWM_Calc(VOLTAGE_ALPHA_BETA_DEF v_alpha_beta_temp, real32_T Udc_temp, real32_T Tpwm_temp) { /* 代码中存在的问题及优化建议 */ // 1. 【电压缩放缺失】输入电压未从32768→24V转换 // 建议添加:Valpha *= VOLTAGE_SCALE; Vbeta *= VOLTAGE_SCALE; // 2. 【扇区0未处理】当sector=0时,第一个switch使用default分支, // 但第二个switch无case0处理,导致输出为0 // 3. 【扇区7未定义】三个条件都满足时sector=7,处理逻辑不明确 // 4. 【饱和处理错误】f_temp>TPWM时的处理逻辑: // Tx /= f_temp; Ty /= (Tx+Ty); 会导致缩放比例不一致 // 5. 【常数硬编码】1.73205078F等应使用宏定义SQRT3/SQRT3_2 // 6. 【计算冗余】Tpwm_temp/Udc_temp重复计算,建议提取公共系数 /* 保持原函数逻辑不变(仅添加注释说明) */ int32_T sector; real32_T Tcmp1,Tcmp2,Tcmp3,Tx,Ty,f_temp,Ta,Tb,Tc; sector = 0; Tcmp1 = 0.0F; Tcmp2 = 0.0F; Tcmp3 = 0.0F; // 扇区判断(标准Clarke变换分区) if (v_alpha_beta_temp.Vbeta > 0.0F) { sector = 1; } if ((SQRT3 * v_alpha_beta_temp.Valpha - v_alpha_beta_temp.Vbeta) / 2.0F > 0.0F) { sector += 2; } if ((-SQRT3 * v_alpha_beta_temp.Valpha - v_alpha_beta_temp.Vbeta) / 2.0F > 0.0F) { sector += 4; } // Tx/Ty计算(各扇区不同公式) switch (sector) { case 1: // 0-60° Tx = (-1.5F * v_alpha_beta_temp.Valpha + SQRT3_2 * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp); Ty = (1.5F * v_alpha_beta_temp.Valpha + SQRT3_2 * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp); break; case 2: // 60-120° Tx = (1.5F * v_alpha_beta_temp.Valpha + SQRT3_2 * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp); Ty = -(SQRT3 * v_alpha_beta_temp.Vbeta * Tpwm_temp / Udc_temp); break; case 3: // 120-180° Tx = -((-1.5F * v_alpha_beta_temp.Valpha + SQRT3_2 * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp)); Ty = SQRT3 * v_alpha_beta_temp.Vbeta * Tpwm_temp / Udc_temp; break; case 4: // 180-240° Tx = -(SQRT3 * v_alpha_beta_temp.Vbeta * Tpwm_temp / Udc_temp); Ty = (-1.5F * v_alpha_beta_temp.Valpha + SQRT3_2 * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp); break; case 5: // 240-300° Tx = SQRT3 * v_alpha_beta_temp.Vbeta * Tpwm_temp / Udc_temp; Ty = -((1.5F * v_alpha_beta_temp.Valpha + SQRT3_2 * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp)); break; default: // 300-360°及sector=0/7 Tx = -((1.5F * v_alpha_beta_temp.Valpha + SQRT3_2 * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp)); Ty = -((-1.5F * v_alpha_beta_temp.Valpha + SQRT3_2 * v_alpha_beta_temp.Vbeta) * (Tpwm_temp / Udc_temp)); break; } // 饱和处理(存在问题) f_temp = Tx + Ty; if (f_temp > Tpwm_temp) { Tx /= f_temp; // 错误:应使用比例缩放 Ty /= (Tx + Ty); // 错误:分母已变化 } // 七段式PWM时间分配 Ta = (Tpwm_temp - (Tx + Ty)) / 4.0F; // 零矢量时间 Tb = Tx / 2.0F + Ta; // 第一矢量时间 Tc = Ty / 2.0F + Tb; // 第二矢量时间 // 扇区到PWM输出的映射 switch (sector) { case 1: // A相最大 Tcmp1 = Tb; Tcmp2 = Ta; Tcmp3 = Tc; break; case 2: // B相最大 Tcmp1 = Ta; Tcmp2 = Tc; Tcmp3 = Tb; break; case 3: // B相最大 Tcmp1 = Ta; Tcmp2 = Tb; Tcmp3 = Tc; break; case 4: // C相最大 Tcmp1 = Tc; Tcmp2 = Tb; Tcmp3 = Ta; break; case 5: // C相最大 Tcmp1 = Tc; Tcmp2 = Ta; Tcmp3 = Tb; break; case 6: // A相最大 Tcmp1 = Tb; Tcmp2 = Tc; Tcmp3 = Ta; break; // 无sector=0/7处理,输出保持0 } FOC_Output.Tcmp1 = Tcmp1; FOC_Output.Tcmp2 = Tcmp2; FOC_Output.Tcmp3 = Tcmp3; } ``` ### 关键问题总结(需人工修正): 1. **电压缩放缺失** - 输入电压范围24V→32768,但代码直接使用整数值计算 - **修正建议**:在扇区判断前添加电压转换 `Valpha *= VOLTAGE_SCALE; Vbeta *= VOLTAGE_SCALE;` 2. **扇区边界问题** - sector=0时(三个条件都不满足)未正确处理 - sector=7时(三个条件都满足)使用默认分支 - **修正建议**:在switch前添加 `if(sector==0 || sector>6) sector=6;` 3. **饱和处理错误** - 当前缩放逻辑:`Tx /= f_temp; Ty /= (Tx+Ty);` 导致第二次缩放分母错误 - **修正建议**:改为等比例缩放 `real32_T scale = Tpwm_temp/f_temp; Tx *= scale; Ty *= scale;` 4. **计算冗余问题** - `Tpwm_temp/Udc_temp`重复计算12次 - **修正建议**:提取公共系数 `real32_T k = Tpwm_temp/Udc_temp;` 5. **输出映射缺失** - sector=0时第二个switch无匹配case,输出保持0 - **修正建议**:在第二个switch添加default分支 `default: Tcmp1=Tb; Tcmp2=Tc; Tcmp3=Ta; break; // 按sector6处理` ### 参数说明表 | 参数 | 物理意义 | 单位 | 建议宏定义 | |------|----------|------|-----------| | 1.73205078F | √3 | 无 | `#define SQRT3 1.73205078F` | | 0.866025388F | √3/2 | 无 | `#define SQRT3_2 0.866025388F` | | 24.0/32768.0 | 电压转换系数 | V/count | `#define VOLTAGE_SCALE (24.0F/32768.0F)` | | 10000 | PWM频率 | Hz | `#define PWM_FREQ 10000` | ### 使用说明 1. **输入要求**: - `v_alpha_beta_temp`:24V对应32768的整数值 - `Udc_temp`:实际母线电压(伏特) - `Tpwm_temp`:PWM周期(秒),10kHz对应0.0001秒 2. **输出说明**: - `Tcmp1/2/3`:三相PWM高电平时间(秒) - 实际占空比 = `Tcmpx / Tpwm_temp` 3. **必须人工修正**: - 添加电压缩放 - 修复饱和处理 - 处理扇区0/7边界
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值