ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

FOC电调Debug笔记1——ADC电流检测遇到的问题与解决方法

FOC电调Debug笔记1——ADC电流检测遇到的问题与解决方法

一.电流检测芯片虚焊与损坏

1.问题的发现

电调上电后,观察到电流检测功能使能失败告警。断点调试后发现,问题出在上电首次电流检测ADC值没有落在中点附近。
(ADC范围为0~4095,对应电流范围为-165A~+165A。正常上电时电流应处于0A左右,对应ADC取值2048左右)

2.解决思路

可以看到A相与B相的值是正常处于2048附近的,可以推断代码应该是没问题的,考虑硬件问题。结合之前遇到过stm32引脚虚焊导致spi通信不正常的经历,猜想是INA181A1的引脚虚焊导致的问题。于是重新对C相的INA181A1进行上锡。

重新测试一遍仍发现值不正常,遂更换一片新的INA181A1。再测试显示结果正常,上电使能通过。

二.电流检测波形杂乱

1.问题分析

上一个问题解决后,用上位机观察电流检测三相电流波形,发现十分杂乱。

从图中还是可以看出三相数据具有120度相位差的特征,且电机能正常转动。

把波形图和现象丢给AI,AI分析说可能是电流采样时机不对。

原电流采样代码采用软件触发采样,在主循环中每循环一次调用一次Read_Current(),即采样一次。这样导致采样的时机不在定时器的同一时刻,每次采样时的三相MOS管导通情况都不同。

2.解决思路

采用ADC注入组+定时器触发采样的方法:

(1)在产生PWM信号的定时器再开一个通道,设为输出比较模式(Frozen),设其CCR=ARR;

(2)设置ADC注入组的触发源为Time 1 Capture Compare 4 event(CC4事件),触发信号沿为上升沿;

(3)当CNT等于ARR时,TIM1的通道4产生CC4事件,触发ADC注入组采样与转换,这样每次调用Read_Current()得到的电流结果都是在指定时刻采样得到的,可以采集到三相MOS下管导通时的电流,这正是我们想要的。

但又出现了个新问题。

三.ADC注入组无法被正常触发采样

1.问题的发现

设置了ADC注入组+定时器触发采样后,上电又发现电流检测功能使能失败告警。

断点调试发现,FOCfunc.c:Read_ADC3()中st = HAL_ADCEx_InjectedPollForConversion(&FOC_ADC, ADC_READ_TIMEOUT);等待整个注入序列结束超时。

2.第一次尝试解决

根据AI的建议,把TIM1通道4改为PWM Generation No Output模式(PWM Mode 1),但还是等待整个注入序列结束超时。

用__HAL_TIM_GET_COUNTER(&htim1)检查定时器是否正常计数,调试显示CNT的值一直在变化,说明定时器计数正常。
把调试结果告诉AI,AI给出了几个不太可能的原因。

3.第二次尝试解决

在AI回答的长篇大论中的一个不起眼的角落,我注意到了它给出的一个推断:

想了一下确实有可能,于是我把CCR调到790,结果成功触发ADC采样与转换!

以下是采集到的三相正弦电流波形:

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进