[求教]FOC电机控制板的电源上电顺序不同会导致程序卡死
本帖最后由 NFYG2022 于 2024-6-18 22:31 编辑控制板上有12V的电机电源和3.3V的单片机电源
往常调试时,都先通3.3V单片机电源,再通12V电源(来自一个数字电源,稳定性有保证),此时没问题,电机的速度、位置闭环控制都很好。
今天在12V接通的情况下,拔了3.3V电源,然后再插上去。按照预期,单片断电再上电应当视为重启,但奇怪的是单片机直接卡死了。重新下载、3.3V电源重新上电都没用。
用LED点灯法发现卡死在某个函数里面(并非某个函数的问题,若交换代码的顺序,也会卡死在其他代码处),“卡死”并非进入了某个while循环,也没有反复进入中断,单纯就是程序执行完上一条语句后就不再继续执行,C程序只运行了开头的一小部分。
只有在断开12V电源的情况下,重新下载或3.3V上电才能恢复正常。
也就是说,貌似这上电顺序直接决定功能是否正常......这太奇怪了,有哪位大佬见过这种BUG吗? 电路上看看,12V电源的存在对单片机有什么改变了 在拔掉3.3V时接通12V,看看此时3.3V电源线上的电压是多少,应该是有电流从信号线窜进IO然后顺着芯片内部二极管上到电源导致MCU有一个不正常的电源电压 cne53102 发表于 2024-6-18 23:11
在拔掉3.3V时接通12V,看看此时3.3V电源线上的电压是多少,应该是有电流从信号线窜进IO然后顺着芯片内部二 ...
(引用自3楼)
3.3V断开,12V接通时,3.3V引脚读数为0
12V断开,3.3V接通时,12V引脚读数~2.3V 智涅 发表于 2024-6-18 22:52
电路上看看,12V电源的存在对单片机有什么改变了
(引用自2楼)
我猜有以下几种可能
没有区分功率地和数字地,有可能是通过地平面干扰的;
有3.3V的内电层,也可能是3.3V的内电层和不同层的12V相互干扰的(我已经特意让12V的线远离单片机了);
测试发现断开12V,接通3.3V时,12V引脚上会有~2.3V电压 NFYG2022 发表于 2024-6-18 23:49
3.3V断开,12V接通时,3.3V引脚读数为0
12V断开,3.3V接通时,12V引脚读数~2.3V
(引用自4楼)
那应该不是这个原因 贴下原理图或者框图?
在main函数第一行就弄循环闪烁灯,不会死机是吗?是的话就有一定条件,看初始化了啥导致 通过电机pwm口进来弱电了,一般是mcu复位问题,加一个电源监控芯片,让mcu保持复位。 按照你的说法复现率100%,不像是干扰,干扰不会100%复现。
软件问题的概率大。你把电机驱动部分都屏蔽掉,初始化成最小系统,干干净净的就点个灯试试。
有可能单片机复位不正常。 不是软件问题,是由于IO灌电,导致MCU内部有了电压,处于一种不正常的运行状态。一般叫做假跑 应该是11楼的原因;
12V电源干扰3.3V电源的可能性不大,用示波器抓一下上电时3.3V的波形就清楚了 yunqing_abc 发表于 2024-6-19 11:43
不是软件问题,是由于IO灌电,导致MCU内部有了电压,处于一种不正常的运行状态。一般叫做假跑 ...
(引用自11楼)
板子上主要有三部分
3.3V供电的单片机
12V供电的电机驱动芯片
12V驱动的三路NMOS半桥
其中单片机通过6路GPIO口向电机驱动芯片输出PWM控制信号,电机驱动芯片再控制三路NMOS半桥的通断
如果真是IO倒灌,那只能是通过6根PWM线了。
该怎么解决IO倒灌?给PWM线加个10ohm的限流电阻?还是串联个肖特基二极管?或者给电机驱动芯片的12V电源串联个NMOS,单片机掉电,NMOS自动关断? 智涅 发表于 2024-6-19 00:44
贴下原理图或者框图?
在main函数第一行就弄循环闪烁灯,不会死机是吗?是的话就有一定条件,看初始化了啥 ...
(引用自7楼)
单纯地LED闪烁不会死机,我逐个解除代码注释,发现只要定时器TIMER1的初始化代码被执行了,就会卡死。TIMER1用来输出6路PWM信号给电机驱动芯片(12V供电)。
具体的说,是TIMER1初始化代码中最后的PWM输出使能,一旦在通12V的情况下被执行了,就会卡死。
而且3.3V的MCU和12V的电机驱动芯片恰恰是通过6路PWM连接的,所以从软硬件的角度考虑,我猜根源就在这。
12V通电时,电机驱动芯片通过6路PWM对单片机存在干扰,如果此时单片机使能6路PWM输出,相当于给外部干扰开放通路,导致整个单片机卡死。 NFYG2022 发表于 2024-6-19 19:17
单纯地LED闪烁不会死机,我逐个解除代码注释,发现只要定时器TIMER1的初始化代码被执行了,就会卡死。TIM ...
(引用自14楼)
pwm芯片EN脚要由MCU控制 qwe2231695 发表于 2024-6-20 01:45
pwm芯片EN脚要由MCU控制
(引用自15楼)
用的邵峰的FD6288Q,没有使能引脚......看来只能在FD6288Q的供电口加NMOS了,用一个GPIO控制NMOS的通断 默认上电时浮空输入;
MCU上电时优先初始化6个PWM的GPIO,试一下初始化成下拉输出,或者下拉输入,看行不行? NFYG2022 发表于 2024-6-20 04:31
用的邵峰的FD6288Q,没有使能引脚......看来只能在FD6288Q的供电口加NMOS了,用一个GPIO控制NMOS的通断 ...
(引用自16楼)
MCU使用复位芯片,让mcu在VDD低于3.3V时保持复位试下 qwe2231695 发表于 2024-6-20 09:34
MCU使用复位芯片,让mcu在VDD低于3.3V时保持复位试下
(引用自18楼)
这个方案应该也可以。
上边说的找到IO灌电的来源,断开这个来源,也可以 Arm2048 发表于 2024-6-20 09:15
默认上电时浮空输入;
MCU上电时优先初始化6个PWM的GPIO,试一下初始化成下拉输出,或者下拉输入,看行不行 ...
(引用自17楼)
这倒是启发我了,既然能通过PWM口倒灌影响MCU内部,那我把引脚浮空就行了。
复位后GPIO是浮空输入模式(用的AT32F421),对MCU的VDD和VSS无法施加影响。
先初始化TIMER1,使能PWM输出(我猜测倒灌只发生在PWM使能后的一小段时间内),但不初始化GPIO,这样就算倒灌也不影响MCU内部。使能PWM输出后延时5ms,再初始化对应的GPIO为推挽输出。
试了下果然没有卡死(至少这十几分钟没有卡死......)
不过这只是从软件层面规避bug,倒灌毕竟还是存在的,硬件设计也要防范潜在的倒灌。 软件能解决最好,只要测试运行稳定,没必要搞硬件;
硬件的话,GPIO与6288之间加一片74HC244,或者做光耦隔离;
但我看到的应用电路都是直接GPIO驱动6288。
页:
[1]