无刷电机 PWM 配置、调试技巧

一、无刷电机波形特征

下图是六步换相的开关顺序图:S1、S3、S5 我们称为上管,S2、S4、S6 为下管

可见,在无刷电机驱动中,不能出现 S1 和 S2、S3 和 S4、S5 和 S6 两两同时导通的情况,因为这样会使电流在上下管之间形成回路,这样并不能驱动电机,还会直接烧毁 MOS。

我们如果要对这六颗 MOS 进行 PWM 驱动,并不需要单独控制六颗,我们只需要配置三个 PWM 输出,然后再由 MCU 生成与之相反的互补的 PWM 即可,其中互补的 PWM 波形保证不会出现上下管同时导通的情况。以S1 和 和 S2 波形距离,应该如下图这样:

为了确保上下管不会导通,我们往往会再互补波形中设置一个死区时间 (dead time) 留出一些余量。

至此,我们仅需要设置三个 PWM 的周期,占空比,并且配置为互补模式和互补的死区时间,即可完成 MCU 对一个无刷电机的 PWM 外设驱动配置。

二、PWM 中心对齐模式

2.1 PWM 中心配置简介

按下图所示,PWM counter 会从 0 升至 ARR 的目标值,然后回降到 0。其中,PWM counter  从 0 升至 CCR 寄存时 PWM 呈高电平,PWM counter 小于时呈低电平。 

 2.2 为什么电机控制 PWM 都要配置成中心对齐模式?

2.2.1 电流采样

使用中心对齐模式可以让 ADC 采样时刻点一般在桥臂下管导通的中点位置(此刻 PWM counter 为 0),从而获得更平滑的采样效果。

如果是使用向上计算模式,在 PWM counter 为 0 时采集电压,正好处于开管阶段,此时电流还没有完全稳定,并且这种模式也不容易插入死区时间。

 

当然,即使是配置成中心对齐模式,在上管 PWM 占空比接近 100% 时,此时 ADC 采样也会受到PWM 的开关噪音干扰,甚至有可能采样不到信号。 

2.2.2 减少电机震荡和噪声

将电机控制 PWM 配置为中心对齐模式的主要原因是为了减少电机振荡和噪声。

在中心对齐模式下,PWM 信号的占空比可以被调整为在一个周期的中间位置,这样可以使电机在每个方向的运动速度更加平滑。相比之下,单边沿 PWM 信号会在每个周期的开始或结束时突然切换,这可能会导致电机在加速或减速时产生较大的电流和振荡,从而增加噪声和损耗。

如下图,PWM 向上计数时,三相开关在同一时刻:

而中心对齐模式则不会:

三、PWM 配置代码示例

3.1 芯片外设介绍

文中使用使用南京凌欧 LSK32MC07x 系列芯片配置举例:

14.1.4.1 MCPWM 波形输出-中心对齐模式

        4 个 MCPWM IO Driver 采用独立的控制门限,独立死区宽度(每一对互补 IO 的死区需要独立配置,即 4 个死区配置寄存器),共享数据更新事件。

        采用 TH<n>0 和 TH<n>1 控制第<n>个 MCPWM IO 的启动、关闭动作, n 为 0/1/2/3/4/5。

        当计数器 CNT 值向上计数达到 TH<n>0(即 t3 时刻),关闭 CH<n>N,经过死区延时 DTH0,打开 CH<n>P。

        当计数器 CNT 值向上计数达到 TH<n>1(即 t4 时刻),关闭 CH<n>P,经过死区延 DTH1,打开CH<n>N。

        采用独立的启动和关闭时间控制,可以提供相位控制的能力。

        死区延时保证 CH<n>P/CH<n>N 不会同时打开,避免短路发生。t3/t4 时刻均会产生相应中断。

3.2 代码配置

3.2.1 目标频率的宏定义

目标频率的宏定义,单位 HZ。

/* ==============================PWM 频率及死区定义=========================== */
#define MCU_MCLK							((u32)96000000uL)		/* PWM模块运行主频 */
#define PWM_MCLK							((u32)96000000uL)		/* PWM模块运行主频 */
#define PWM_PRSC 							((u8)0)					/* PWM模块运行预分频器 */
#define PWM_FREQ 							((u16)16000)			/* PWM斩波频率 */

此值为 PWM 周期计数器,也就是一个周期内计数值。在中心对齐模式下,计数器会从 0 自增到此值后再自减到 0。实际计数周期是此值的二倍,所以我们要对 PWM_FREQ 这个值乘 2。这样确保输出的周期频率是 PWM_FREQ 的值。

/* PWM 周期计数器值 */
#define PWM_PERIOD         					((u16)(PWM_MCLK / (u32)(2 * PWM_FREQ *(PWM_PRSC+1))))

死区计算方式是 PWM_MCLK 除以 1000000000,计算出 1ns 的周期,再乘死区时间得到值。

/* 死区时间配置 */
#define DEADTIME_NS        					((u16)1500)				/* 死区时间 */
#define DEADTIME           					(u16)(((unsigned long long)PWM_MCLK * (unsigned long long)DEADTIME_NS)/1000000000uL)

3.2.2 配置 PWM 结构体

初始化 PWM 结构体和时钟等...

MCPWM_InitTypeDef MCPWM_InitStructure;
MCPWM_StructInit(&MCPWM_InitStructure);
    
MCPWM_InitStructure.MCLK_EN = ENABLE;              /* 模块时钟开启 */
MCPWM_InitStructure.CLK_DIV = 0;                   /* MCPWM时钟分频设置 */
	
MCPWM_InitStructure.IO_CMP_FLT_CLKDIV  = 12;       /* 急停事件(来自IO口或比较器信号)数字滤波器时间设置 */
	
MCPWM_InitStructure.AUEN = MCPWM0_ALL_AUPDAT;      /*自动加载使能*/

/* 工作模式设置中心对齐 */
MCPWM_InitStructure.MCPWM_WorkModeCH0 = MCPWM0_CENTRAL_PWM_MODE;
MCPWM_InitStructure.MCPWM_WorkModeCH1 = MCPWM0_CENTRAL_PWM_MODE;
MCPWM_InitStructure.MCPWM_WorkModeCH2 = MCPWM0_CENTRAL_PWM_MODE; 

3.2.3 配置 PWM 周期、占空比

我们要配置出 25% 占空比周期的 PWM 波形,根据下图的 PWM 示意图来看,计数器是由负 TH 自增到正的,所以我们将周期值取负除 4 给 TH00,取正除 4 给 TH01 即可。

/* MCPWM0_CNT0 */
MCPWM_InitStructure.BASE_CNT0_EN = ENABLE;                /* 主计数器开始计数使能开关 */
MCPWM_InitStructure.TH0 = MCPWM_PERIOD0;                    /* 计数周期设置即MCPWM输出周期*/
	
MCPWM_InitStructure.TH00 = (u16)(-(MCPWM_PERIOD0));
MCPWM_InitStructure.TH01 = (MCPWM_PERIOD0);
MCPWM_InitStructure.TH10 = (u16)(-(MCPWM_PERIOD0 >>4));
MCPWM_InitStructure.TH11 = (MCPWM_PERIOD0 >>4);
MCPWM_InitStructure.TH20 = (u16)(-(MCPWM_PERIOD0 >>4));
MCPWM_InitStructure.TH21 = (MCPWM_PERIOD0 >>4);

3.2.3 配置输出极性

此配置是对输出值进行取反,或者交换上下管位置。

/* 极性选择设置 */
/* 输出极性取反,0:正常输出;1:取反输出 */
MCPWM_InitStructure.CH0N_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH0P_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH1N_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH1P_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH2N_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH2P_Polarity_INV = DISABLE; 
		
/* 通道交换选择设置 */
/* 交换N, P信号输出使能开关 */
MCPWM_InitStructure.Switch_CH0N_CH0P = DISABLE; 
MCPWM_InitStructure.Switch_CH1N_CH1P = DISABLE;
MCPWM_InitStructure.Switch_CH2N_CH2P = DISABLE;

3.2.4 配置 FAIL 信号

LSK32MC07x 的 MCPWM 具有错误处理功能,在指定的 IO 引脚被外部触发,或者 CMP 比较器被触发,即可进入 FAIL 模式,下面是配置 FAIL 模式的一些参数。

/**< 通道FAIL事件使能 1:MOE为0时或发生FAIL事件时,输出默认电平;0:输出不受影响 */
MCPWM_InitStructure.CH0N_FAIL_EN = ENABLE;
MCPWM_InitStructure.CH0P_FAIL_EN = ENABLE;
MCPWM_InitStructure.CH1N_FAIL_EN = ENABLE;
MCPWM_InitStructure.CH1P_FAIL_EN = ENABLE;
MCPWM_InitStructure.CH2N_FAIL_EN = ENABLE;
MCPWM_InitStructure.CH2P_FAIL_EN = ENABLE;
		
/**<  MCU进入HALT状态, MCPWM(CH0CH1CH2)信号是否正常输出 1正常输出;0强制输出保护值 */		
MCPWM_InitStructure.HALT_PRT0 = ENABLE;				
		
/* 更新事件设置 */
MCPWM_InitStructure.TR0_T0_UpdateEN = ENABLE;	
MCPWM_InitStructure.TR0_T1_UpdateEN = DISABLE; 
		
MCPWM_InitStructure.T0_Update1_INT_EN = DISABLE;        /* T0更新 中断使能 */
MCPWM_InitStructure.FAIL0_INT_EN = DISABLE;				/* FAIL0 中断使能  */
MCPWM_InitStructure.FAIL0_INT_EN = DISABLE;				/* FAIL1 中断使能  */
		
MCPWM_InitStructure.FAIL0_INPUT_EN = ENABLE;					/**< FAIL0 输入功能使能 */
MCPWM_InitStructure.FAIL0_Signal_Sel = MCPWM0_FAIL_SEL_IO;		/**< FAIL0 信号选择,比较器0或GPIO */
MCPWM_InitStructure.FAIL0_Polarity = MCPWM0_LOW_LEVEL_ACTIVE;	/**< FAIL0 信号极性设置,高有效或低有效 */	 

 四、MOSFET 驱动器

4.1 KS32MC07X 内置半桥驱动器

KS32MC07X 部分型号内置了 MOSFET 驱动器。我们看 LKS32MC07X with built-in 6N driver Datasheet 手册。HIN 和 LIN 分别为芯片外设驱动的 P 和 N。

可见,HIN 和 LIN 与输出的 HO、LO 波形和输入的极性一样,我们就不需要反转或交换 CWPWM 波形的极性,直接驱动即可。

/* 极性选择设置 */
/* 输出极性取反,0:正常输出;1:取反输出 */
MCPWM_InitStructure.CH0N_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH0P_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH1N_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH1P_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH2N_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH2P_Polarity_INV = DISABLE; 
		
/* 通道交换选择设置 */
/* 是否交换N, P信号输出使能开关 */
MCPWM_InitStructure.Switch_CH0N_CH0P = DISABLE; 
MCPWM_InitStructure.Switch_CH1N_CH1P = DISABLE;
MCPWM_InitStructure.Switch_CH2N_CH2P = DISABLE;

4.1  芯朋微 ID2005 半桥驱动器

该驱动芯片的驱动图是这样的:

可见,P 与 N 都为低,MOS开下管关上管;P 与 N 都为高 MOS 开上管关下管。

 

根据输出特性,配置 MCPWM 极性如下:

/* 极性选择设置 */
/* 输出极性取反,0:正常输出;1:取反输出 */
MCPWM_InitStructure.CH0N_Polarity_INV = ENABLE;
MCPWM_InitStructure.CH0P_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH1N_Polarity_INV = ENABLE;
MCPWM_InitStructure.CH1P_Polarity_INV = DISABLE;
MCPWM_InitStructure.CH2N_Polarity_INV = ENABLE;

/* 通道交换选择设置 */
/* 是否交换N, P信号输出使能开关 */
MCPWM_InitStructure.CH2P_Polarity_INV = DISABLE;
MCPWM_InitStructure.Switch_CH0N_CH0P = ENABLE;
MCPWM_InitStructure.Switch_CH1N_CH1P = ENABLE;
MCPWM_InitStructure.Switch_CH2N_CH2P = ENABLE;

五、调试技巧

首先测量 MCU 输出的 PWM 波形是否正常,周期、占空比、上下管相位、死区时间、PWM波形是否饱满等;之后再看半桥驱动器输出的是否正常;最后看三个相线的输出的波形。

建议多尝试几个占空比和周期,并严谨测量 MCU 输出波形、半桥驱动器输出波形和 MOS 输出波形。如果都比较正常就可以开始其他的调试了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值