共计 2396 个字符,预计需要花费 6 分钟才能阅读完成。
硬件架构设计
1. 核心器件选型
- STM32F103C8T6:72MHz 主频的 Cortex-M3 内核,具备 3 个高级定时器(TIM1/2/3)和 4 个通用定时器,满足 PWM 生成与编码器接口需求
- TB6612FNG:1.2A 持续电流输出的双 H 桥驱动器,内置低导通电阻 MOSFET(0.3Ω@VM=10V)
- 光电编码器 :500 线 AB 相输出,采用 RS422 差分信号传输
2. 关键电路设计
2.1 功率回路布局
flowchart LR
VM(12V 电源) -->|100uF 电解电容 | TB6612
TB6612 -->|0.1uF 陶瓷电容 | GND
TB6612 -->| 肖特基二极管 | 电机
– 电机电源输入端并联 100uF+0.1uF 电容组合,抑制高频瞬态干扰
– 每个 H 桥输出端反向并联 SS34 肖特基二极管,消除反电动势

2.2 信号隔离电路
// 光耦隔离电路参数计算
#define R_IN (1000) // 输入端限流电阻 (3.3V/3mA)
#define R_OUT (4700) // 输出端上拉电阻 (5V/1mA)
软件实现详解
1. 定时器 PWM 配置
// TIM1 通道 1 /2 PWM 输出初始化
TIM_OC_InitTypeDef sConfigOC = {
.OCMode = TIM_OCMODE_PWM1,
.Pulse = 0, // 初始占空比 0%
.OCPolarity = TIM_OCPOLARITY_HIGH,
.OCFastMode = TIM_OCFAST_DISABLE
};
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
// 死区时间设置(关键参数)TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {
.OffStateRunMode = TIM_OSSR_DISABLE,
.OffStateIDLEMode = TIM_OSSI_DISABLE,
.LockLevel = TIM_LOCKLEVEL_1,
.DeadTime = 54, // 对应约 1us 死区 (72MHz/16 分频)
.BreakState = TIM_BREAK_DISABLE
};
HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
2. 编码器接口实现
2.1 定时器配置
// TIM2 编码器模式初始化
TIM_Encoder_InitTypeDef sEncoderConfig = {
.EncoderMode = TIM_ENCODERMODE_TI12,
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC2Polarity = TIM_ICPOLARITY_RISING,
.IC1Selection = TIM_ICSELECTION_DIRECTTI,
.IC2Selection = TIM_ICSELECTION_DIRECTTI,
.IC1Prescaler = TIM_ICPSC_DIV1,
.IC2Prescaler = TIM_ICPSC_DIV1,
.IC1Filter = 6, // 8 个时钟周期滤波
.IC2Filter = 6 // 对应 500Hz 输入信号
};
HAL_TIM_Encoder_Init(&htim2, &sEncoderConfig);
2.2 速度计算算法
// 速度测量函数 (单位:RPM)
int16_t GetMotorSpeed(void) {
static int32_t last_cnt = 0;
int32_t current_cnt = __HAL_TIM_GET_COUNTER(&htim2);
int32_t delta = (current_cnt - last_cnt) * 1000 / MEASURE_PERIOD_MS;
last_cnt = current_cnt;
// 转换为 RPM:delta*60*1000/(500*4*MEASURE_PERIOD_MS)
return (delta * 30) / (500 * MEASURE_PERIOD_MS);
}
工业现场优化方案
1. 电源噪声抑制
- 电机供电线路采用星型拓扑,避免数字地回路干扰
- 在 TB6612 的 VM 引脚就近布置 10uF X7R 陶瓷电容 +100nF NPO 电容组合
2. 编码器信号处理
// 软件消抖算法示例
#define DEBOUNCE_THRESHOLD 3
uint8_t EncoderDebounce(uint8_t raw_state) {
static uint8_t stable_state = 0, count = 0;
if(raw_state != stable_state) {if(++count >= DEBOUNCE_THRESHOLD) {
stable_state = raw_state;
count = 0;
return 1; // 状态变化有效
}
} else {count = 0;}
return 0;
}
进阶思考方向
- 堵转检测实现 :
- 监测电流突变(通过采样电阻 +ADC)
-
结合速度反馈与 PWM 占空比阈值判断
-
多电机同步策略 :
- 采用主从定时器触发模式(TIM1->TIM3)
-
设计交叉耦合 PID 控制器
-
低功耗快速唤醒 :
- 配置编码器信号触发 EXTI 中断
- 使用 STOP 模式 +RTC 自动唤醒
实测性能数据
| 指标 | 参数值 |
|---|---|
| 速度控制精度 | ±1.5%FS |
| 响应时间 (10%-90%) | 120ms |
| 空载功耗 | 23mA@12V |
典型问题解决
现象:电机启动抖动
解决方案 :
1. 检查死区时间是否足够(建议≥1us)
2. 增加 PWM 起始占空比软启动
// 软启动示例
for(int i=0; i<10; i++) {__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, i*10);
HAL_Delay(50);
}
现象:编码器计数异常
排查步骤 :
1. 使用逻辑分析仪捕获 AB 相信号质量
2. 调整输入滤波器参数(TIMx->CCMR1 寄存器 IC1F 位)
3. 检查编码器供电电压稳定性(建议 5V±5%)
正文完
