1. 项目概述:基于SH79F1611的24管三轮车控制器方案
在电动三轮车控制器领域,中颖SH79F1611这颗8位MCU堪称经典。我经手过的24管方波方案中,约60%都采用该芯片,其优势在于:
- 内置4路带死区控制的PWM发生器
- 8通道10位ADC
- 硬件比较器
- 16位增强型定时器
这些特性完美契合三轮车控制器需求。24管配置指三相桥臂每相使用8个MOS管并联(上下桥各4管),适合载重三轮车的大电流场景。方波控制虽比FOC算法效率低5-8%,但胜在:
- 算法简单,8位机即可胜任
- 调试门槛低
- 成本优势明显(省去电流采样运放)
提示:方波控制建议用于2000W以下电机,超过此功率建议改用FOC方案以提升能效
2. 硬件架构设计要点
2.1 功率板布局规范
24管布局需遵循"三明治结构":
code复制顶层:驱动IC+门极电阻
中间层:MOS管阵列(每相8管交错排列)
底层:电流采样电阻+滤波电容
关键参数计算:
- 单管电流 = 额定功率/(3电池电压0.7)
- 栅极电阻 = 驱动IC峰值电流/(Qg开关频率)
例如:使用IR2104驱动IC(2A峰值)搭配IRFB4110(Qg=210nC):
栅极电阻 = 2/(210e-915e3) ≈ 6.8Ω
2.2 关键保护电路
- 过流保护:采用50mΩ/3W采样电阻+LM393比较器
- 阈值电压 = 保护电流*采样电阻
- 例如80A保护:80*0.05=4V
- 欠压保护:使用TL431设置阈值(如48V系统设42V)
- 温度保护:NTC电阻分压接入ADC
3. 核心软件实现
3.1 PWM定时器配置
c复制// 定时器2初始化(中心对齐模式)
void PWM_Init(void) {
T2CON = 0x08; // 16位自动重载,中心对齐
TL2 = 0x00; // 定时器低字节
TH2 = 0xFC; // 对应15.6kHz@16MHz
TR2 = 1; // 启动定时器
// PWM输出配置
P1M0 = 0x3F; // P1.0-P1.5推挽输出
P1M1 = 0x00;
}
注意:死区时间由PWMCON寄存器设置,一般2-4μs为宜
3.2 换相控制算法优化
改进型霍尔状态机:
c复制typedef enum {
STATE_START,
STATE_RUN,
STATE_BRAKE
} MotorState;
void Hall_Handler(uint8_t raw_hall) {
static MotorState state = STATE_START;
static uint8_t last_valid = 0;
// 消抖处理(连续3次相同才确认)
if(raw_hall != last_hall) {
if(++debounce_cnt > 3) {
last_valid = raw_hall;
debounce_cnt = 0;
// 状态机处理
switch(state) {
case STATE_START:
if(last_valid != 0) state = STATE_RUN;
break;
case STATE_RUN:
Do_Commutation(last_valid);
break;
case STATE_BRAKE:
P1 = 0x00; // 所有PWM关闭
break;
}
}
} else {
debounce_cnt = 0;
}
}
3.3 调速信号处理
转把信号处理流程:
code复制ADC采样 → 滑动平均滤波 → 线性化处理 → 限幅保护
c复制#define FILTER_SIZE 8
uint16_t Get_Throttle(void) {
static uint16_t filter_buf[FILTER_SIZE];
static uint8_t index = 0;
uint32_t sum = 0;
// 更新采样值
filter_buf[index] = AD_Read(4);
if(++index >= FILTER_SIZE) index = 0;
// 滤波处理
for(uint8_t i=0; i<FILTER_SIZE; i++) {
sum += filter_buf[i];
}
uint16_t result = sum / FILTER_SIZE;
// 非线性校正(针对霍尔转把)
if(result < 512) {
return result * 0.8; // 低速段降低灵敏度
} else {
return result * 1.2; // 高速段提升响应
}
}
4. 调试技巧与故障排查
4.1 常见问题速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 电机抖动 | 霍尔相位错误 | 交换任意两相线或霍尔线 |
| 启动困难 | 换相时序偏差 | 调整PhaseTable中的状态顺序 |
| MOS管发烫 | 死区时间不足 | 增大PWMCON中的死区设置 |
| 高速失步 | 滤波过度 | 减少霍尔消抖计数阈值 |
4.2 示波器调试要点
- PWM波形检查:
- 确认上下桥互补对称
- 测量死区时间是否达标
- 霍尔信号同步性:
- 换相时刻与霍尔跳变沿对齐
- 检查信号抖动情况
- 电流波形:
- 观察换相时的电流尖峰
- 正常应为梯形波
4.3 参数整定经验
- 加速曲线优化:
c复制// 渐变加速算法
void Soft_Start(uint16_t target) {
static uint16_t current = 0;
uint16_t step = target / 20; // 分20步到达
while(current < target) {
current += step;
if(current > target) current = target;
Set_PWM_Duty(current);
Delay_ms(50); // 每步50ms
}
}
- 堵转检测实现:
c复制void Check_Stall(void) {
static uint16_t last_speed = 0;
uint16_t current = Get_Speed();
if((current < 100) && (throttle > 500)) {
if(++stall_cnt > 10) { // 持续100ms
Fault_Handler(STALL_FAULT);
}
} else {
stall_cnt = 0;
}
last_speed = current;
}
5. 进阶功能扩展
5.1 能量回收制动
通过检测相电压实现:
c复制void Brake_Energy_Recover(void) {
if(brake_signal) {
// 关闭所有下桥,上桥PWM调制
P1 = 0x15; // A+C相上桥导通
Set_PWM_Duty(800); // 80%占空比
// 母线电压检测
if(AD_Read(5) > OVER_VOLTAGE) {
P1 = 0x00; // 过压保护
}
}
}
5.2 蓝牙参数配置
通过UART连接HC-05模块:
c复制void UART_Config(void) {
SCON = 0x50; // 模式1,8位UART
TMOD |= 0x20; // 定时器1模式2
TH1 = 0xFD; // 9600@16MHz
TR1 = 1;
ES = 1; // 使能串口中断
}
void UART_ISR(void) interrupt 4 {
if(RI) {
uint8_t cmd = SBUF;
RI = 0;
switch(cmd) {
case 0xA1: // 读取参数
Send_Params();
break;
case 0xB2: // 设置最大电流
max_current = UART_Read_Word();
break;
}
}
}
我在实际项目中总结的几点经验:
- 电机启动时强制换相3-5个周期可显著提升启动扭矩
- 温度采样建议放在PWM周期末尾进行,避开开关噪声
- 对于载重三轮车,低速段适当提高电流限值可改善爬坡性能
- 定期检测霍尔信号有效性,异常时切换至反电动势换相
