标题:
dsPIC3EP256MC506的AN1160用择多函数实现饭电动势滤波的无传感器BLDC控制
[打印本页]
作者:
ylm110
时间:
2018-12-29 15:24
标题:
dsPIC3EP256MC506的AN1160用择多函数实现饭电动势滤波的无传感器BLDC控制
本应用笔记介绍一种采用 dsPIC ® 数字信号控制器
(Digital Signal Controller, DSC)或 PIC24 单片机来实现无刷直流 (Brushless Direct Current, BLDC)电机无传感器控制的算法。该算法利用对反电动势(Back-Electromotive Force,BEMF)进行数字滤波的择多函数来实现。通过对电机的每一相进行滤波来确定电机驱动电压换相的时刻。这一控制技术省却了分立的低通滤波硬件和片外比较器。需指出,这里论述的所有内容及应用软件,都是假定使用三相电机。该电机控制算法包括四个主要部分:
• 利用 DSC 或单片机的模数转换器(Analog-to-Digital Converter,ADC)来采样梯形波 BEMF 信号
• PWM 导通侧 ADC 采样,以降低噪声并解决低电感问题
• 将梯形波BEMF信号与V BUS /2进行比较,以检测过零点
• 用择多函数滤波器对比较结果信号进行滤波
• 以三种不同模式对电机驱动电压进行换相:
- 传统开环控制器
- 传统闭环控制器
- 比例 - 积分(Proportional-Integral,PI)闭环
控制器
0.png
(12.44 KB, 下载次数: 80)
下载附件
2018-12-29 16:33 上传
单片机源程序如下:
/************************************************************************************************************************
* ?2011 Microchip Technology Inc.
*
* MICROCHIP SOFTWARE NOTICE AND DISCLAIMER:
*
* You may use this software, and any derivatives
* created by any person or entity by or on your behalf, exclusively with Microchip抯 products.
* Microchip and its licensors retain all ownership and intellectual property rights in the
* accompanying software and in all derivatives hereto.
*
* This software and any accompanying information is for suggestion only.
* It does not modify Microchip抯 standard warranty for its products. You agree that you are
* solely responsible for testing the software and determining its suitability.
* Microchip has no obligation to modify, test, certify, or support the software.
*
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY,
* INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR
* A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE, ITS INTERACTION WITH MICROCHIP扴 PRODUCTS, COMBINATION WITH
* ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
*
* IN NO EVENT, WILL MICROCHIP BE LIABLE, WHETHER IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH
* OF STATUTORY DUTY), STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, PUNITIVE,
* EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE SOFTWARE,
* HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST
* EXTENT ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED
* THE AMOUNT OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
* MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE TERMS.
***********************************************************************************************************************/
#include "defs.h" //defines, function headers, pi, etc
#ifdef RTDM_DEMO
#include "debug.h" //RTDM/DMCI functionality
#endif
int main(void)
{
Init_Ports(); // Clock ( Fcy 70MHz ) , port configuration, etc
#ifdef RTDM_DEMO
DBG_Init(); // RTDM ( Debugger ) Initialization
#endif
//defaults: CLKW rotation, motor stopped
Flags.RunMotor = 0;
Flags.Startup = 0;
Flags.CLKW = 1;
Flags.newCLKW = 1;
Flags.DMCI_Control_SW = 0; //default potentiometer read
Timer2Average = TMR2_MAX;
trigger_count = 1;
Flags.nb_delay_on = 0;
#ifdef OPEN_LOOP_CONTROL
DesiredDuty = MIN_DUTY_CYCLE;
#else
DesiredRPM = STARTUP_RPM;
#endif
Flags.current_state = STATE_STOPPED;
while(1) {
if(S2) { //CLKW/CCLKW switch
while(S2) //debounce
Delay_100uSec(DEBOUNCE_DELAY*10);
Flags.newCLKW = !Flags.CLKW;
}
if(S3) { //start/stop switch
while(S3) //debounce
Delay_100uSec(DEBOUNCE_DELAY*10);
if(Flags.current_state == STATE_STOPPED)
Flags.current_state = STATE_STARTING;
else
Flags.current_state = STATE_STOPPING;
}
switch(Flags.current_state) {
case STATE_STOPPING:
Stop_Motor();
Flags.current_state = STATE_STOPPED;
break;
case STATE_STARTING:
//startup done on MCPWM ISR
break;
case STATE_FAULT:
Stop_Motor();
Flags.current_state = STATE_STOPPED;
break;
case STATE_STARTED:
if(Flags.newCLKW != Flags.CLKW) {
Stop_Motor();
Flags.CLKW = Flags.newCLKW;
Delay_100uSec(5000); //delay 500 ms for motor to actually stop
Flags.current_state = STATE_STARTING;
}
break;
case STATE_STOPPED:
if(Flags.newCLKW != Flags.CLKW)
Flags.CLKW = Flags.newCLKW;
break;
}
#ifdef RTDM_DEMO
DBG_SyncComm(); //assure RTDM communication
#endif
}
return 0;
}
/*******************************************************************
Init_Motor()
Procedure used to initialize all params for the motor and
for the AN1160 algorithm.
Also rotor alignment is done here.
*******************************************************************/
void Init_Motor()
{
int i; //auxiliary counter
if(Flags.nb_delay_on == 0) {
T1CONbits.TON = 0;
T2CONbits.TON = 0;
TMR1 = 0;
TMR2 = 0;
Flags.TrainPI = 0;
//setting direction CLKW or CCLKW
if(Flags.CLKW == 1) {
for(i=0;i<6;i++) {
PWM_STATE1[i] = PWM_STATE1_CLKW[i];
PWM_STATE2[i] = PWM_STATE2_CLKW[i];
PWM_STATE3[i] = PWM_STATE3_CLKW[i];
MotorPhaseAState[i] = MotorPhaseAState_CLKW[i];
MotorPhaseBState[i] = MotorPhaseBState_CLKW[i];
MotorPhaseCState[i] = MotorPhaseCState_CLKW[i];
ADC_CHANNEL[i] = ADC_CHANNEL_CLKW[i];
ADC_MASK[i] = ADC_MASK_CLKW[i];
ADC_XOR[i] = ADC_XOR_CLKW[5-i];
}
for(i=0;i<64;i++)
ADC_BEMF_FILTER[i] = ADC_BEMF_FILTER_CLKW[63-i];
} else {
for(i=0;i<6;i++) {
PWM_STATE1[i] = PWM_STATE1_CLKW[5-i];
PWM_STATE2[i] = PWM_STATE2_CLKW[5-i];
PWM_STATE3[i] = PWM_STATE3_CLKW[5-i];
MotorPhaseAState[i] = MotorPhaseAState_CLKW[5-i];
MotorPhaseBState[i] = MotorPhaseBState_CLKW[5-i];
MotorPhaseCState[i] = MotorPhaseCState_CLKW[5-i];
ADC_CHANNEL[i] = ADC_CHANNEL_CLKW[5-i];
ADC_MASK[i] = ADC_MASK_CLKW[5-i];
ADC_XOR[i] = ADC_XOR_CLKW[5-i];
}
for(i=0;i<64;i++)
ADC_BEMF_FILTER[i] = ADC_BEMF_FILTER_CLKW[63-i];
}
stallCount = 0;
PIDStructure.qInMeas = STARTUP_RPM;
PIDStructure.qInRef = STARTUP_RPM;
InitPI(&PIDStructure,SpeedControl_P,SpeedControl_I,PI_ANTI_WINDUP,MAX_DUTY_CYCLE,MIN_DUTY_CYCLE,0);
TMR2 = TMR2_MAX; //initialize TMR2 and TMR2 average with the value corresponding to the minimum motor speed
Timer2Value = TMR2;
Timer2Average = TMR2;
Timer1Value = 0;
Flags.RunMotor = 1; // turn the motor ON
Flags.Startup = 1; // motor initialized, go to starting sequence
ADCCommState = 5; //always start with sector 6 forced
//set pwm overdrive to the according PWM channel
IOCON1 = PWM_STATE1[ADCCommState];
IOCON2 = PWM_STATE2[ADCCommState];
IOCON3 = PWM_STATE3[ADCCommState];
CurrentDuty = STARTUP_DUTY; //Init PWM duty cycle value to minimum duty allowed
PDC1 = CurrentDuty;
PDC2 = CurrentDuty;
PDC3 = CurrentDuty;
nb_delay = ROTOR_ALIGN_T*PWM_100us_FACTOR*10;
delay_counter = 0;
Flags.nb_delay_on = 1;
t_current = STARTUP_START_T*10; //in ms
t_sector = 0;
}
}
/**********************************************************************
Start_Motor()
Procedure for starting the motor according to the implemented
startup ramp. After the ramp, PI loop training will begin.
**********************************************************************/
void Start_Motor()
{
if(Flags.nb_delay_on == 0) { //this is just to test if we're not in a non-blocking delay actually
if(++ADCCommState>5) // Change The Six-Step Commutation Sector
ADCCommState = 0;
AD1CHS0 = ADC_CHANNEL[ADCCommState]; //Change ADC Channel AN Selection
if(t_current < (unsigned long int)STARTUP_T_RAMP*10) {
t_sector = STARTUP_SEC_C/t_current; //calculates T for 1 sector, in 100s of uS.
if(t_sector <= 0) t_sector = 1;
} else
if (t_current < ((unsigned int)STARTUP_T_RAMP*10 + STARTUP_T_SUST*10)) {
Flags.TrainPI = 1;
AD1CON1bits.SSRC = 3;
}
else
Flags.TrainPI = 0;
//overdrive and output next motor sector
IOCON1 = PWM_STATE1[ADCCommState];
IOCON2 = PWM_STATE2[ADCCommState];
IOCON3 = PWM_STATE3[ADCCommState];
//here we want a non-blocking delay for the startup to execute
nb_delay = t_sector * PWM_100us_FACTOR;
delay_counter = 0;
Flags.nb_delay_on = 1;
t_current += t_sector;
adcBackEMFFilter = 0; //clear the BEMF filter
}
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
dsPICDEM MCLV-2开发板用户指南.pdf
(1.18 MB, 下载次数: 51)
2018-12-29 15:23 上传
点击文件名下载附件
下载积分: 黑币 -5
AN1160_dsPIC33EP256MC506_MCLV.rar
(1.04 MB, 下载次数: 67)
2018-12-29 15:23 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
mcu_mpu
时间:
2019-9-18 14:37
好东西,学习了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1