你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
Schematic Prints1.pdf
2018-8-1 11:34 上传
点击文件名下载附件
80.47 KB, 下载次数: 193, 下载积分: ST金币 -1
以å设计çï¼éªè¯è¿çå¯ä»¥ç¨ï¼è®¾è®¡ä¸å¦æ缺é·å¿å·
STM32F103_æ°¸ç£åæ¥çµæº_PMSM_FOC软件åº_ç¨æ·æå_ä¸æç.pdf
2018-9-14 11:46 上传
2.42 MB, 下载次数: 615, 下载积分: ST金币 -1
举报
单片机_电子爱好者 发表于 2018-11-13 18:04 我这几天推了一下,知道为什么少了根号3/Udc,主要是因为标幺话的缘故,st程序中对V alfe和Vbeta标幺成Q15 ...
龙吞潭水 发表于 2018-11-29 09:29 楼主,能不能分析一下 FOC 2.0 无感启动过程啊? void STO_Start_Up(void) {
查看全部评分
努力的人 发表于 2017-8-5 19:08 https://www.stmcu.org.cn/module/forum/thread-610617-1-1.html看我的帖子
czhuanqilai 发表于 2018-2-5 00:12 安哥文档就是你贴出来得那个,看了文档之后看ST的程序,看不懂
qwerzxcv-339169 发表于 2018-8-3 13:55 楼主你好,你看的官网文档能发我一份么?就是图片里讲关于扇区判定的文档,谢谢! ...
楼主,能不能分析一下 FOC 2.0 无感启动过程啊?
void STO_Start_Up(void)
{
s16 hAux;
#ifdef NO_SPEED_SENSORS_ALIGNMENT
static u32 wAlignmentTbase=0;
#endif
switch(Start_Up_State)
{
case S_INIT:
//Init Ramp-up variables
if (hSpeed_Reference >= 0)
{
hFreq_Inc = FREQ_INC;
hI_Inc = I_INC;
if (wTime == 0)
{
wStart_Up_I = FIRST_I_STARTUP *1024;
}
}
else
{
hFreq_Inc = -(s16)FREQ_INC;
hI_Inc = -(s16)I_INC;
if (wTime == 0)
{
wStart_Up_I = -(s32)FIRST_I_STARTUP *1024;
}
}
Start_Up_State = ALIGNMENT;
break;
case ALIGNMENT:
#ifdef NO_SPEED_SENSORS_ALIGNMENT
wAlignmentTbase++;
if(wAlignmentTbase <= SLESS_T_ALIGNMENT_PWM_STEPS)
{
hFlux_Reference = SLESS_I_ALIGNMENT * wAlignmentTbase /
SLESS_T_ALIGNMENT_PWM_STEPS;
hTorque_Reference = 0;
Stat_Curr_a_b = GET_PHASE_CURRENTS();
Stat_Curr_alfa_beta = Clarke(Stat_Curr_a_b);
Stat_Curr_q_d = Park(Stat_Curr_alfa_beta, SLESS_ALIGNMENT_ANGLE_S16);
/*loads the Torque Regulator output reference voltage Vqs*/
Stat_Volt_q_d.qV_Component1 = PID_Regulator(hTorque_Reference,
Stat_Curr_q_d.qI_Component1, &PID_Torque_InitStructure);
/*loads the Flux Regulator output reference voltage Vds*/
Stat_Volt_q_d.qV_Component2 = PID_Regulator(hFlux_Reference,
Stat_Curr_q_d.qI_Component2, &PID_Flux_InitStructure);
RevPark_Circle_Limitation();
/*Performs the Reverse Park transformation,
i.e transforms stator voltages Vqs and Vds into Valpha and Vbeta on a
stationary reference frame*/
Stat_Volt_alfa_beta = Rev_Park(Stat_Volt_q_d);
/*Valpha and Vbeta finally drive the power stage*/
CALC_SVPWM(Stat_Volt_alfa_beta);
}
else
{
wAlignmentTbase = 0;
Stat_Volt_q_d.qV_Component1 = Stat_Volt_q_d.qV_Component2 = 0;
hTorque_Reference = PID_TORQUE_REFERENCE;
hFlux_Reference = PID_FLUX_REFERENCE;
Start_Up_State = RAMP_UP;
hAngle = SLESS_ALIGNMENT_ANGLE_S16;
}
#else
Start_Up_State = RAMP_UP;
#endif
break;
case RAMP_UP:
wTime ++;
if (wTime <= I_STARTUP_PWM_STEPS)
{
wStart_Up_Freq += hFreq_Inc;
wStart_Up_I += hI_Inc;
}
else if (wTime <= FREQ_STARTUP_PWM_STEPS )
{
wStart_Up_Freq += hFreq_Inc;
}
else
{
MCL_SetFault(START_UP_FAILURE);
//Re_initialize Start Up
STO_StartUp_Init();
}
//Add angle increment for ramp-up
hAux = wStart_Up_Freq/65536;
hAngle = (s16)(hAngle + (s32)(65536/(SAMPLING_FREQ/hAux)));
Stat_Curr_a_b = GET_PHASE_CURRENTS();
Stat_Curr_alfa_beta = Clarke(Stat_Curr_a_b);
Stat_Curr_q_d = Park(Stat_Curr_alfa_beta, hAngle);
hAux = wStart_Up_I/1024;
hTorque_Reference = hAux;
hFlux_Reference = 0;
/*loads the Torque Regulator output reference voltage Vqs*/
Stat_Volt_q_d.qV_Component1 = PID_Regulator(hTorque_Reference,
Stat_Curr_q_d.qI_Component1, &PID_Torque_InitStructure);
/*loads the Flux Regulator output reference voltage Vds*/
Stat_Volt_q_d.qV_Component2 = PID_Regulator(hFlux_Reference,
Stat_Curr_q_d.qI_Component2, &PID_Flux_InitStructure);
RevPark_Circle_Limitation();
/*Performs the Reverse Park transformation,
i.e transforms stator voltages Vqs and Vds into Valpha and Vbeta on a
stationary reference frame*/
Stat_Volt_alfa_beta = Rev_Park(Stat_Volt_q_d);
/*Valpha and Vbeta finally drive the power stage*/
CALC_SVPWM(Stat_Volt_alfa_beta);
STO_Calc_Rotor_Angle(Stat_Volt_alfa_beta,Stat_Curr_alfa_beta,MCL_Get_BusVolt());
if (IsObserverConverged()==TRUE)
{
PID_Speed_InitStructure.wIntegral = (s32)(hTorque_Reference*256);
STO_StartUp_Init();
State = RUN;
if ((wGlobal_Flags & SPEED_CONTROL) != SPEED_CONTROL)
{
hTorque_Reference = PID_TORQUE_REFERENCE;
hFlux_Reference = PID_FLUX_REFERENCE;
}
}
break;
default:
break;
}
}
/*******************************************************************************
* Function Name : STO_StartUp_Init
* Description : This private function initializes the sensorless start-up
* Input : details the input parameters.
* Output : details the output parameters.
* Return : details the return value.
*******************************************************************************/
void STO_StartUp_Init(void)
{
//Re_initialize Start Up
Start_Up_State = S_INIT;
hAngle = 0;
wTime = 0;
wStart_Up_Freq = 0;
bConvCounter = 0;
}
我今天看了一下,st的无感启动流程大致是三步:预定位 强拖 闭环
预定位: 转矩电流给0 励磁电流给设定的最大电流值(从0增加到SLESS_I_ALIGNMENT) 把D轴吸到90度位置,执行时间是SLESS_T_ALIGNMENT设定的值默认700ms 时间已到完成预定位
强拖: 励磁电流给0 转矩电流从FIRST_I_STARTUP增加到设定的最大电流值FINAL_I_STARTUP执行时间I_START_UP_DURATION(默认FIRST_I_STARTUP=FINAL_I_STARTUP),并且在电流增加的过程角速度dpp从0增加到FINAL_START_UP_SPEED,执行时间FREQ_START_UP_DURATION,并且一直检测无感算法是否收敛,如果收敛闭环,否则继续拖,如果时间大于FREQ_START_UP_DURATION还未收敛,认为启动失败
闭环 : 就是无感估算位置啦
其实说白了就是BLDC的升压升频拖动,默认恒压升频拖动,讲的够详细了吧,个人愚见,有更好的启动算法可以讨论
评分
查看全部评分
楼主贴出来的文档里的Uα 与 Uβ 和现在网上 的文档给出的公式不一样,不知道为啥要乘以T
能讲解一下么?
安哥文档就是你贴出来得那个,看了文档之后看ST的程序,看不懂
T就是采样的时间,要想搞懂就自己写程序,SVPWM的程序网上就能搜到,ST的库我一般都是调用库的API来进行控制的。你就单独写SVPWM的程序调,光看是不行的
评分
查看全部评分
附件里面有啊,我没有设置要积分啊,