|
【问题描述】 使用 MotorControl Workbench 6.4.1 生成 FOC 项目代码后,下载到开发板运行即死机 ,无法正常启动。 【硬件环境】
【期望】 希望能得到:
|
STM32F405ZGT6 批次22+ 问下这颗料,60度烘烤12小时后,出现鼓包,是怎么回事? 原厂有标准的烘烤温度范围 跟时长范围吗?
非官方开发板第一次下载成功,之后就各种失败
STM32H5F/E 相比 STM32F4 系列最大的优势是什么?
ST TOF问题请教
STM32G431 用MCSDK5.4.8 进行PMSM永磁同步电机FOC控制,转速上升到某一值(3500rpm)无法继续上升,上不去
STM32F4的SPI端口,如何实现多通道输入?
STM32F4标准库USB例程CDC_HID_Composite问题:第一次识别成功,后续插入电脑均识别失败
STM32F407 Flash 故障
STM32F407使用LAN8720A进行网口通信
USBX在F407上创建CDC不能正常使用
微信公众号
手机版
怎么个死机法?有按USER按键启动吗?默认代码是需要按按键启动的
可以的话使用Pilot工具连接、看看报错,这样盲目调试没办法定位到问题所在
你这太笼统了
这怎么分析
太笼统了 没有代码结构 甚至都分不清到底是死机了 还是因为没有强拖转动导致霍尔检测不到反电动势 导致的停转
那样的话 推一下应该转了 还有就是 有些使用的是六步方波序列换相 要看换相顺序错了没有
最好是先用正点原子的尝试 电机参数不一样可能也很难转 还有就是输出的频率 正点原子应该会给你一套可以验证的代码,先尝试去使用原有的 再对比看移植过程有什么问题
[md]可以加您一个联系方式嘛,一起讨论一下技术tabuxxwol这是v,有什么不明白一起探讨一下
r3_2_f4xx_pwm_curr_fdbk.c文件的以下while循环无法退出:while ((TIMx->CNT) < (pHandle->pParams_str->Tw)){ / wait for a maximum delay /}复制代码核心异常点:1. TIMx->CNT是16位PWM计数器,最大值约8400 ticks(由20kHz PWM频率 + 168MHz定时器时钟计算得出);2. 工具生成的Tw参数值却为65503;3. 因8400永远小于65503,循环条件恒成立,程序彻底死锁。二、问题根因:界面参数配置不匹配 + 无符号数溢出本次问题的核心是STMC Board Designer两个关键配置页面的参数不兼容,以下是具体溯源和计算过程。1. 错误的界面配置参数(附截图)问题源于Phase Voltage Generation和Current Sensing两个页面的参数搭配错误,关键配置如下:Phase Voltage Generation页面:TNoise=50ns、Dead Time=300ns、驱动ATK_PD6010B+MOS管IRFS3607PBFCurrent Sensing页面:TRise_NS=120ns、ADC_SAMPLING_CYCLES=15、ADC_CLK=21MHz、高级定时器时钟=168MHz这些参数会被工具自动写入power_stage_parameters.h头文件:#define TRISE_NS 120#define TNOISE_NS 50#define HW_DEAD_TIME_NS 300#define ADV_TIM_CLK_MHz 168#define ADC_CLK_MHz 21#define ADC_SAMPLING_CYCLES 15复制代码2. 工具生成代码的时序计算过程MC Workbench自动生成的时序计算逻辑存在无符号数溢出风险,步骤如下:Step 1:计算TW_AFTER(有效采样起始点)#define TW_AFTER ((uint16_t)(((HW_DEAD_TIME_NS + TRISE_NS) ADV_TIM_CLK_MHz) / 1000UL))// 代入值:(300 + 120) 168 / 1000 = 70.56 → 取整71 ticks复制代码Step 2:计算SAMPLING_TIME(ADC采样所需时钟)#define SAMPLING_TIME ((ADC_SAMPLING_CYCLES ADV_TIM_CLK_MHz) / ADC_CLK_MHz)// 代入值:15 168 / 21 = 120 ticks复制代码Step 3:计算MAX_TWAIT (Tw)(采样等待窗口,核心溢出点)#define MAX_TWAIT ((uint16_t)((TW_AFTER - SAMPLING_TIME) / 2))// 代入值:(71 - 120) / 2 = -24.5 → 取整-24// 关键错误:uint16_t无符号类型将-24溢出为65512!复制代码3. 死循环触发逻辑- 工具生成的Tw=65512(溢出后的极大值);- TIMx->CNT最大值仅8400 ticks(168e6 / 20e3 = 8400);- 循环条件TIMx->CNT < 65512永远为真,程序卡死。三、根本原因总结界面参数不匹配:配置的TW_AFTER(71) < SAMPLING_TIME(120),导致减法结果为负;代码类型缺陷:工具生成代码使用uint16_t存储计算结果,负数直接溢出为大正数;工具无校验:MC Workbench未对时序参数的合法性做前置检查,放任非法值生成。四、解决思路与方法针对该问题,有3种可落地的解决方式,优先推荐第一种:1. 调整MC Workbench界面参数(最直接) - 方案A:在Current Sensing页减小ADC_SAMPLING_CYCLES,如改为3,此时SAMPLING_TIME=24 ticks,71>24,计算结果为正; - 方案B:在Phase Voltage Generation页适当增大Dead Time,提高TW_AFTER值; - 核心原则:确保TW_AFTER > SAMPLING_TIME。2. 修复工具生成的代码逻辑 - 中间计算步骤改用int32_t有符号类型; - 添加保护判断,若TW_AFTER <= SAMPLING_TIME,直接触发报错并停止执行。3. 生成代码后人工校验(必做) - 打印TW_AFTER、SAMPLING_TIME、Tw三个核心变量; - 核对PWM频率与定时器时钟计算出的CNT最大值,确保Tw在合理范围内。五、经验教训1. 使用MC Workbench 6.4.1配置FOC参数时,TNoise、TRise、Dead Time、ADC采样周期是强关联参数,需整体匹配,不可孤立配置;2. 工具生成的代码并非绝对可靠,核心时序计算必须人工复核;3. 无符号数减法是嵌入式开发的高频坑点,涉及数值计算时优先使用有符号类型做中间处理。希望这个踩坑记录能帮到同样使用MotorControl Workbench 6.4.1的小伙伴,避免在时序配置上踩雷!如果有其他FOC驱动调试问题,欢迎留言一起讨论。