基于Microhip的dsPIC33CK平台FOC风机驱动器
目前风机驱动器无刷化是一个发展方向,早期的风机驱动器采用交流电机,体积大效率低。 BLDC无刷驱动风机具有,体积小,节能,并且风量大,各种保护能有点。 缺点是采用FOC矢量控制,难度到,驱动器的主芯片价格高等缺点。 具有多方面的功能优点,以下是一些常见的:
1. 精准调速功能:
- 宽范围调速:能够在较大的范围内对风机的转速进行精确调节,满足不同工况下对风量的需求。 例如,在一些需要精确控制通风量的实验室、洁净室等场所,风机驱动器可以根据实际需求将风机转速调整到最合适的状态,确保室内环境的稳定性。
- 无级调速:实现了无级平滑的调速过程,避免了传统分级调速方式带来的转速跳跃和风量波动, 使风机的运行更加平稳,减少了因转速突变对风机机械部件造成的冲击和磨损。
2. 良好的控制性能:
- 快速响应:对控制信号的响应速度快,能够在短时间内根据输入的指令改变风机的运行状态。 例如,在一些对通风系统的响应速度有较高要求的场合,如火灾报警时需要快速启动排烟风机,风机驱动器可以迅速将风机转速提升到设定值, 确保及时有效地排出烟雾。
- 精确控制:采用先进的控制算法和技术,能够精确地控制风机的转速、转矩等参数,保证风机的运行符合预期的要求。 例如,在一些需要精确控制风压的工业生产过程中,风机驱动器可以通过精确控制风机转速来稳定风压,确保生产过程的顺利进行。
3. 高效节能:
- 优化能源利用:根据实际的负载情况自动调整风机的输出功率,避免了能源的浪费。当负载较低时,驱动器可以降低风机的转速,减少能量消耗; 当负载增加时,又能够及时提高风机的转速,保证系统的正常运行。
- 提高系统效率:通过对风机的优化控制,提高了整个通风系统的效率。 例如,在一些大型的通风系统中,采用高效的风机驱动器可以显著降低系统的能耗,提高能源利用效率。
4. 保护功能完善:
- 过载保护:当风机负载过大或出现异常情况时,驱动器能够及时检测到并自动采取保护措施,如限制电流、降低转速等,防止风机因过载而损坏。 这对于延长风机的使用寿命和保证系统的安全运行具有重要意义。
- 过压、欠压保护:对输入电源的电压进行监测,当电压过高或过低时,驱动器会自动切断电源或采取相应的保护措施, 避免因电压异常对风机和驱动器本身造成损坏。
- 过热保护:内置温度传感器,实时监测驱动器和风机的温度。当温度过高时,会自动启动散热装置或降低风机转速,防止过热损坏设备。
5. 可靠性高:
- 高质量的电子元件:采用高品质的电子元件和材料,具有良好的耐热性、耐寒性和抗干扰性,能够在各种恶劣的环境条件下稳定工作。 例如,在一些高温、高湿度、强电磁干扰的工业环境中,风机驱动器仍然能够保持可靠的运行。
- 先进的电路设计:具备完善的电路保护和故障诊断功能,能够及时发现和排除电路故障,提高了系统的可靠性和稳定性。 同时,一些风机驱动器还具有自诊断和自恢复功能,在出现故障后能够自动诊断故障原因并尝试恢复正常运行。
6. 操作和维护方便:
- 友好的人机界面:通常配备了直观易懂的操作界面,用户可以方便地进行参数设置、状态监测和故障查询等操作。 例如,一些风机驱动器采用了触摸屏或液晶显示屏,用户可以通过简单的操作完成各种功能的设置和调整。
- 易于安装和调试:结构设计紧凑,安装方式简单,便于在各种场合进行安装和调试。 同时,一些风机驱动器还支持远程监控和控制,方便用户对风机的运行状态进行实时监测和管理。
7. 适配性强:
- 多种风机类型适配:能够适配不同类型、不同功率的风机,具有广泛的适用性。无论是小型的家用风机,还是大型的工业风机, 都可以找到合适的风机驱动器进行匹配。
- 与其他系统的兼容性好:可以与其他自动化控制系统进行良好的通信和配合,实现整个系统的自动化控制和智能化管理。 例如,风机驱动器可以与建筑物的智能控制系统、工业生产的自动化控制系统等进行无缝对接,提高系统的整体性能和效率。
1.硬件原理图
主芯片采用Microchip的dsPIC33CK64MP105,主频100M,两路单独的AD模块,资源上足够跑本风机完整的FOC驱动。
主Driver采用SIM6892,三肯的IPM模块带过温和过流保护。
2.主代码函数框架
程序框架主要由FOC_Control模块和故障检测模块组成。 软件是典型的FOC软件框架,主要代码可以参考microchip的经典文档AN1078。 部分主函数,以及软件框架如下,仅供大家学习。
主函数:
/******************************************************************************
Main Function
*******************************************************************************/
int main (void)
{
InitOscillator();
SetupGPIOPorts();
/* Turn on LED1 to indicate the device is programmed */
ONOFF_LED_FAULT_On();
#ifdef ENABLE_DIAGNOSTICS
DiagnosticsInit();
#endif
/*ADC.PWM.Timer.CMP.OPA Init*/
HAL_InitPeripherals();
MCAPP_MC1ServiceInit();
__delay_ms(260);
HAL_ResetPeripherals();
x2c_cmd.runCmd = 0;
x2c_cmd.spdCmd_Rpm = 400;
while(1)
{
#ifdef ENABLE_DIAGNOSTICS
DiagnosticsStepMain();
#endif
}
}
FOC的算法部分如下,包括FOC的状态机:
case FOC_INIT:
MCAPP_FOCInit(pFOC);
break;
case FOC_RTR_LOCK:
MCAPP_FOCFeedbackPath(pFOC);
if((x2c_VsMode == 1) && (x2c_VsMod_thetaLock == 1))
{
pFOC->estimInterface.qTheta = x2c_VsMod_theta;
pCtrlParam->qIdRef = 0;
pCtrlParam->qIqRef = pCtrlParam->lockCurrent;
}
else
{
if(en_start_type==1){
if(--vvnum==0){
vvnum = 5;
pFOC->estimInterface.qTheta += 1;
}
}
}
MCAPP_FOCForwardPath(pFOC);
break;
case FOC_OPEN_LOOP:
MCAPP_FOCFeedbackPath(pFOC);
if((x2c_VsMode == 1) && (x2c_VsMod_thetaLock == 1))
{
MC1APP_EmergencyStop();
}
else
{
if(UTIL_Abs16Approx(pCtrlParam->qVelRef) < pFOC->pMotor->qMaxOLSpeed)
{
if(pCtrlParam->speedRampSkipCnt >= pCtrlParam->speedRampSkipCntLimit)
{
pCtrlParam->speedRampSkipCnt = 0;
pCtrlParam->qVelRef += pCtrlParam->OLSpeedRampRate * pCtrlParam->direction;
}else{
pCtrlParam->speedRampSkipCnt++;
}
}else if(x2c_usEnableOLtoCL != 0)
{
}
}
break;
case FOC_CLOSE_CURVE:
MCAPP_FOCFeedbackPath(pFOC);
MCAPP_FOCForwardPath(pFOC);
break;
case FOC_CLOSE_LOOP:
MCAPP_FOCFeedbackPath(pFOC);
if((x2c_VsMode == 1) && (x2c_VsMod_thetaLock == 1)){
MC1APP_EmergencyStop();
}else{
pFOC->estimInterface.qTheta = pFOC->estimATPLL.qThetaFlux + pFOC->estimInterface.qThetaOffset;
pCtrlParam->qIqRef = x2c_TqModIqRef;
MCAPP_FOCForwardPath(pFOC);
}
break;
case FOC_STOP_CURVE:
MCAPP_FOCFeedbackPath(pFOC);
pFOC->estimInterface.qTheta = pFOC->estimATPLL.qThetaFlux + pFOC->estimInterface.qThetaOffset;
/*loads the Iq ref, users can change the ramp value*/
if(pCtrlParam->qIqRef > 0){
pCtrlParam->qIqRef--;
}else if(pCtrlParam->qIqRef < 0){
pCtrlParam->qIqRef++;
}else{
pCtrlParam->qIqRef = 0;
}
/* Calculate sin and cos of theta (angle) */
MC_CalculateSineCosine_Assembly_Ram(pFOC->estimInterface.qTheta, &pFOC->sincosTheta);
/* Perform inverse Clarke and Park transforms and generate phase voltages.*/
MC_TransformParkInverse_Assembly(&pFOC->vdq, &pFOC->sincosTheta, &pFOC->valphabeta);
/* Calculate Vr1,Vr2,Vr3 from qValpha, qVbeta */
MC_TransformClarkeInverseSwappedInput_Assembly(&pFOC->valphabeta,&pFOC->vabc);
/* Execute space vector modulation and generate PWM duty cycles */
MC_CalculateSpaceVectorPhaseShifted_Assembly(&pFOC->vabc, pFOC->pwmPeriod,pFOC->pPWMDuty);
/**/
if(qOmega < STOP_CURVE_OMEGA_MIN){
if(++Temp_cnt > STOP_CURVE_OMEGA_CNT){
Temp_cnt = 0;
pFOC->focState = FOC_STOP;
}
}
break;
case FOC_STOP:
break;
case FOC_FAULT:
break;
default:
pFOC->focState = FOC_FAULT;
break;
} /* End Of switch - case */
FOC_INIT是FOC的初始化状态,最FOC的各值进行运行前的初始化赋值,每次FOC运行均进行一次初始化。 FOC_RTR_LOCK是FOC的锁定状态,由于风机启动的特殊性,是一种长拖动的缓启动策略。 FOC_OPEN_LOOP是FOC的开环启动状态。 FOC_CLOSE_LOOP是FOC的闭环运行状态,此处包括速度环和ID.IQ电流环。 FOC_STOP 是FOC的停止状态。 FOC_FAULT 是FOC的故障停止状态。
欢迎邮件沟通。