类型 | 型号 | 封装 | 数量 |
电阻 | 10R | 0603*4 | 1 |
100R | 0805 | 1 | |
1K | 0603*4 | 7 | |
1K | 0805 | 3 | |
5.1K | 0805 | 13 | |
1M | 0805 | 1 | |
电容 | 12P | 0805 | 2 |
22P | 0805 | 2 | |
4.7UF | 1206 | 2 | |
16V1000UF | 电解 | 1 | |
LED | LED绿色 | 0805 | 25 |
LED红色 | 0805 | 1 | |
LED黄色 | 0805 | 1 | |
二极管 | 1N4148 | 玻璃管 | 2 |
1N5822 | 贴片 | 1 | |
晶振 | 32.768K | 2*6 | 1 |
8.000MHz | 49SMD | 1 | |
芯片 | 1117-3.3 | SOT223 | 1 |
IR21364S | SOP-28 | 1 | |
SWM190RBT6-50 | LQFP64 | 1 | |
其它 | 5.1K电位器 | 3362P | 2 |
控制器采用的是一颗国产M0芯片-SWM190RBT6-50,封装是LQFP64。电路包含AC转DC电路,直流电机是高压310V,然后通过SC1117DG转成低压15V,再由MP1482变成3.3V。电机的栅极驱动芯片是IR21364S来控制WVU三路之间的通断,上下臂是通过IGBT,RGS10B60KD1/D2PACK来开关。除此之外还包含一些光耦,LED的常用的电子元器件。
本方案缺失PCB源文件,但是不影响配套程序的相关阅读及学习,本方案的主要用于学习观测器,锁相环,PID算法,SVPWM无感FOC算法以及五段式与七段式调制。
软件方案包含了工程文件,无需自己再搭建工程。用的IDE是MDK,小编给大家编译了一下,没有错误可以直接运行。包含龙伯格电机观测器,无感FOC算法,PID调节代码,整套报错信息,顺逆风启动算法,虽然是基于国产M0的代码,但是代码本身耦合性做的很好,完全可以移植到别的MCU平台上面去,同时也是非常适合对电机算法感兴趣的小伙伴认真阅读一番。以下贴一段龙伯格观测器的代码出来:
/*******************************************************************************
* Function Name : Speed_PI
* Description : It implements the PLL PI regulator.
* Input : (B-emf alpha)*sin(theta),(B-emf beta)*cos(theta).
* Output : None.
* Return : Motor speed (dpp, digit-per-pwm).
*******************************************************************************/
s16 Speed_PI(s16 hAlfa_Sin, s16 hBeta_Cos)
{
s32 wSpeed_PI_error, wOutput;
s32 wSpeed_PI_proportional_term, wSpeed_PI_integral_term;
wSpeed_PI_error = hBeta_Cos - hAlfa_Sin;
#if 1 //????
if(wSpeed_PI_error > 50)
wSpeed_PI_error = 50;
else if(wSpeed_PI_error < -50)
wSpeed_PI_error = -50;
#endif
wSpeed_PI_proportional_term = hSpeed_P_Gain * wSpeed_PI_error; // !!!p
wSpeed_PI_integral_term = hSpeed_I_Gain * wSpeed_PI_error; // !!!i
if ( (wSpeed_PI_integral_sum >= 0) && (wSpeed_PI_integral_term >= 0) && (Max_Speed_Out == FALSE) )
{
if ((s32)(wSpeed_PI_integral_sum + wSpeed_PI_integral_term) < 0)
{
wSpeed_PI_integral_sum = S32_MAX;
}
else
{
wSpeed_PI_integral_sum += wSpeed_PI_integral_term; //integral
}
}
else if ( (wSpeed_PI_integral_sum <= 0) && (wSpeed_PI_integral_term <= 0) && (Min_Speed_Out == FALSE) )
{
if((s32)(wSpeed_PI_integral_sum + wSpeed_PI_integral_term) > 0)
{
wSpeed_PI_integral_sum = -S32_MAX;
}
else
{
wSpeed_PI_integral_sum += wSpeed_PI_integral_term; //integral
}
}
else
{
wSpeed_PI_integral_sum += wSpeed_PI_integral_term; //integral
}
wOutput = (wSpeed_PI_proportional_term >> 14) + (wSpeed_PI_integral_sum >> 18);
if (wOutput > wMotorMaxSpeed_dpp)
{
Max_Speed_Out = TRUE;
wOutput = wMotorMaxSpeed_dpp;
}
else if (wOutput < (-wMotorMaxSpeed_dpp))
{
Min_Speed_Out = TRUE;
wOutput = -wMotorMaxSpeed_dpp;
}
else
{
Max_Speed_Out = FALSE;
Min_Speed_Out = FALSE;
}
return ((s16)wOutput);
}