简介:这份资源面向从事电机驱动开发的工程师与单片机调试人员,围绕峰岹FU68XX系列(FU6831、FU6832等型号)的调试流程做系统梳理,解决从拿到原厂参考程序与Demo板后不知如何下手、参数调整缺乏头绪的问题。内容以调试手册和方法步骤为主线,涵盖保护参数配置、宽电压范围下的启动与运行采样点设置、死区时间与载波频率匹配MOS管特性、电机基本转速取正常转速2-3倍、原理图与PCB等硬件参数核对,以及顺逆风启动、预定位电流与负载、转速切换与运行参数随负载调节等环节,并提示实际测试速度与目标速度不符时如何调整速度基准、变量初始化值、数值范围与数据类型,同时说明电流采样结构、Q格式定义与SVPWM配置的作用。资源包共1个pdf文件,约1.62MB,便于随时查阅对照。已有802人学习下载,适合需要按步骤排查启动失败、运行不稳等问题的读者参考。
1. FU68XX调试到底在调什么:从“能转”到“能交付”的六条主线
一块三相无刷驱动板,空载能转,带上风机负载就欠压保护;母线从24V到48V宽压输入,低压段偶尔起不来。这类问题在FU68XX系列(FU6831、FU6832)的调试现场很常见,也是我整理这份调试总结的起点。它不是一个直接烧录就能量产的完整工程,而是一套按顺序推进的方法步骤:先把硬件基线、电流采样链路和Q格式对齐,再调预定位、顺逆风、转速切换,最后把死区、载波、限流和速度基准联调到位。适合刚接手FU68XX的嵌入式工程师、电机控制工程师,也适合带新人时当检查表用。板子能转只是起点,能宽压启动、能带载、能顺逆风切换、保护不误动,才算可交付。
2. 上电前先锁硬件基线:采样链路、Q格式与工程配置的三张核对表
2.1 原理图和PCB核对:先把“软件调不动”的硬件嫌疑排掉
FU68XX这类电机驱动MCU,软件参数调得再细,硬件基线错了也会表现成玄学:同一套参数,这块板子能起,那块板子过流。我一般先不急着改代码,拿原理图和PCB逐项对一遍,尤其是采样、驱动和保护链路。下面这张核对表可以直接打印出来勾选。
| 核对项 | 看什么 | 常见问题 | 处理 |
|---|---|---|---|
| 母线电压采样 | 分压电阻比例、ADC口、滤波电容 | 分压比按理论值填,实际电阻误差没算 | 用万用表反推实际比例,写入参数表 |
| 相电流采样 | 采样电阻、运放增益、偏置电压 | 运放偏置不在ADC中点,正负电流不对称 | 上电不开PWM,先采零漂 |
| MOS驱动 | 自举电容、驱动电阻、死区 | 自举电容偏小,低频大占空比掉驱动 | 按开关频率核算自举电容 |
| 保护比较器 | 阈值分压、滤波、关断路径 | 软件保护没生效,硬件比较器也没接 | 先用硬件比较器兜底 |
| 温度/缺相 | NTC位置、缺相检测电路 | NTC贴在MOS远处,温升滞后 | 确认热耦合和滤波时间 |
这张表里最容易翻车的是电流采样偏置。很多参考工程默认运放输出偏置在VDD/2,实际板子用1.65V或别的基准,零漂没校准,Q格式换算出来的电流就带直流分量,表现是低速抖动、预定位过流。上电后先关PWM,把三相电流的ADC原始值打印出来,看是否接近预期偏置;偏差大就先查运放供电和电阻,不要急着在软件里硬补。
提示:硬件核对阶段不要开强电流,先把母线电压、零漂、驱动供电三路采回来,确认数值跟万用表对得上,再进电机参数。
2.2 电流采样结构与Q格式:量程、偏置和饱和边界
FU68XX的电流采样通常围绕PWM定时器触发ADC来做,采样时刻落在下桥臂导通窗口内,采到的是相电流。采样结构要先把“原始ADC码—电压—电流—标幺值”这条链路定死,否则后面调速度环、限流环都是空中楼阁。常见做法是定义一个采样结构体,把零漂、原始码、Q格式电流放在一起,调试时整块打印。
typedef int16_t q15_t; typedef struct { uint16_t adc_raw[3]; /* U/V/W 三相ADC原始码 */ q15_t offset[3]; /* 上电静态零漂,单位ADC码 */ q15_t i_q15[3]; /* Q15格式相电流,1.0对应满量程 */ uint8_t sample_valid; /* ADC注入完成标志 */ } CurrentSample_t; /* 采样电阻、运放增益、ADC参考按实际板子填写,不要照抄 */ #define ADC_REF_V 3.3f #define ADC_FULL_CODE 4095.0f #define SHUNT_OHM 0.005f #define OPAMP_GAIN 10.0f #define I_FULL_SCALE_A ((ADC_REF_V / 2.0f) / (OPAMP_GAIN * SHUNT_OHM)) static q15_t current_to_q15(int32_t raw, int32_t offset) { float volt = ((float)(raw - offset) / ADC_FULL_CODE) * ADC_REF_V; float amp = volt / (OPAMP_GAIN * SHUNT_OHM); float pu = amp / I_FULL_SCALE_A; if (pu > 0.999f) pu = 0.999f; if (pu < -0.999f) pu = -0.999f; return (q15_t)(pu * 32767.0f); }这段代码的关键不是公式本身,而是三个边界。第一,offset必须上电静态采,不能写死;第二,I_FULL_SCALE_A要按实际采样电阻和运放增益算,算大了Q15分辨率不够,算小了容易饱和;第三,Q15的正负范围是-32768到32767,做乘法累加时中间结果要用int32_t接,别直接拿q15_t乘。FU68XX工程里常把电流、电压、速度分别用不同Q格式,电流用Q15、速度用Q12都行,但同一路信号从采样到环路必须统一,不能这里Q15、那里Q10,最后查溢出查到头大。
变量范围这件事要提前定:最大转速、最大电流、母线电压上限分别对应哪个Q格式的1.0。比如最大相电流峰值30A,那30A对应Q15的32767,超过就饱和;如果实际能到45A,就要么换Q12,要么把满量程改到45A。不要等结果超范围了再改数据类型,那时候PI参数、限幅值全要跟着动。
2.3 工程配置的第一版参数:载波、死区、采样触发点
第一版工程配置不要追求“最优”,先追求“能安全跑起来”。载波频率、死区时间、ADC触发点这三个参数必须一起定,因为它们互相牵扯:载波越高,PWM周期越短,采样窗口越窄;死区越大,低压占空比失真越明显。我一般先按MOS规格和电流环带宽给一版保守值,再用示波器看波形。
/* 第一版配置示例:具体时钟按芯片实际主频换算,不要直接抄计数 */ #define PWM_FREQ_HZ 16000u #define PWM_PERIOD_COUNTS 3000u /* 主频/PWM频率,按实际主频算 */ #define DEAD_TIME_NS 600u #define DEAD_TIME_COUNTS ((SYSTEM_CORE_HZ / 1000000u) * DEAD_TIME_NS / 1000u) #define ADC_TRIG_COUNT (PWM_PERIOD_COUNTS / 2u) /* 中心对齐,中点触发 */ typedef struct { uint16_t pwm_freq_hz; uint16_t dead_time_counts; uint16_t adc_trig_count; uint8_t pwm_mode; /* 中心对齐/边沿对齐 */ uint8_t min_pulse_counts;/* 最小脉宽,防止窄脉冲 */ } PwmConfig_t;PWM_PERIOD_COUNTS不是拍脑袋填的,它等于计数时钟除以PWM频率。死区计数按核心时钟和纳秒换算,600ns只是示例,实际要看MOS的开关时间和驱动电阻。ADC_TRIG_COUNT放在周期中点,是为了让采样点落在下桥臂导通中间,避开开关振铃。中心对齐模式下,中点触发对三相电流采样最友好;如果工程用边沿对齐,采样点要往后挪,躲开开关瞬间。
min_pulse_counts这个字段很多人不加,结果低压小占空比时出现窄脉冲,MOS驱动跟不上,电流波形毛刺大。常见做法是限制最小脉宽,低于这个值的占空比直接钳位或进入特殊调制。FU68XX的SVPWM配置里要把这个限制跟死区一起算,别让互补PWM出现既窄又带死区的脉冲。
3. 启动链路怎么调:预定位、顺逆风与转速切换的状态机参数
3.1 预定位不是“给个电流等一会”:电流、时间和负载的匹配
预定位的目的,是把转子拉到一个已知角度,让开环启动有确定的起点。很多人调预定位只改一个电流值,结果轻载能过、重载过流,或者预定位时间太短,转子还没稳住就切开环,启动时抖一下甚至反转。预定位要看三个参数:定位电流、定位时间、定位角度。电流按额定相电流峰值的20%到30%起步,重载或带减速箱的负载可以分段加;时间一般200ms到500ms,负载惯量大就延长;角度按电机极对数和Hall/编码器安装位置定,没有位置传感器时用固定角度。
typedef enum { MOTOR_IDLE = 0, MOTOR_ALIGN, MOTOR_OPEN_LOOP, MOTOR_RUN, MOTOR_FAULT } MotorState_t; typedef struct { q15_t align_current_q15; /* 预定位电流,按额定峰值折算 */ uint16_t align_time_ms; /* 预定位保持时间 */ uint16_t align_angle; /* 预定位电角度 */ uint16_t open_loop_step_ms; /* 开环频率爬升步长 */ q15_t open_loop_i_q15; /* 开环电流给定 */ int32_t switch_speed_rpm; /* 切闭环转速阈值 */ } StartConfig_t;这段状态机代码只是骨架,关键在switch_speed_rpm和open_loop_step_ms的配合。开环爬升太快,转子跟不上,电流会冲;太慢,启动时间长,风机类负载可能在低速段发热。我一般让开环频率从零爬到切换转速用1到3秒,具体看负载惯量。切换转速不要设得太低,低于电机反电势建立不起来,切闭环容易失步;也不要设得太高,开环段电流大、效率低。常见做法是先设额定转速的10%到20%作为切换点,再根据启动电流和抖动微调。
预定位电流还要注意有效值和峰值的关系。软件里给的往往是峰值,保护阈值如果按有效值算,预定位阶段就容易误触发。调试时把预定位电流、母线电流、相电流同时打印,确认三者关系对得上,再改保护阈值。
3.2 顺逆风启动的检测窗口与制动策略
风机、泵类负载在启动前可能已经反转,这时候直接按顺风启动,电流会很大,甚至炸管。FU68XX的顺逆风启动参数要解决两个问题:先判断转向,再决定是直接切入、等待停机,还是短时制动。常见做法是关断PWM一小段时间,采反电势过零或相电压,判断转子速度和方向;如果反转速度超过阈值,先做制动或等待,别硬起。
| 参数 | 作用 | 调整方向 | 注意 |
|---|---|---|---|
| 检测窗口时间 | 关断PWM采反电势的时长 | 风机惯量大可加长 | 太长会影响启动响应 |
| 反向速度阈值 | 判定逆风的条件 | 按反电势幅值折算 | 阈值太低会误判 |
| 制动电流/时间 | 逆风时短时制动 | 从小电流短时间试 | 制动太猛会过流 |
| 顺风切入速度 | 顺风时直接切闭环的转速 | 接近开环切换点 | 太低容易失步 |
| 检测重试次数 | 检测失败后的重试 | 2到3次 | 多次失败直接报故障 |
检测窗口不是越长越好。窗口太长,风机还在转,反电势已经被负载拖下去,判断反而失准;窗口太短,反电势还没建立,采到的是零。我一般从几十毫秒开始试,配合示波器看关断期间相电压波形,确认能看出正反方向再定。逆风制动也要留后悔药:制动电流从小往大加,制动时间先短后长,并且保留硬件过流保护,别只靠软件。
顺风启动时,如果检测到转子已经在正转,可以直接把开环频率设到当前速度附近,再切闭环,不用从零爬。这个“当前速度”不是估出来的,要靠检测窗口里的反电势周期或Hall信号算。算不准就先等待,等转速掉下来再启动,比强行切入安全。
3.3 转速切换点:开环到闭环的判据和参数
启动什么时候切闭环,是FU68XX调试里最容易拍脑袋的地方。切早了,反电势不够,观测器或Hall角度不准,电流猛冲;切晚了,开环段电流大、发热,风机可能在中速段啸叫。切换判据一般看三个量:转速达到阈值、电流稳定在给定附近、角度误差在允许范围内。没有观测器的工程,至少要看转速和电流两个条件。
static uint8_t start_to_run_check(const StartConfig_t *cfg, int32_t speed_rpm, q15_t iq_q15, q15_t iq_ref_q15) { int32_t iq_err = (int32_t)iq_q15 - (int32_t)iq_ref_q15; if (iq_err < 0) iq_err = -iq_err; /* 转速到阈值,且电流误差在15%以内,连续多次满足才切换 */ if (speed_rpm >= cfg->switch_speed_rpm && iq_err < (int32_t)(cfg->open_loop_i_q15 / 6)) { return 1; } return 0; }这段判断里,switch_speed_rpm是硬门槛,电流误差是软门槛。实际工程还要加连续满足次数,比如连续5个控制周期满足才切,避免启动瞬间的毛刺误触发。iq_err的阈值不要设成固定数,按开环电流给定折算,否则轻载重载一套参数不通用。
切换后的转速给定也要注意:开环段给的是频率,闭环段给的是转速,两者单位要统一。有的工程开环给电频率,闭环给机械转速,中间忘了乘极对数,表现就是切换瞬间转速跳变。调试时把开环频率、闭环转速、实际转速三个量同时打印,切换点前后看一遍,单位错了一眼就能发现。
4. 运行环与保护参数:死区、载波、限流和速度基准的联调
4.1 死区时间和载波频率:按MOS和驱动电阻选,不按习惯选
死区时间是为了防止上下桥直通,但死区大了会带来电压失真,小了又可能直通。FU68XX的PWM配置里,死区计数和载波频率要一起看。载波频率高,开关损耗大,MOS温升高;载波低,电流纹波大,电机噪声大。常见做法是先从10kHz到16kHz试,看MOS温度和电流波形,再决定要不要往上提。死区时间按MOS规格书里的开关时间加驱动延迟算,再留一点余量,不要直接抄别人的600ns。
| 观察项 | 工具 | 正常表现 | 异常处理 |
|---|---|---|---|
| 互补PWM死区 | 示波器双通道 | 上下管有明显死区,无重叠 | 重叠就加死区计数 |
| 相电流波形 | 电流探头/采样打印 | 正弦度好,过零无明显台阶 | 台阶大查死区补偿 |
| MOS温升 | 热电偶/红外 | 满载温升在规格内 | 降载波或查驱动电阻 |
| 母线电流 | 直流电源显示 | 与相电流估算一致 | 偏差大查采样链路 |
死区补偿不是必须一开始就开。先把死区设对,看电流波形;如果低速过零失真明显,再加补偿。补偿量按死区时间占PWM周期的比例算,符号跟电流方向走。补偿过头会引入高频振荡,所以补偿系数从小往大加,别一上来就拉满。
载波频率还影响ADC采样窗口。载波越高,PWM周期越短,下桥臂导通窗口越窄,低压大占空比时尤其明显。如果发现低压段启动失败,先别怀疑电机参数,拿示波器看ADC触发点是不是已经落到开关沿上了。采样点设置不对,别的电压起不来,这是宽压调试里很典型的一个坑。
4.2 保护参数的分层:硬件比较器、软件阈值和滤波时间
保护参数不是一组数,是三层:硬件比较器急停、软件阈值判断、故障后的恢复策略。硬件比较器负责过流这类必须快速关断的故障,软件负责过压、欠压、堵转、缺相、过温。调试初期可以把软件阈值适当放宽,但硬件比较器不能取消,否则一次直通就可能烧板。
| 保护项 | 阈值参考 | 滤波时间 | 动作 |
|---|---|---|---|
| 过流 | 额定相电流峰值的1.5到2倍 | 20到100us | 关PWM,锁故障 |
| 过压 | 母线额定电压的1.15倍左右 | 1到5ms | 关PWM或降载 |
| 欠压 | 母线额定电压的0.8倍左右 | 5到20ms | 降载/停机 |
| 堵转 | 转速低于阈值且电流大于1.2倍额定 | 300到800ms | 停机重试 |
| 过温 | 按功率器件和电机绝缘等级 | 1到2s | 降载/停机 |
这些数值是调试起点,不是标准答案。过流阈值要按电机和MOS的短路耐受能力定,滤波时间要躲开PWM开关噪声,又不能慢到保护失效。欠压保护在宽压输入场景要特别注意:电池供电或长线供电时,启动瞬间母线会跌,欠压滤波太短会误保护。我一般把欠压滤波放到10ms以上,并且启动阶段单独设一档更宽的欠压阈值,等运行稳定再切回正常档。
故障恢复策略也要写清楚:过流锁死还是自动重试,重试几次,重试间隔多少。风机类负载堵转后自动重试可能反复冲击,最好先锁故障,等上位机或按键复位。调试阶段可以把重试次数设成0,先把故障定位清楚,别让自动重试把现场掩盖过去。
4.3 速度基准校准:实际转速与目标转速不等的排查顺序
实际测试速度和目标速度不等,是FU68XX调试里另一个高频问题。给定1000rpm,实际显示950rpm,先别急着改PI,按“单位—基准—滤波—Q格式”的顺序查。第一,看速度计算用的单位是机械转速还是电频率,有没有乘极对数;第二,看速度基准变量有没有初始化,自己加的变量很容易默认成0;第三,看速度滤波时间是不是太长,动态下显示滞后;第四,看Q格式中间结果有没有溢出或截断。
typedef struct { int32_t target_rpm; int32_t actual_rpm; int32_t speed_base_rpm; /* 标幺基准,必须初始化 */ q15_t speed_pu; uint16_t filter_ms; } SpeedCtrl_t; static q15_t speed_to_pu(const SpeedCtrl_t *s, int32_t rpm) { int32_t base = s->speed_base_rpm; int32_t tmp; if (base <= 0) { return 0; /* 基准没初始化,直接返回0,不要除 */ } tmp = (rpm * 32767) / base; /* 先乘后除,防止整除丢精度 */ if (tmp > 32767) tmp = 32767; if (tmp < -32768) tmp = -32768; return (q15_t)tmp; }speed_base_rpm是速度标幺的基准,不是额定转速随便填。有的参考工程把基本转速设成正常转速的2到3倍,这不是让电机超速运行,而是给速度环留标幺余量,最大转速限制仍然要单独卡死。基准设得太小,速度环容易饱和;设得太大,低速分辨率不够。我一般按实际最高转速的1.2到1.5倍设基准,再用最大转速限制做硬约束。
如果实际转速总是比目标低一个固定比例,重点查速度计算系数,比如每转脉冲数、Hall换相表、定时器分频。固定偏差通常是单位换算错,不是PI参数问题。如果偏差随负载变化,才去看电流环限幅和速度环积分。变量数值范围也要检查:rpm * 32767在32位下一般够,但如果转速变量是16位,乘完就溢出了,结果会跳变。自己加的函数和判断要根据电机状态来使能,别在故障状态下还跑速度环积分。
5. 避坑与排查:五类现场翻车记录和定位顺序
5.1 宽压启动失败与采样点盲区
现象:母线电压从48V降到24V,电机偶尔起不来,或者启动瞬间过流保护。原因:ADC采样点固定在PWM周期中点,低压时占空比小,下桥臂导通窗口变窄,中点可能已经落到上桥臂导通区,采到的电流不对。解决:按最低母线电压和最大调制比核算采样窗口,把ADC触发点往后挪,或者限制最小脉宽;如果还是不够,改用母线电流采样做启动段备份。定位时用示波器同时看PWM下桥臂驱动和ADC触发信号,确认触发点落在导通窗口内。
5.2 死区/载波配置导致的MOS发热
现象:空载运行几分钟MOS就烫,电流波形毛刺大。原因:死区时间小于MOS关断时间,上下桥有直通嫌疑;或者载波频率太高,开关损耗超预期。解决:先用示波器看互补PWM死区,确认没有重叠;再按MOS规格书核算开关损耗,载波从16kHz降到10kHz对比温升。死区不是越大越好,大了低速电流失真,要配合死区补偿一起看。定位顺序是先看驱动波形,再看相电流,最后看温升,别一上来就改电流环。
5.3 速度反馈对不上与Q格式溢出
现象:给定1000rpm,实际显示950rpm,加载后偏差更大;或者转速显示偶尔跳变。原因:速度基准变量没初始化、单位换算漏了极对数、速度滤波太长,或者Q格式中间结果溢出。解决:把速度原始计数、换算后转速、标幺值同时打印,先确认原始计数对不对;再检查speed_base_rpm有没有赋值;最后把中间乘法改成int32_t并做饱和。自己加的变量一定要在初始化函数里赋默认值,别指望编译器清零。
5.4 预定位过流和顺逆风误判
现象:预定位阶段就触发过流,或者风机反转时启动炸管。原因:预定位电流按有效值给成了峰值,实际电流翻倍;顺逆风检测窗口太短,反电势还没建立就判断为顺风。解决:预定位电流从额定峰值20%起步,时间200ms起,重载分段加;顺逆风检测窗口按反电势周期调,反转速度超过阈值先制动或等待。调试时把预定位电流和母线电流一起采,确认软件给定和实际电流对得上。
5.5 保护参数误动和故障掩盖
现象:启动瞬间欠压保护,或者堵转后自动重试反复冲击。原因:欠压滤波太短,启动瞬间母线跌落被当成故障;故障重试次数设太多,现场问题被掩盖。解决:启动阶段单独设一档更宽的欠压阈值,滤波放到10ms以上;调试阶段把重试次数设0,先定位故障,量产再按负载决定是否重试。保护参数要分层,硬件比较器兜底,软件阈值可调,别把全部希望放在软件上。
6. 进阶验证与交付:用示波器、日志和边界测试锁参数
参数调到能转之后,还有一步不能省:边界验证。我一般按“低压—高压—满载—突加突卸—顺逆风—故障注入”的顺序走一遍,每步记录母线电压、相电流峰值、转速、MOS温度。示波器看三样:互补PWM死区、ADC触发点、相电流波形;串口日志看三样:速度给定/反馈、电流给定/反馈、故障码。两者对不上时,以示波器为准,日志只作趋势参考。
| 验证项 | 工具 | 通过标准 |
|---|---|---|
| 最低母线启动 | 直流电源 | 连续启动10次不失败 |
| 最高母线满载 | 功率计/热电偶 | 电流不超限,温升在规格内 |
| 突加负载 | 测功机/负载箱 | 转速跌落可恢复,不触发过流 |
| 顺逆风切换 | 风机台架 | 反转时先制动或等待,不炸管 |
| 故障注入 | 短接/断相 | 保护动作,故障码可读 |
日志打印别只打最终转速,把中间量一起打出来。比如下面这段,一次打印速度、电流、母线电压和状态机,出了问题能倒推。
printf("st=%d,tgt=%ld,act=%ld,iq=%d,iqref=%d,vbus=%d,fault=%d\r\n", (int)motor_state, (long)speed.target_rpm, (long)speed.actual_rpm, (int)iq_q15, (int)iq_ref_q15, (int)vbus_adc, (int)fault_code);这段打印的频率不要太高,10ms到50ms一次足够,太快会占用串口和CPU。字段顺序固定,方便用脚本画曲线。交付前把最终参数写成一张表:载波、死区、采样点、预定位电流/时间、切换转速、保护阈值、速度基准、Q格式定义。每个参数后面写一句“为什么是这个值”,下次换板子能快速判断哪些要重调。
血泪经验是:不要相信“上次这块板子就是这套参数”。FU68XX系列里FU6831和FU6832的外设资源、引脚定义可能不同,硬件采样链路一改,Q格式和采样点就要重算。从那以后我每次调新板子都强制先走一遍硬件基线核对,再跑空载,再带载,最后做宽压和顺逆风,参数表不填完不进量产。希望帮到你。
本文还有配套的精品资源,点击获取