打印
[STM32F4]

TIM1 高级定时器 4路控制信号 驱动步进电机

[复制链接]
楼主: tcdbobo
手机看帖
扫描二维码
随时随地手机跟帖
21
tcdbobo|  楼主 | 2019-6-11 11:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
香水城 发表于 2019-6-10 16:35
从你的截图看,你的工程文件似乎并不是从CUBEMX基于cube库生成的。

问题解决了,方法是在main.c中声明extern DMA_HandleTypeDef hdma_tim1_ch1; extern DMA_HandleTypeDef hdma_tim1_ch2;extern DMA_HandleTypeDef hdma_tim1_ch3;然后编译就没有错误了,感谢您的帮助!

使用特权

评论回复
22
tcdbobo|  楼主 | 2019-6-11 11:32 | 只看该作者
香水城 发表于 2019-6-10 16:35
从你的截图看,你的工程文件似乎并不是从CUBEMX基于cube库生成的。

关于keil里仿真的问题,我在setup logic analyzer里增加变量总是失败,总是提示我是未知信号,但是您在**中是可以用keil logic analyzer看仿真图形的,您截图里的信号名称我看写的是Bit_Ch1
Bit_Ch2    Bit_Ch3   Bit_Ch4.请问是需要在程序的哪里单独声明一下吗?

仿真.jpg (305.06 KB )

仿真.jpg

仿真1.jpg (134.62 KB )

仿真1.jpg

使用特权

评论回复
23
香水城| | 2019-6-11 22:20 | 只看该作者
本帖最后由 香水城 于 2019-6-12 11:37 编辑
tcdbobo 发表于 2019-6-11 11:32
关于keil里仿真的问题,我在setup logic analyzer里增加变量总是失败,总是提示我是未知信号,但是您在文 ...

这个IDE自带的分析仪实在玩不转也没关系。 算是另外一个内容,跟你本贴没多少关系了。
直接用示波器看一样的,效果更好。

我那里的BIT_Ch1/2/3是几个随手定义的全局变量而已。

这里有篇关于这个IDE逻辑分析仪的介绍。有兴趣的话可以看看下面这篇:【临时链接,有效期好像12小时】

两个STM32开发中基于MDK IDE的调试输出技巧


使用特权

评论回复
24
tcdbobo|  楼主 | 2019-6-13 08:32 | 只看该作者
香水城 发表于 2019-6-11 22:20
这个IDE自带的分析仪实在玩不转也没关系。 算是另外一个内容,跟你本贴没多少关系了。
直接用示波器看一样 ...

好勒!受益匪浅!

使用特权

评论回复
25
tcdbobo|  楼主 | 2019-6-14 15:21 | 只看该作者
本帖最后由 tcdbobo 于 2019-6-14 15:25 编辑
香水城 发表于 2019-6-11 22:20
这个IDE自带的分析仪实在玩不转也没关系。 算是另外一个内容,跟你本贴没多少关系了。
直接用示波器看一样 ...

可以发贴了吗?刚才不知道怎么回事,发帖失败!只能把想请教的问题发在截图中,麻烦您帮忙看一下。谢谢

TIM图片.png (97.01 KB )

TIM图片.png

ERROR.jpg (333.64 KB )

ERROR.jpg

RIGHT.jpg (278.8 KB )

RIGHT.jpg

使用特权

评论回复
26
tcdbobo|  楼主 | 2019-6-17 11:35 | 只看该作者
香水城 发表于 2019-6-11 22:20
这个IDE自带的分析仪实在玩不转也没关系。 算是另外一个内容,跟你本贴没多少关系了。
直接用示波器看一样 ...

打扰您了,可否把源码发我一份,我已给您邮箱留言!谢谢!

mail.jpg (72.2 KB )

mail.jpg

使用特权

评论回复
27
香水城| | 2019-6-17 14:25 | 只看该作者
tcdbobo 发表于 2019-6-17 11:35
打扰您了,可否把源码发我一份,我已给您邮箱留言!谢谢!

1、你的邮箱好像接收不了,总是被打回来;
2、按理说你应该没问题了。如果是那个仿真的逻辑分析仪的使用,我的代码里也帮不了你。
要在MDK环境下 做些适当配置。关于如何配置,上面也告知你了。

使用特权

评论回复
28
木木guainv| | 2019-6-17 15:04 | 只看该作者
如看天书啊

使用特权

评论回复
29
tcdbobo|  楼主 | 2019-6-18 09:08 | 只看该作者
香水城 发表于 2019-6-17 14:25
1、你的邮箱好像接收不了,总是被打回来;
2、按理说你应该没问题了。如果是那个仿真的逻辑分析仪的使用 ...

我有一个OUTlook的邮箱,yueqizhang123@outlook.com,您可以发一次试试吗?如果再不行,就算了,麻烦您了。

使用特权

评论回复
30
tcdbobo|  楼主 | 2019-6-19 16:54 | 只看该作者
香水城 发表于 2019-6-3 12:06
你可以到这个链接看看。

STM32定时器比较输出切换模式之应用实例STM32定时器比较输出切换模式之应用实例 ...

老师您好,现在的问题是,单独用GPIO发脉冲的方式,可以驱动步进电机。程序部分截图见附图,我分析原因是单独GPIO发脉冲,程序中每变换一拍中间有10ms的延时(图1:程序已用红色标注)。但是换成TIM1的输出比较模式加PWM,虽然可以同样产生波形一样的4路控制信号(附件图2:是您帖子的截图),但是延时函数没法加进去,导致电机无法旋转,我分析原因是不是波形变换的太快了,电机里的转子还没来的及变换就进去到下一拍中了,想问您有没有什么解决的办法,是在cubeMX里设置,还是需要程序里改动一下,请您帮忙回答一下。

图1 八拍脉冲控制程序截图.jpg (137.68 KB )

图1 八拍脉冲控制程序截图.jpg

图2.jpg (127.56 KB )

图2.jpg

使用特权

评论回复
31
tcdbobo|  楼主 | 2019-6-27 15:43 | 只看该作者
香水城 发表于 2019-6-17 14:25
1、你的邮箱好像接收不了,总是被打回来;
2、按理说你应该没问题了。如果是那个仿真的逻辑分析仪的使用 ...

老师您好 ,最近在修改程序,我把最后的/B路,也采用比较输出切换模式,程序编译没错,但是下载以后,用示波器观察发生波形不对,我把程序截图发上来,您帮忙给看一下,是哪里出了问题。
计算周期还是每记800个时钟单位为1个计数周期。【向上计数模式,ARR=800-1】附件有cubeMX的截图


uint16_t Data1_to_Comp[]={199,699};  //ch1
uint16_t Data2_to_Comp[]={599,299}; //ch2
uint16_t Data3_to_Comp[]={399,99}; //ch3
uint16_t Data4_to_Comp[]={799,499}; //ch4


__HAL_TIM_DISABLE_OCxPRELOAD(&htim1, TIM_CHANNEL_1);
__HAL_TIM_DISABLE_OCxPRELOAD(&htim1,TIM_CHANNEL_2);
__HAL_TIM_DISABLE_OCxPRELOAD(&htim1, TIM_CHANNEL_3);
__HAL_TIM_DISABLE_OCxPRELOAD(&htim1, TIM_CHANNEL_4);


TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_1, TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_2, TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_3, TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_4, TIM_CCx_ENABLE);

hdma_tim1_ch1.State = HAL_DMA_STATE_READY;
HAL_DMA_Start(&hdma_tim1_ch1,(uint32_t)Data1_to_Comp, (uint32_t)&TIM1->CCR1, 2);
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC1);


  hdma_tim1_ch2.State= HAL_DMA_STATE_READY;
HAL_DMA_Start(&hdma_tim1_ch2, (uint32_t)Data2_to_Comp, (uint32_t)&TIM1->CCR2,2);
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC2);


  hdma_tim1_ch3.State= HAL_DMA_STATE_READY;
HAL_DMA_Start(&hdma_tim1_ch3, (uint32_t)Data3_to_Comp,(uint32_t)&TIM1->CCR3, 2) ;
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC3);

hdma_tim1_ch4_trig_com.State= HAL_DMA_STATE_READY;
HAL_DMA_Start(&hdma_tim1_ch4_trig_com, (uint32_t)Data4_to_Comp,(uint32_t)&TIM1->CCR4, 2) ;
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC4);

特别说明一下这里的CH4 是hdma_tim1_ch4_trig_com,其他3个通道都是 hdma_tim1_chX
trig_com 这个尾椎是cubeMX里自己生成的名称。
附图有cubeMX配置截图


最后的2张照片,是我用手机拍照的,下载程序以后,产生的错误的波形,以及上次没改程序以后正确的波形。



波形图.jpg (140.86 KB )

波形图.jpg

cubeMX配置图1.jpg (171.47 KB )

cubeMX配置图1.jpg

cubeMX配置图2.jpg (235.89 KB )

cubeMX配置图2.jpg

cubeMX配置图DMA.jpg (269.93 KB )

cubeMX配置图DMA.jpg

错误波形.jpg (261.67 KB )

错误波形.jpg

正确波形.jpg (246.62 KB )

正确波形.jpg

使用特权

评论回复
32
香水城| | 2019-6-27 23:27 | 只看该作者
是的,这个初始化配置没问题了,另外一个地方呢,那个放CCR值内存数组里的数据对了吗?
参照我的代码好好琢磨下。

使用特权

评论回复
33
tcdbobo|  楼主 | 2019-6-28 08:59 | 只看该作者
香水城 发表于 2019-6-27 23:27
是的,这个初始化配置没问题了,另外一个地方呢,那个放CCR值内存数组里的数据对了吗?
参照我的代码好好琢 ...



老师您好,我的/B通道的数组里放的是uint16_t Data4_to_Comp[]={799,499}; //ch4,请看附图那个时序图,我标记出来。感觉也没什么问题,但是下载程序后,用示波器看就是不对。


uint16_t Data1_to_Comp[]={199,699};  //ch1

uint16_t Data2_to_Comp[]={599,299}; //ch2
uint16_t Data3_to_Comp[]={399,99}; //ch3


波形图.jpg (140.86 KB )

波形图.jpg

使用特权

评论回复
34
gyh974| | 2019-6-28 09:11 | 只看该作者
楼主,版主的源码可否共享一下,我也遇到同样的问题了,谢谢
gyh974@21cn.com

使用特权

评论回复
35
tcdbobo|  楼主 | 2019-6-28 09:19 | 只看该作者
gyh974 发表于 2019-6-28 09:11
楼主,版主的源码可否共享一下,我也遇到同样的问题了,谢谢

代码我这也没有,我也是通过**链接修改自己的代码。现在发个链接给你,**里面有详细的说明,希望你用的上。

STM32定时器比较输出切换模式之应用实例STM32定时器比较输出切换模式之应用实例
https://mp.weixin.qq.com/s?__biz=MzA3OTIxMjQyNQ==&mid=2650948596&idx=1&sn=fe86fff385b6c3be70eed2339eb30ef7&chksm=84401912b337900499cde3684d93471fcd8059fa6925adec3faf395257a41624412326ec47b4&token=1585779800&lang=zh_CN#rd

使用特权

评论回复
36
tcdbobo|  楼主 | 2019-6-28 09:20 | 只看该作者
gyh974 发表于 2019-6-28 09:11
楼主,版主的源码可否共享一下,我也遇到同样的问题了,谢谢

如果链接看不了的话,可以尝试搜一下。“STM32定时器比较输出切换模式之应用实例”关键字,应该会找到。

使用特权

评论回复
37
tcdbobo|  楼主 | 2019-6-28 10:33 | 只看该作者
香水城 发表于 2019-6-3 12:06
你可以到这个链接看看。

STM32定时器比较输出切换模式之应用实例STM32定时器比较输出切换模式之应用实例 ...

老师您好,我按照论坛里您发的**,重新看了一遍,我发现了一个新问题,就是当我把/B这路通道,也就是用PWM模式配置的这个通道4,在程序里屏蔽HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);这句话 。然后再次用示波器看其他3路.发现通道1/通道2/通道3,这3路管脚都没有波形输出了,请问这是怎么回事。麻烦您帮忙回答一下。谢谢!

图1.jpg (210.47 KB )

图1.jpg

图2.jpg (211.53 KB )

图2.jpg

图3.jpg (82.62 KB )

图3.jpg

使用特权

评论回复
38
tcdbobo|  楼主 | 2019-6-28 11:21 | 只看该作者
本帖最后由 tcdbobo 于 2019-6-28 11:29 编辑
香水城 发表于 2019-6-27 23:27
是的,这个初始化配置没问题了,另外一个地方呢,那个放CCR值内存数组里的数据对了吗?
参照我的代码好好琢 ...

老师您好,我找到问题了。
原因是:不能屏蔽这句话 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);加上这句话就有波形输出了。没有这句话波形就不对,跟CCR的值没有关系,CCR值是正确的。就是因为之前把这句话删掉了。但是我不知道是为什么?明明CH4已经改用oc模式输出了,但是为什么还得加上这句hal_tim_pwm_start()这个函数呢,请老师帮忙回答一下。谢谢。

程序截图.jpg (258.66 KB )

程序截图.jpg

CH4.jpg (215.02 KB )

CH4.jpg

使用特权

评论回复
39
香水城| | 2019-6-28 11:48 | 只看该作者
四个通道都使用OC toggle也是完全可以的。当初我设计第4个通道时是使用的PWM输出模式,
所以才有HAL_TIM_PWM(&tim1,TIM_CHANNEL_4);这句函数代码。

现在你将第4个通道也改为OC输出了,上面那句就可以了,不过该句还有个功能,就是启动定时器TIM1和使能主输出MOE的功能。
你如果屏蔽了该句就没法启动TIM1了。所以你屏蔽该句的PWM功能同时,记得使能TIM1的计数器CEN以及主输出MOE控制位。

/* Enable the main output */
    __HAL_TIM_MOE_ENABLE(&htim1);
  /* Enable the Peripheral */
  __HAL_TIM_ENABLE(&htim1);

结合手册,把代码看懂。

使用特权

评论回复
40
tcdbobo|  楼主 | 2019-7-1 09:30 | 只看该作者
香水城 发表于 2019-6-28 11:48
四个通道都使用OC toggle也是完全可以的。当初我设计第4个通道时是使用的PWM输出模式,
所以才有HAL_TIM_PW ...

明白,谢谢您!

使用特权

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

本版积分规则