|
【问题描述】 使用 MotorControl Workbench 6.4.1 生成 FOC 项目代码后,下载到开发板运行即死机 ,无法正常启动。 【硬件环境】
【期望】 希望能得到:
|
keil有什么调试方法可以追踪链表被破坏的地方吗
无法通过 SPI 读取 TCD1304数据
stm32L0单片机电源管脚对地电阻异常
stm32H745 M4核不能调试和下载
F407的SDIO的硬件分流问题
stm32h745 调试问题
workbench5.3.1生成代码问题
定时器输出PWM控制电机的问题
继续尝鲜 STM32CubeAI Studio
STLink下载程序失败,Flash部分地址不能写入
微信公众号
手机版
怎么个死机法?有按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驱动调试问题,欢迎留言一起讨论。