目前风机驱动器无刷化是一个发展方向,早期的风机驱动器采用交流电机,体积大效率低。 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的故障停止状态。

欢迎邮件沟通。