在方波控制架构中,脉宽调制(PWM)信号的生成以及电机转速的闭环调节是实现精确驱动的核心环节。其中,PWM模块负责将速度环或电流环输出的连续电压指令转换为可用于驱动功率开关器件的占空比信号;而转速调节则通过反馈控制机制,确保电机实际转速能够准确跟随设定值。由于运行平台为Cortex-M0内核,所有运算必须基于整数进行,并在有限的处理器资源和严格的实时性要求下完成,以保障控制过程的精度、稳定性及安全性[1]。本节将重点阐述整数型PID速度控制器的设计方法、适用于资源受限环境的启动策略,以及关键的过流保护逻辑实现。
作为方波控制系统的外环控制器,速度环的性能直接影响系统动态响应能力与稳态控制精度。在M0平台上实现PID速度调节器,核心在于将连续域模型离散化并转换为定点数运算形式,同时合理处理计算过程中的量化误差、数据溢出以及积分饱和等问题。
精准的速度反馈是构建稳定闭环控制的基础。在方波控制系统中,通常利用霍尔传感器信号的周期变化来估算转速,其测量与处理流程需全面采用整数运算方式。
周期测量:借助通用定时器(例如TIM2)的输入捕获功能,记录两个相邻相同极性霍尔跳变沿(如上升沿)之间的时间间隔 $ T_{hall} $(单位为定时器计数值)。为避免计数溢出,建议使用32位定时器或配置较高的时钟频率。
周期有效性判断:受电磁干扰等因素影响,捕获到的周期值可能出现异常(过大或过小),因此需要设置合理的阈值范围进行滤波处理:
#define T_HALL_MIN 100 // 对应最高允许转速
#define T_HALL_MAX 65535 // 对应最低转速,兼顾定时器最大计数值
if (captured_period < T_HALL_MIN) captured_period = T_HALL_MIN;
if (captured_period > T_HALL_MAX) captured_period = T_HALL_MAX;
速度计算与标幺化转换:电角速度 $ \omega_e $ 与 $ T_{hall} $ 成反比关系: $ \omega_e = \frac{\pi/3}{T_{hall}} $。直接执行浮点除法在M0上开销较大,可采用以下优化策略降低运算负担:
最终得到的实际转速 $ \omega_{actual} $ 需转换为与参考转速 $ \omega_{ref} $ 相同的定点Q格式(如Q12),以便后续进行误差比较运算。
[此处为图片1]速度环普遍采用PI控制结构。考虑到嵌入式系统资源限制,增量式算法因其具备天然抗积分饱和能力和较低的计算复杂度,成为首选方案。
算法推导与定点化处理:
连续域PI控制器表达式为:
$ u(t) = K_p e(t) + K_i \int e(t) dt $
采用后向差分法进行离散化,得到增量式形式:
$ \Delta u(k) = K_p[e(k)-e(k-1)] + K_i T_s e(k) $
其中 $ T_s $ 表示速度环的采样周期。
合并参数简化计算:令 $ K_{p\_discrete} = K_p $,$ K_{i\_discrete} = K_i T_s $。这两个参数已在标幺系统中定义,可根据所需精度选择合适的定点Q格式(如Q15)进行表示。
Cortex-M0上的高效实现:
typedef struct {
int32_t error; // 当前误差 e(k)
int32_t prev_error; // 上一时刻误差 e(k-1)
int32_t integral; // 积分项累加值
int32_t output; // 输出增量 Δu(k)
int32_t Kp; // 比例系数(Q15格式)
int32_t Ki; // 积分系数(Q15格式)
} IntegerPIController;
在每次控制周期中,读取当前速度反馈,计算误差,调用PI增量函数更新输出,并对积分项施加上下限约束以防饱和,最后将结果传递给PWM模块用于占空比调整。
// 定义速度环PI控制器结构体 typedef struct { int16_t Kp; // 比例增益,采用Q15格式 int16_t Ki; // 积分增益(已包含采样周期Ts),Q15格式 int16_t error_prev; // 上一时刻的误差值,Q格式与速度反馈一致(例如Q12) int16_t output; // 当前控制器输出(如电流给定标幺值),使用Q格式 int16_t out_max; // 输出正向限幅值 int16_t out_min; // 输出负向限幅值(可为0或负数) int32_t integral; // 积分累加器,使用32位宽类型(如Q27)避免溢出 } speed_pi_controller_t; // PI控制器更新函数:输入参考速度与反馈速度,返回控制输出 int16_t speed_pi_update(speed_pi_controller_t *pi, int16_t speed_ref, int16_t speed_fb) { // 第一步:计算当前速度误差(Q格式对齐) int16_t error = speed_ref - speed_fb; // 第二步:计算比例项增量 int16_t delta_error = error - pi->error_prev; int32_t delta_up = ((int32_t)pi->Kp * delta_error) >> 15; // Q15 × Qx → Q(x+15),右移15位恢复为Qx格式 // 第三步:计算积分项增量 int32_t delta_ui = ((int32_t)pi->Ki * error) >> 15; // 同样进行Q15到目标Q格式的转换 // 第四步:更新积分累加器,并加入抗饱和限幅 pi->integral += delta_ui; // 根据输出限幅和Kp估算积分器上下限,防止过度累积 int32_t integral_max = ((int32_t)pi->out_max << 15) / pi->Kp; int32_t integral_min = ((int32_t)pi->out_min << 15) / pi->Kp; if (pi->integral > integral_max) pi->integral = integral_max; if (pi->integral < integral_min) pi->integral = integral_min; // 第五步:合成总输出增量并更新最终输出 int32_t new_output = pi->output + delta_up + delta_ui; // 第六步:执行硬性输出限幅 if (new_output > pi->out_max) new_output = pi->out_max; if (new_output < pi->out_min) new_output = pi->out_min; pi->output = (int16_t)new_output; // 第七步:保存当前误差用于下次计算 pi->error_prev = error; return pi->output; } [此处为图片1] // 说明: // 上述实现具备积分器限幅与输出限幅机制,构成基础的抗积分饱和策略。 // 若需更强的抗饱和能力(如反计算法),可在该框架基础上扩展。 //============================================= // 参数整定与系统稳定性分析 //============================================= // 控制器参数通常在标幺化系统中进行整定。可先在浮点仿真环境中 // 使用工程方法(如Ziegler-Nichols法)初步确定 Kp 和 Ki 的理想值, // 再将其量化为定点数格式以适配嵌入式平台。 // 量化误差影响: // Kp 与 Ki 在定点表示下存在精度损失,可能导致实际环路增益略低于理论设计。 // 因此,在设计时应预留足够的稳定裕度。此外,速度反馈中的量化噪声 // 可能通过积分器逐步累积,必要时可引入误差死区处理或采用泄漏积分方式 // 来抑制低频扰动。 // 采样周期要求: // 速度环的采样周期 Ts 应显著小于系统的机械时间常数,一般取10ms至50ms之间。 // 为保证控制精度,Ts 必须由独立定时器精确触发,确保周期一致性。 // 其标幺值 Ts_pu 需准确计算,并直接影响离散化积分系数 Ki_discrete 的设定; // 若 Ts_pu 定点化不准确,将削弱积分作用,影响稳态性能。 [此处为图片2] //============================================= // 启动策略与过流保护机制 //============================================= // 电机启动阶段是从静止到运行的关键过渡期,极易发生堵转或过流现象。 // 堵转多因初始转矩不足导致无法启动,而过流则源于启动瞬间转矩指令过大。 // 因此,合理的启动策略与快速响应的过流保护是保障系统安全的核心环节。 // 在基于M0内核的控制器上,这些功能必须通过高效、可靠的整型运算实现。 // 三段式启动策略概述: // 一种典型的启动流程包括以下三个阶段: // 1. 开环强励阶段:施加固定频率/电压的激励,建立初始磁场与转速; // 2. 捕获同步阶段:检测反电动势或其他位置信号,实现从开环到闭环的平稳切换; // 3. 闭环加速阶段:启用速度PI控制器,按预定斜率提升转速至目标值。 // 每个阶段均需配合电流监控机制,一旦检测到过流立即进入保护状态, // 中断驱动输出并触发故障标志,待条件恢复后方可重启。 [此处为图片3]为了实现无刷电机在方波控制下的可靠启动,通常采用“定位→加速→闭环”三个阶段的启动策略。该方法能够有效避免启动过程中的反转或失步现象,确保系统平稳进入正常运行状态。
目的:将电机转子固定在一个已知的初始位置,为后续开环加速提供确定的起始角度。
实现方式:根据当前检测到的霍尔信号状态(或默认设定某一扇区,例如Sector 0),导通对应的两相绕组,并施加一个较低占空比的PWM信号,持续一段时间(如100ms)。
整数化处理:通过定时器完成延时控制,PWM占空比使用固定的整型常量设置。此过程结束后,转子将被拉至接近目标位置的稳定区域。
[此处为图片1]目的:在电机尚未产生足够强度的霍尔信号或反电动势前,强制驱动其旋转并逐步提升转速。
执行方法:按照与霍尔顺序一致的换相序列,以预设的时间间隔 Tcomm(k) 进行换相操作。随着换相步数 k 增加,Tcomm(k) 逐渐减小,从而形成加速曲线。
加速策略:最简单的形式为线性加速,即每个周期减少固定时间值 ΔT:
Tcomm(k) = Tstart - k × ΔT。
若需更平滑的启动特性,可采用S型加速曲线,相关参数预先计算并存储于Flash中作为查表依据。
M0微控制器实现:利用定时器触发换相中断,在每次中断中更新下一次换相的时间间隔(修改自动重载寄存器ARR),同时切换PWM输出至下一扇区。此阶段内,PWM占空比可保持恒定或随速度上升逐步增加。
目的:当电机达到一定转速、霍尔信号趋于稳定后,从开环控制无缝切换到基于实际霍尔反馈的闭环换相控制。
切换条件判断:常用判据包括:
1)开环加速时间达到预定值;
2)估算转速(由换相频率推算)超过设定阈值(例如额定转速的5%)。
上述判断均基于整数运算,在M0上高效执行。
无扰动切换技术:为防止切换瞬间出现转矩冲击,应在切换时刻将速度环PI控制器的积分项初始化为当前开环驱动所对应的电流给定值,使控制输出连续过渡。
[此处为图片2]为保障系统安全,过流保护需具备高响应速度和可靠性,一般采用“硬件快速响应 + 软件精准判断”的双层防护结构。
工作原理:借助片内模拟比较器实时监测相电流或母线电流。一旦电流超过预设阈值,比较器立即翻转输出,并连接至PWM模块的刹车(Break)输入引脚,在数百纳秒内强制关闭所有PWM通道。
M0配置要点:需设定比较器参考电压(对应电流门限),并启用定时器的外部刹车功能。整个过程无需CPU干预,构成最后一道物理级安全屏障。
作用补充:虽然响应延迟较长(微秒级),但可在电流环ISR或高速ADC中断中实施更复杂的逻辑判断,如RMS计算、持续时间分析及分级响应策略。
典型代码实现如下:
#define CURRENT_FAULT_THRESHOLD_Q15 30000 // 过流阈值,Q15格式
#define OC_DEBOUNCE_COUNT 5 // 消抖计数次数
static uint8_t oc_counter = 0;
void current_loop_isr(void) {
// ... 电流采样与控制算法 ...
int16_t i_phase = get_phase_current(); // 获取当前相电流(Q15标幺值)
if (i_phase > CURRENT_FAULT_THRESHOLD_Q15 || i_phase < -CURRENT_FAULT_THRESHOLD_Q15) {
oc_counter++;
if (oc_counter >= OC_DEBOUNCE_COUNT) {
pwm_output_disable(); // 关闭PWM输出
system_state = FAULT_OVER_CURRENT;
// 故障信息记录...
}
} else {
oc_counter = 0; // 正常电流状态,清零计数
}
// ... 更新PWM ...
}
消抖设计意义:为避免因PWM开关噪声或采样干扰引发误动作,软件层面引入计数消抖机制,仅当连续多次检测到过流才确认故障成立。
当发生过流事件后,系统进入故障状态,除立即切断驱动外,还需进行以下处理:
在Cortex-M0这一低成本硬件平台上,通过采用分层的过流保护机制、稳健的启动流程以及精心设计的整数速度环控制策略,方波控制系统能够实现稳定、可靠且性能可控的电机驱动运行,充分释放该平台在电机控制应用中的潜力。
基于霍尔信号周期计算转速时涉及倒数运算,在Cortex-M0这类缺乏硬件除法支持的处理器上,应避免直接使用软件除法。推荐采用查表法、牛顿迭代法或拟合近似公式等整数优化手段来替代高耗时的除法操作,从而提升实时性与效率。
增量式结构不仅天然具备抑制积分饱和的能力,而且计算开销小,适合资源受限环境。实现过程中需合理设定比例与积分项的定点格式(如Q15),并对积分累加器采用更宽的数据类型(例如32位)以防止溢出问题。
为防止积分项过度累积导致系统响应失稳,在更新积分值时可根据输出限幅反向推导出积分器的合理范围,并对累加结果进行钳位处理。这种简化方法可有效缓解积分饱和现象。
首先通过预定位确保转子初始位置准确,消除启动盲区;随后进入开环加速阶段,利用预设换相时间表(可为线性或S型曲线)将电机拖动至一定转速;最后当满足特定条件(如达到设定速度阈值或经过固定时间)后,平稳切换至闭环控制模式。[此处为图片1]
硬件比较器可提供纳秒级快速响应,作为最后一道安全防线;而软件层面则可在中断服务程序中实现更具灵活性的保护逻辑,包括延时判断和多条件判定,实现微秒级的精细保护响应。
为避免因开关噪声或采样干扰引发误动作,软件过流判断应引入计数机制——仅当连续多次检测到过流状态才确认故障发生,从而显著提高系统的抗干扰能力。
系统应构建清晰的故障状态机模型,用于准确标识当前运行状态;同时记录关键上下文信息以便后续分析诊断;还可设计有限次数的自动重试功能,增强系统容错性和鲁棒性。
速度反馈的离散化、PI参数的定点表示以及定时器分辨率的限制均会引入量化误差和高频噪声。因此在控制器设计与参数整定过程中,必须考虑这些非理想因素,并预留足够的稳定裕度以保证动态性能。
扫码加好友,拉您进群



收藏
