拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于HK32F030C8T6与MT6816的高精度闭环步进电机驱动板设计

简介这是一份围绕航顺HK32F030C8T6控制板的高性能步进电机设计资料主控搭配两颗东芝TB67H450驱动芯片、麦歌恩MT6816超高速零延时AMR编码器及东芝TLP2168高速光耦覆盖原理图、PCB与完整软件例程。板卡为40mm×40mm两层板电压12-30V额定电流最高3.5A控制精度小于0.08度支持4、8、16、32档电子齿轮适合42/57步进电机的位置闭环应用也可作为嵌入式硬件设计和电机驱动开发的进阶参考。压缩包共642个文件大小约29MB以c、h源码文件为主包含s启动文件、uvprojx工程配置、hex/axf可烧录固件、schdoc原理图、pcbdoc PCB文件、BOM物料清单和DRC检查文件便于直接从工程框架学习软硬件联调。目前已有1281人学习对于需要研究步进电机驱动电路、精密编码器接口或HK32F030外设应用的开发者整体方案可直接用于二次开发或改板验证。1. 为什么是HK32F030C8T6TB67H450MT6816这套组合这块40×40mm的两层控制板把航顺HK32F030C8T6、两颗东芝TB67H450、麦歌恩MT6816凑到一起目标很明确用一颗M0内核的国产MCU把42/57步进电机驱动到最大3.5A同时用AMR磁编码器把位置误差压到0.08度以下。我拆过不少步进控制板常见做法是DSP加专用驱动芯片成本高、外围多。这套方案用普通MCU加双H桥加高速编码器恰好覆盖了中小型闭环步进的应用区间适合做雕刻机、3D打印机、小型机械臂的定制驱动。下面按原理图、PCB、固件的顺序把每一处设计决策和实际会踩的坑都过一遍。2. 原理图设计从DC-DC到H桥和编码器的信号链路2.1 电源架构与逻辑电平匹配HK32F030C8T6的工作电压是2.0到3.6V板上统一用3.3V供电。外部输入是12到30V先经降压芯片转到5V给TB67H450的逻辑电源和TLP2168光耦输入侧供电再经过LDO降到3.3V给MCU、MT6816和光耦输出侧使用。TB67H450的VCC逻辑电源范围是2.5到5.5V用5V供电时输入高电平门槛在2.0V以上如果直接用3.3V的MCU引脚去驱动电平余量偏紧长时间运行容易误触发。因此原理图里MCU的IO先经过TLP2168再进驱动器这样既隔离了电机侧的干扰又解决了电平匹配问题。MT6816必须单独使用3.3V电源在VDD引脚附近放一组1uF加0.1uF的去耦电容且尽量靠近芯片。这颗编码器的SPI接口最高支持10MHz时钟但电机转动时磁场变化会在电源上耦合出毛刺电源纹波建议控制在50mV以内。板上降压芯片我习惯选开关频率1MHz以上的型号比如MP1584滤波电容可以小一点布局也更灵活。下表是三个电源轨的规划电源轨电压用途去耦电容VIN12-30V电机供电、板上总输入100uF电解加0.1uF陶瓷5V5VTB67H450逻辑、TLP2168输入侧10uF加0.1uF3.3V3.3VHK32F030、MT6816、光耦输出侧1uF加0.1uF注意0.1uF陶瓷电容要放在对应芯片电源引脚旁边比如5V那路0.1uF直接贴着TB67H450的VCC引脚放距离不超过3mm。电解电容放在电源入口处用于吸收电机启停时的浪涌。原理图里还要给VIN加一个防反接二极管推荐肖特基或PMOS管方案压降小发热少。2.2 TB67H450双H桥配置与电流检测电阻计算TB67H450是一颗单H桥驱动器最大输出3.5A驱动两相步进电机需要两颗分别控制A相和B相绕组。使用PHASE加ENABLE模式是最常见的接法IN1输入PWM斩波信号IN2输入方向电平ENABLE引脚拉低使能输出。这样MCU只需要输出一路PWM和一路方向IO逻辑简单软件也好写。每颗TB67H450通过RNF引脚外接电流检测电阻来设定峰值电流。参考数据手册里的典型公式峰值电流Ipeak与VREF、RNF有关实际计算时还要乘一个增益因子。这里我写了一段选型脚本方便换电机时快速确定电阻值# 计算TB67H450电流检测电阻值 # 公式: Ipeak VREF / (20 * RNF * 1.1) 取自典型应用VREF1.24V def calc_rnf(current_peak, vref1.24, gain20, factor1.1): # current_peak: 目标峰值电流(A) return vref / (gain * factor * current_peak) # 42步进电机额定2A峰值留1.25倍余量 r_42 calc_rnf(2.5) # 57步进电机额定2.5A极限3.5A r_57 calc_rnf(3.5) print(f42步进推荐RNF: {r_42:.4f} 欧姆) print(f57步进推荐RNF: {r_57:.4f} 欧姆)脚本输出42步进约0.0225欧姆57步进约0.0161欧姆。E24系列里最接近的阻值分别是0.022欧姆和0.015欧姆注意电阻功率至少1W实际用到3.5A时建议用2W功率电阻。VREF可以由MCU的PWM经过RC滤波产生也可以直接用电阻分压本项目使用电阻分压固定为1.24V这样软件里只需要调PWM占空比来改变有效电流。2.3 MT6816与TLP2168的SPI隔离链路MT6816使用四线SPI接口但只需要读角度数据不需要写寄存器。实际连接时MOSI引脚悬空只接CS、SCLK、MISO三根信号线。由于TLP2168是双通道光耦CS和SCLK用一颗MISO单独用另一颗的其中一个通道剩余通道可以空闲。光耦两侧电源必须隔离输入侧用5V输出侧用3.3V。光耦引入的传播延迟决定了SPI时钟不能太高TLP2168典型延迟约100nsSPI时钟降到2MHz比较稳妥。MT6816引脚TLP2168通道HK32F030引脚备注SCLKU3_A 输入PA5 (SPI1_SCK)时钟信号CSU3_B 输入PA4片选低有效MISOU4_A 输入PA6 (SPI1_MISO)角度数据输出这里有一个容易忽略的点CS信号经过光耦后边沿会有延迟和抖动。软件里在片选拉低后要延时至少2us再开始发时钟否则第一帧数据容易错位。原理图中还建议在SCLK和MISO线上各串联一个33欧姆电阻用来抑制振铃特别是在光耦输出侧走线较长时效果明显。3. PCB Layout40×40mm两层板的走线与散热3.1 地平面分割与电源回流路径两层板没有完整的地层但地平面仍要尽量保持连续。功率地和信号地建议在PCB上直接连通不要刻意分岛否则回流路径断裂会产生更大的环路面积。正确的做法是TB67H450的PGND通过短粗走线回到输入滤波电容的负极MCU和编码器的地也回到同一个电容负极形成单点汇聚。板子上所有地孔都打在器件旁边减少回路面积。电机电流大电源走线要特别注意。3.5A电流在1oz铜箔下按IPC-2221标准允许10度温升至少需要2.5mm宽。如果走线长度超过5cm宽度还要增加。下面这段脚本可以快速计算不同电流下的最小线宽# 计算PCB走线宽度IPC-2221外层走线标准 def trace_width_mm(current_a, copper_oz1, temp_rise_c10): area_mil2 current_a / (0.024 * temp_rise_c ** 0.44) ** 0.725 thickness_mil copper_oz * 1.378 # 1oz约1.378mil width_mil area_mil2 / thickness_mil return width_mil * 0.0254 # 转为mm # 3.5A电流1oz铜温升10°C w1 trace_width_mm(3.5) # 2A电流 w2 trace_width_mm(2.0) print(f3.5A最小走线宽度: {w1:.2f} mm) print(f2A最小走线宽度: {w2:.2f} mm)计算结果3.5A约2.67mm2A约1.28mm。实际布局时我习惯再留30%余量所以3.5A的线宽取3.2mm以上可以用底层整块铺铜来做顶层只走信号线。还要避免VM走线穿过MT6816下方大电流产生的磁场会干扰编码器内部的AMR传感器。3.2 TB67H450散热焊盘与过孔阵列每颗TB67H450底部有一个大焊盘是芯片主要散热路径。两层板散热条件有限必须通过过孔把热量引到背面铜皮。我的做法是在底部焊盘上排列12个过孔孔径0.3mm间距0.8mm塞孔方式选“via-in-pad”时要注意工艺成本普通工厂建议做过孔盖油背面开窗以便散热。过孔阵列外围再加一圈导热铜皮连接到输入电容的负极端。这些过孔不能太靠近芯片引脚否则焊接时焊锡会从过孔流走造成虚焊。如果手工焊接可以把过孔打在焊盘外围0.5mm的铜皮上效果比打在焊盘内更好。实测输出2.5A连续运行30分钟后芯片温度约85度加上散热过孔阵列后可以降到78度左右。如果是3.5A长时间运行还是需要外加散热片或强制风冷单纯靠PCB铜皮很难压住温升。3.3 MT6816的磁场干扰规避与走线宽度验证MT6816是贴片封装安装在PCB边缘电机转轴上的磁铁从上方正对芯片。PCB上要画一个禁布区域直径至少5mm区域内部不允许走线和铺铜避免线圈涡流影响磁力线分布。芯片周围也不要放置电流检测电阻这类大电流器件它们工作时的磁场叠加会导致编码器读数产生周期性跳动。另外MT6816的模拟供电建议加一个磁珠与数字电源隔开。在布局时把SPI信号线走等长且在板内层如果两层板则走底层并下方铺地信号线旁边不要走PWM驱动线。调试中发现当PWM频率是20kHz时如果SPI线靠近电机驱动线超过3cm编码器数据偶尔会出错拉开距离后问题消失。最后用上面的脚本重新验证所有功率走线宽度确保没有一根线在临界值以下。4. 软件例程读取MT6816与电子齿轮的实现4.1 SPI时序配置与角度数据解析HK32F030C8T6的主频最高72MHzSPI1挂在APB2上时钟36MHz。通过分频配置SPI时钟为2MHz。MT6816的16位读操作里高字节是寄存器地址低字节是命令参数。读取角度寄存器0x03时首先发送0x00和0x03之后每发送一个字节就能读回一个字节。为了方便我封装了一个读角度寄存器16位数据的函数#include hk32f030x.h #include spi.h uint16_t MT6816_ReadAngleReg(void) { uint16_t rx 0; // CS拉低启动传输注意光耦延迟需要等待2us GPIO_ResetBits(GPIOA, GPIO_Pin_4); delay_us(2); // 发送寄存器地址: 0x03高字节为0 SPI_SendData8(SPI1, 0x00); while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) RESET); SPI_SendData8(SPI1, 0x03); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) RESET); (void)SPI_ReceiveData8(SPI1); // 丢弃无用字节 // 连续发送0x00产生SCLK接收角度数据高8位 SPI_SendData8(SPI1, 0x00); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) RESET); rx SPI_ReceiveData8(SPI1); rx 8; // 接收低8位 SPI_SendData8(SPI1, 0x00); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) RESET); rx | SPI_ReceiveData8(SPI1); // CS拉高 GPIO_SetBits(GPIOA, GPIO_Pin_4); return rx; }这段代码里每次SPI发送后都必须等待TXE标志再读RXNE否则数据会错位。MT6816返回的14位有效数据在寄存器的高14位所以读取后还需要右移2位换算角度时乘以360/16384。实际测试中2MHz时钟配合TLP2168没有问题1MHz更稳定代价是位置环的采样周期变长所以我们在软件里只在中断里读取编码器不做频繁循环读取。4.2 PWM电流控制与方向逻辑步进电机的电流控制使用20kHz PWM。HK32F030的TIM1是高级定时器可以输出互补PWM但这里只需要单路PWM。每颗TB67H450使用一路PWM方向由普通IO控制。设定电流的映射关系为占空比0到255线性对应0到100%有效输出。以下代码实现占空比设置void Motor_SetDuty(TIM_TypeDef* TIMx, uint32_t channel, uint8_t duty) { uint32_t period TIMx-ARR; // duty范围0-255映射到0-ARR uint32_t ccr (uint32_t)((uint32_t)period * duty / 255); TIMx-CCR[channel] ccr; }参数说明duty是电流控制量不是位置。对于42步进电机额定2A时典型duty值在120左右此时RNF电阻上的电压峰值对应设定电流。启动时不能让duty直接从0跳到目标值要做一个斜坡每1ms增加2个单位否则电机会过冲并可能使TB67H450进入过流保护。过流保护触发后芯片会锁存错误需要ENABLE引脚复位才能恢复。4.3 电子齿轮4/8/16/32的位置环实现电子齿轮这个词在不同语境下含义不同本项目里指的是位置环的比例因子。MT6816反馈精度0.022度电子齿轮为4时位置误差被缩小4倍后参与控制等效控制精度变粗但响应更快。反过来电子齿轮为32时误差被大幅缩小电流变化更平滑适合低振动低速场景。以下是一个简化位置环#define GEAR_RATIO 16 // 4/8/16/32 可调 float target_pos; // 目标位置度 float measured_pos; // 编码器读取的位置度 void PositionLoop(void) { float error target_pos - measured_pos; // 电子齿轮误差除以齿轮值等效降低位置环增益 float adjusted error / (float)GEAR_RATIO; // 限幅防止PWM满偏导致过流 if (adjusted 1.0f) adjusted 1.0f; if (adjusted -1.0f) adjusted -1.0f; // 映射到占空比128为停止点上下各127级 uint8_t duty (uint8_t)(128 adjusted * 127); Motor_SetDuty(TIM1, 1, duty); }注意M0内核没有硬件浮点float除法很耗时实际项目中我会把误差和齿轮值都转成整数计算再用移位的办法近似除法。这里用float是为了演示逻辑。电子齿轮不同档位对应不同系统行为齿轮值等效控制精度(度)适用场景40.088快速点到点移动80.176通用定位160.352低噪声连续运动320.704高稳定低速微调当齿轮值调大时系统对抗外界扰动的能力变弱因为误差被缩小的倍数更多同样的角度误差产生的电流修正量更小。如果机械负载偏大我一般先用8跑通再逐步加大观察振动。5. 调试验证0.08度精度和3.5A电流的实测方法拿到板子后先不要急着装电机。用万用表测量3.3V、5V电压确认TLP2168两侧电源都正常。接着用示波器观察SPI的CS和SCLK确保经过光耦后的波形边沿斜率足够陡如果SCLK上升沿超过200ns把SPI时钟降到1MHz。第一步先跑通编码器读取串口输出角度值手动转电机轴确认角度连续变化没有跳变。0.08度精度不能只看编码器分辨率还要校准机械零点。安装磁铁时无法保证绝对角度对齐所以上电后让电机轴找到参考位可以用限位开关或人为设定把MT6816当前值写入Flash作为零点偏移。测量精度时使用高精度光栅尺或激光干涉仪作为外部基准让电机从一个方向旋转10圈每圈记录编码器累计角度和外部基准的差值。重点测试正转和反转的差值如果方向切换后误差超过0.08度多半是机械间隙或磁铁同心度问题跟控制算法无关。电流验证需要电流探头示波器带宽20MHz以上。将探头夹住RNF电阻或电机一根引线让电机堵转缓慢加大PWM占空比观察电流波形。TB67H450的峰值电流设定在3.5A时占空比到上限约70%就不要再加此时芯片温度会快速升高。用手触摸芯片表面如果烫到不能持续接触说明散热不够需要降低PWM频率或减小电流设定。曾经遇到一个现象PWM频率从20kHz降到10kHz后同样占空比下电流反而更大因为电机电感在低频时纹波更大峰值电流提前达到限流点所以调参时要同时关注频率和限流电阻。最后分享一个排查光耦时序问题的技巧把逻辑分析仪同时接在光耦输入和输出侧的SCLK上量出实际延迟。TLP2168标称100nsPCB走线电容会让延迟变长。我在实际板上量到约180ns于是把SPI时钟分频值从36M分到2M即使算上延迟半个时钟周期还有250ns足够满足建立时间。如果逻辑分析仪只有8通道就直接抓CS、SCLK和MISO三根线MISO数据必须在SCLK下降沿附近采集看数据是否在窗口内稳定。这一步做好了后面所有角度数据都是干净的。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门