1. 项目概述
CW32L012/F030灵眸X1智能小车是一款基于CW32系列MCU开发的智能移动平台,其核心功能之一就是电机调速控制。这个看似简单的功能实际上涉及电机驱动、PWM调制、闭环控制等多个技术领域的交叉应用。
在实际开发中,我发现很多初学者容易陷入两个极端:要么过度依赖现成库函数而不知其原理,要么从底层寄存器开始摸索却不得要领。本文将从一个实际产品开发者的角度,分享我们在灵眸X1小车上实现电机调速的完整技术路线。
2. 硬件架构解析
2.1 主控芯片选型考量
CW32L012和CW32F030是我们最终选定的两款主控芯片,它们都属于武汉芯源半导体推出的32位微控制器系列。选择这两款芯片主要基于以下考虑:
-
CW32L012:主打低功耗特性,在3V供电时运行电流仅150μA/MHz,非常适合电池供电的小型移动设备。内置的4路PWM定时器正好满足我们双电机控制需求(每个电机需要2路PWM分别控制正反转)。
-
CW32F030:性价比突出,虽然功耗略高但主频可达48MHz,适合对实时性要求更高的场景。其丰富的定时器资源(多达6路PWM输出)为后续功能扩展预留了空间。
实际项目中我们发现一个有趣现象:当PWM频率设置在15-20kHz时,电机运行最平稳。这是因为这个频段既高于人耳可闻范围(避免啸叫),又不会因频率过高导致MOS管开关损耗过大。
2.2 电机驱动电路设计
灵眸X1采用的是常见的H桥驱动方案,但我们在以下几个方面做了特别优化:
-
MOS管选型:
- 上管:IRLML6402(P沟道,Vds=-20V,Rds(on)=0.065Ω)
- 下管:IRLML6401(N沟道,Vds=20V,Rds(on)=0.22Ω)
- 选择依据:小车电机工作电流通常在1A以内,这些MOS管在1A电流下的导通损耗不足0.3W,无需额外散热
-
栅极驱动:
- 采用专用驱动芯片TC4427(峰值输出电流1.5A)
- 在栅极串联10Ω电阻并联10kΩ下拉电阻
- 实测发现这样的配置可以将MOS管开关时间控制在30ns左右,既保证快速开关又避免振铃
-
电流检测:
- 在H桥下端串联0.1Ω采样电阻
- 通过OPA335运放放大20倍后送入MCU ADC
- 这种设计让我们可以实时监测电机电流,为后续过流保护打下基础
3. 软件控制实现
3.1 PWM基础配置
在CW32上配置PWM需要重点关注以下几个寄存器:
c复制// 以TIM1为例的PWM初始化代码片段
void PWM_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_TimeBaseStruct.TIM_Prescaler = 48 - 1; // 1MHz计数频率
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_Period = 1000 - 1; // 1kHz PWM频率
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStruct);
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 0; // 初始占空比0%
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInitStruct);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
}
几个关键参数的经验值:
- 电机PWM频率:15-20kHz(避免可闻噪声)
- 占空比分辨率:至少1000级(10位以上)
- 死区时间:根据MOS管开关特性设置,通常300-500ns
3.2 速度闭环控制
灵眸X1采用增量式PID算法实现速度闭环,其核心实现如下:
c复制typedef struct {
float Kp, Ki, Kd;
float err, last_err, integral;
float output;
} PID_Controller;
void PID_Update(PID_Controller* pid, float target, float feedback)
{
pid->err = target - feedback;
pid->integral += pid->err;
// 抗积分饱和处理
if(pid->integral > 1000) pid->integral = 1000;
if(pid->integral < -1000) pid->integral = -1000;
float derivative = pid->err - pid->last_err;
pid->output = pid->Kp * pid->err
+ pid->Ki * pid->integral
+ pid->Kd * derivative;
pid->last_err = pid->err;
}
参数整定技巧:
- 先调Kp:从小到大增加,直到系统出现轻微振荡
- 再调Kd:加入微分项抑制振荡
- 最后调Ki:消除静差但不宜过大
- 典型参数范围:
- Kp: 0.5-2.0
- Ki: 0.01-0.1
- Kd: 0.05-0.3
4. 实测性能优化
4.1 电机启动特性优化
我们发现直流电机在启动时有几个特殊现象需要处理:
-
静摩擦补偿:
- 电机从静止到转动需要克服静摩擦力
- 解决方案:当目标速度>0时,先输出一个固定脉宽(如20ms)的高电平"kick"
-
低速非线性:
- 在低速段(占空比<10%),电机转速与PWM不成线性关系
- 解决方案:建立低速段PWM-转速查找表
-
死区补偿:
- H桥上下管切换时需要插入死区时间
- 解决方案:在软件中预补偿占空比
4.2 能耗优化策略
通过以下方法显著延长电池续航:
-
动态PWM频率:
- 低速时用5kHz PWM
- 高速时自动切换到20kHz
-
再生制动:
- 减速时让电机工作在发电模式
- 通过二极管将能量回馈到电源
-
休眠模式:
- 静止超过10秒自动进入低功耗模式
- 通过加速度计唤醒
5. 常见问题排查
5.1 电机抖动问题
现象:电机运行时出现不规则抖动或啸叫
排查步骤:
- 检查PWM频率是否在15-20kHz范围内
- 用示波器观察MOS管栅极驱动波形是否干净
- 检查电源滤波电容是否足够(建议每电机并联100μF+0.1μF)
- 尝试增加死区时间(通常300-500ns)
5.2 速度控制不稳定
现象:小车直线行驶时速度波动较大
解决方案:
- 检查编码器信号是否稳定(如有抖动需加硬件滤波)
- 降低PID的Ki参数
- 增加速度采样滤波(建议采用移动平均滤波)
- 检查电机供电电压是否稳定
5.3 过流保护触发
现象:系统频繁进入过流保护状态
可能原因:
- 电机堵转(机械卡死)
- H桥上下管直通(检查驱动时序)
- 电流检测电路异常(检查采样电阻和运放)
6. 进阶功能扩展
基于现有框架,还可以实现以下增强功能:
-
轨迹跟踪:
- 通过左右轮速差计算转向角度
- 结合PID实现路径跟踪
-
能量回收:
- 在下坡或刹车时启用发电模式
- 通过Buck电路给电池充电
-
无线升级:
- 利用CW32内置的Flash读写功能
- 通过蓝牙或2.4GHz接收固件包
在实际项目中,我们发现电机的温度监测也非常重要。通过在电机外壳粘贴NTC热敏电阻,可以实时监测电机温度,当温度超过60℃时自动降低输出功率,这个简单的改进让我们的产品返修率下降了70%。