打印
[STM32F1]

STM32步进电机S型加减速算法

[复制链接]
楼主: cry1109
手机看帖
扫描二维码
随时随地手机跟帖
21
cry1109 发表于 2020-5-10 08:34
你程序里用不到的变量可以删掉,比如所那个extern FLAG_TYPEDEF gFlag,如果移植过程中你发现有变量未定 ...

math.h 包含到motor_cntorl.c里后,warning就没有了。

但是我看到程序里 这个extern FLAG_TYPEDEF gFlag 在下面的状态机里的程序里有涉及到。
请教您一下。是不是不能随便就删掉呀。
已经截图在下面,红色线标出。

状态机.jpg (231.76 KB )

状态机.jpg

使用特权

评论回复
22
cry1109|  楼主 | 2020-5-12 09:08 | 只看该作者
tcdbobo 发表于 2020-5-11 08:52
math.h 包含到motor_cntorl.c里后,warning就没有了。

但是我看到程序里 这个extern FLAG_TYPEDEF gFlag ...

这个gFlag是一个全局的标志。gFlag.MotorActiveEnable是电机动作使能的标志,置1后电机开始动作,电机状态机从空闲状态跳到加速状态,开始运动。你自己的程序你可以用其他标志触发电机动作,刚开始调试的时候可以把整个电机运动拆开玩,比如说先调加速部分。(ps:程序开发过程中有时候经常会移植其他的程序,移植过来并不是说直接把代码粘贴复制过来或者把源文件加到自己工程中就ok了,你需要弄明白别人的代码思路、结构、原理等等,把别人的东西变成自己的,就是一种提高的过程。)

使用特权

评论回复
23
tcdbobo| | 2020-5-12 14:28 | 只看该作者
cry1109 发表于 2020-5-12 09:08
这个gFlag是一个全局的标志。gFlag.MotorActiveEnable是电机动作使能的标志,置1后电机开始动作,电机状 ...

受教了。谢谢!

使用特权

评论回复
24
tcdbobo| | 2020-5-13 15:51 | 只看该作者
本帖最后由 tcdbobo 于 2020-5-13 15:56 编辑
cry1109 发表于 2020-5-12 09:08
这个gFlag是一个全局的标志。gFlag.MotorActiveEnable是电机动作使能的标志,置1后电机开始动作,电机状 ...

请问,可以看一下您程序main.c里的代码是怎么调用的吗?我现在是这样写的,见截图!编译没有错和警告,但是下载后,用示波器观察PA2(我的cubeMX里用的是TIM9_CH1),没有PWM输出,就是一直低电平输出。

于是我在main.c里加上了一句
HAL_TIM_PWM_Start(&htim9,TIM_CHANNEL_1);在看PA2,发现一直高电平输出。

在while(1)之前开启TIM6的定时器中断  THAL_TIM_Base_Start_IT(&htim6);

所以想问一下,是不是main.c里写的不对,想参考一下您的main.c是怎么写的。






main.jpg (440.21 KB )

main.jpg

cubeMX.jpg (271.38 KB )

cubeMX.jpg

PA2.jpg (421.42 KB )

PA2.jpg

使用特权

评论回复
25
cry1109|  楼主 | 2020-5-13 17:10 | 只看该作者
tcdbobo 发表于 2020-5-13 15:51
请问,可以看一下您程序main.c里的代码是怎么调用的吗?我现在是这样写的,见截图!编译没有错 ...

状态机里idle状态下把HAL_TIM_PWM_Stop_IT(&htim1, TIM_CHANNEL_1)改成HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1),以中断的方式开启PWM输出。我在上传文件时改错函数了。

使用特权

评论回复
26
中西部牛仔| | 2020-5-13 22:18 | 只看该作者
谢谢楼主分享

使用特权

评论回复
27
tcdbobo| | 2020-5-14 08:45 | 只看该作者
本帖最后由 tcdbobo 于 2020-5-14 08:47 编辑
cry1109 发表于 2020-5-13 17:10
状态机里idle状态下把HAL_TIM_PWM_Stop_IT(&htim1, TIM_CHANNEL_1)改成HAL_TIM_PWM_Start_IT(&htim1, TIM ...

现在出PWM了,但是频率是恒定的,没有变化。请详见截图!!!   我的做法是在main.c文件里while(1)前,把gFlag.MotorActiveEnable =1;(初始赋值1)我试过不加上这句话,就没有PWM输出。
另外我把状态机 Focus_StateMachine()这个函数也放在while(1)前面,没有让它循环执行,结果就是有波形输出了。如果放在while(1)里就没有波形输出。所以不知道您的main.c程序是怎么写的,这几个函数是如何调用的。另外SpeedAdjust_ModeS()这个函数,我看是包在状态机Focus_StateMachine()的。所以我在main.c里就没有调用【现实是我尝试在main.c里加上了一句SpeedAdjust_ModeS(500)】。结果导致没有任何波形输出。

另外最后还想问一下,您博客最一开始那个“程序一共用到2个定时器,一个出PWM ,另一个是开启定时中断用于算法的实现”。我这里用的是TIM6基础定时器,在main.c里就是简单调用了一下,HAL_TIM_Base_Start_IT(&htim6);还是需要写个中断回调函数吗?

修改.jpg (417.28 KB )

修改.jpg

PWM.jpg (409.21 KB )

PWM.jpg

使用特权

评论回复
28
cry1109|  楼主 | 2020-5-14 09:22 | 只看该作者
tcdbobo 发表于 2020-5-14 08:45
现在出PWM了,但是频率是恒定的,没有变化。请详见截图!!!   我的做法是在main.c文件里whi ...

程序已经用到公司的产产品里了,所以不方便贴出来。两个定时器,一个定时器用于产生PWM输出,也就是你的tim9,同时要开启脉冲输出完毕中断HAL_TIM_PWM_PulseFinishedCallback(),这个中断用于PWM脉冲个数计数,每发一个脉冲后进入一次该中断,脉冲计数值+1。另一个定时器,也就是你的tim6开启定时器中断,中断周期可以为500us、1ms、100ms等等,在tim6的定时中断里调用电机控制器状态机,每进入一次定时中断,执行一次状态机,状态机根据当前状态执行电机的加速、匀速、减速动作,例如当前加速状态,进入一次状态机后执行一次电机加速动作。gFlag.MotorActiveEnable 是电机开始动作的一个标志,如果为1,状态机由空闲状态跳到加速状态开始执行加速动作,如果为0状态机一直处于空闲状态,此时当然没有PWM输出。另外你用于PWM输出的定时器的ARR寄存器、CCR寄存器都要使能预重载寄存器(影子寄存器)。电机的加速机制,开启PWM输出后,如果当前处于加速状态,那么在状态机里每调用一次SpeedAdjust_ModeS函数频率就增加一次。我解释的很详细了,如果你还搞不出来,我建议你先把这个S型加减速放一放,先把定时器的PWM玩熟,把程序的状态机理解清楚,状态机是怎么执行的?各状态之间是怎么跳转的?然后再回过头来看看这个S型加减速。

使用特权

评论回复
29
cry1109|  楼主 | 2020-5-14 09:33 | 只看该作者
tcdbobo 发表于 2020-5-14 08:45
现在出PWM了,但是频率是恒定的,没有变化。请详见截图!!!   我的做法是在main.c文件里whi ...

再提个建议,遇到问题先别想着询问别人,自己动手改一改程序,你有板子、有示波器,装备齐全,想咋玩就咋玩,如果你怕程序改的自己不认得出错了没法恢复了,那就备份一份,实在改不出来后再来网上求助。刚学单片机时看别人的代码是很麻烦,看不懂、试验现象不符合自己预期,这些都是学习过程中必须经历的过程,这个过程很痛苦,这时候需要你静下心来狠着把代码看完。

使用特权

评论回复
30
tcdbobo| | 2020-5-14 10:40 | 只看该作者
cry1109 发表于 2020-5-14 09:33
再提个建议,遇到问题先别想着询问别人,自己动手改一改程序,你有板子、有示波器,装备齐全,想咋玩就咋 ...

非常感谢!我先从定时器的PWM那块入手,靠谱点!

使用特权

评论回复
31
1061341090| | 2020-7-23 16:50 | 只看该作者
感谢,这是我看过有关S型加减速控制最好理解的**。

使用特权

评论回复
32
raohuayun| | 2020-8-27 16:25 | 只看该作者
不错,如果有个工程代码会更容易上手

使用特权

评论回复
33
yuchl| | 2022-7-13 22:20 | 只看该作者
收藏

使用特权

评论回复
34
PeerS01| | 2022-8-17 09:06 | 只看该作者
算法思路很好,但是如果我想实时获取到已发脉冲数量,不知道该怎么实现

使用特权

评论回复
35
PeerS01| | 2022-8-17 09:07 | 只看该作者
或者有大神知道类似于plc得脉冲定位指令比如drva,plsr,加减速可调,定位脉冲数,脉冲频率可调得实现思路吗?

使用特权

评论回复
36
duo点| | 2022-8-17 11:07 | 只看该作者
学习了,感谢分享,但这种算法在什么情况下更可取了

使用特权

评论回复
37
yiy| | 2022-8-18 10:44 | 只看该作者
感谢分享

使用特权

评论回复
38
Uriah| | 2022-10-1 08:07 | 只看该作者

编程器定位插字节

使用特权

评论回复
39
Bblythe| | 2022-10-1 11:06 | 只看该作者

利用协议、加密算法或这些算法中的安全漏洞来进行攻击

使用特权

评论回复
40
tc793069303| | 2022-10-9 09:24 | 只看该作者
太有用了 赞一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则