野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24666|回复: 20

关于STM32定时器发送脉冲

[复制链接]
发表于 2021-2-22 10:59:47 | 显示全部楼层 |阅读模式
关于STM32定时器发送脉冲,STM32如何才能同时发送4路不同频率,不同数目的脉冲呢?我用定时器+DMA这种方法控制4个步进电机时,第一个电机和第四个电机之间还是有时间间隔,跑个2分钟位置就乱了,做不到同步啊
224.jpg
回复

使用道具 举报

发表于 2021-2-22 22:39:52 | 显示全部楼层
可以参考下野火的电机教程,那一堆例程里面有一个同时控制四轴步进不同速度旋转的例程,或许会有些帮助
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 08:54:33 | 显示全部楼层
ZZZ_XXJ 发表于 2021-2-22 22:39
可以参考下野火的电机教程,那一堆例程里面有一个同时控制四轴步进不同速度旋转的例程,或许会有些帮助 ...

好的,感谢回复了
回复 支持 反对

使用道具 举报

发表于 2021-2-25 15:41:26 | 显示全部楼层

一个定时器有多个通道的,你可以同时启用多个定时器的多个通道,分别配置PWM波形就好了。感觉用不到DMA。(拙见)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-25 19:31:25 | 显示全部楼层
美羊羊是公羊 发表于 2021-2-25 15:41
一个定时器有多个通道的,你可以同时启用多个定时器的多个通道,分别配置PWM波形就好了。感觉用不到DMA。 ...

都是这个脉冲数量和频率怎么设置?比较输出模式倒是可以输出不同频率不同占空比的PWM,可是脉冲数怎么控制呢?
回复 支持 反对

使用道具 举报

发表于 2021-2-26 08:41:14 | 显示全部楼层
白纸扇001 发表于 2021-2-25 19:31
都是这个脉冲数量和频率怎么设置?比较输出模式倒是可以输出不同频率不同占空比的PWM,可是脉冲数怎么控 ...

没有太理解你的意思,为什么要计脉冲数啊,可以再详细点描述吗
回复 支持 反对

使用道具 举报

发表于 2021-2-26 09:12:29 | 显示全部楼层
白纸扇001 发表于 2021-2-25 19:31
都是这个脉冲数量和频率怎么设置?比较输出模式倒是可以输出不同频率不同占空比的PWM,可是脉冲数怎么控 ...

PWM模式下可以用定时器更新中断来计数,一个周期中断一次,刚好是一个完整的脉冲
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-2-26 09:21:50 | 显示全部楼层
美羊羊是公羊 发表于 2021-2-26 08:41
没有太理解你的意思,为什么要计脉冲数啊,可以再详细点描述吗

就是STM32 同时输出4路 频率不同,脉冲个数不同的 脉冲,重要的是要 同时
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 09:22:22 | 显示全部楼层
ZZZ_XXJ 发表于 2021-2-26 09:12
PWM模式下可以用定时器更新中断来计数,一个周期中断一次,刚好是一个完整的脉冲 ...

好的,感谢老哥的指点了
回复 支持 反对

使用道具 举报

发表于 2021-2-26 17:42:31 | 显示全部楼层
类似这个样子的吗?
PWM输出.JPG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 20:45:16 | 显示全部楼层

对,你这4个PWM是同时发送的吗?
回复 支持 反对

使用道具 举报

发表于 2021-2-27 09:20:53 | 显示全部楼层
白纸扇001 发表于 2021-2-26 20:45
对,你这4个PWM是同时发送的吗?

是啊,五路脉冲都是同时发送的。这个就是开启定时器不同的通道,然后初始化完成之后,它就会自己发脉冲的。给你贴段代码吧( 网上很多的,你搜索 定时器 多通道就能找到 。火哥教程里面也有)

void motor_speed_init(int arr,int psc,int duty)
{
        /*TIM12初始化*/
        GPIO_InitTypeDef GPIO_Initstructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef  TIM_OCInitStruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能 PA0,PA1时钟
        /* 通用定时器PWM输出引脚 */                                                                                                                                  

        GPIO_Initstructure.GPIO_Mode =GPIO_Mode_AF_PP ;
        GPIO_Initstructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz  ;
        GPIO_Init(GPIOA, &GPIO_Initstructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_1);
       
        GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_Init(GPIOA, &GPIO_Initstructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_0);
       
        /*APB1时钟周期72MHZ*/
        TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
        TIM_TimeBaseInitStruct.TIM_CounterMode =  TIM_CounterMode_Up;//计数器模式
        TIM_TimeBaseInitStruct.TIM_Period = arr-1 ;//计数器周期arr 100 10000
        TIM_TimeBaseInitStruct.TIM_Prescaler = psc-1;//预分频系数psc 72    72
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
       

        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出模式
        TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High;//输出极性
        TIM_OCInitStruct.TIM_Pulse = duty;//脉冲宽度 50 4000
       
        //使能通道3重载值
        TIM_OC1Init(TIM2,&TIM_OCInitStruct);
        TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);

        TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High;//输出极性
        TIM_OCInitStruct.TIM_Pulse = duty;//脉冲宽度
       
        TIM_OC2Init(TIM2,&TIM_OCInitStruct);
        TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
       
//        TIM_ARRPreloadConfig(TIM2,ENABLE);//寄存器初始值使能
        TIM_Cmd(TIM2,ENABLE);
}


具体哪些通道可以用你得去看数据手册的
回复 支持 反对

使用道具 举报

发表于 2021-2-27 09:22:31 | 显示全部楼层
美羊羊是公羊 发表于 2021-2-27 09:20
是啊,五路脉冲都是同时发送的。这个就是开启定时器不同的通道,然后初始化完成之后,它就会自己发脉冲的 ...

别看注释,注释有些是错的,看程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-27 10:02:42 | 显示全部楼层
美羊羊是公羊 发表于 2021-2-27 09:22
别看注释,注释有些是错的,看程序。

感谢老哥的回复了,你这个产生的4个PWM的频率都是一样的,这是占空比不同,我需要的是 频率和占空比都不同,且脉冲数可控,同时产生的那种
回复 支持 反对

使用道具 举报

发表于 2021-2-27 10:51:20 | 显示全部楼层
用两个控制器采用门方式是可以完成你说的操作的
回复 支持 反对

使用道具 举报

发表于 2021-2-27 10:58:41 | 显示全部楼层
白纸扇001 发表于 2021-2-27 10:02
感谢老哥的回复了,你这个产生的4个PWM的频率都是一样的,这是占空比不同,我需要的是 频率和占空比都不 ...

你先好好看完火哥的定时器吧。。。。。。,频率占空比什么的每个不同的通道是可以分别配置的。。。。。。我发那张图只想表示可以多路输出。。。。。
回复 支持 反对

使用道具 举报

发表于 2021-2-27 11:01:03 | 显示全部楼层
美羊羊是公羊 发表于 2021-2-27 10:58
你先好好看完火哥的定时器吧。。。。。。,频率占空比什么的每个不同的通道是可以分别配置的。。。。。。 ...

  TIM_TimeBaseInitStruct.TIM_Period = arr-1 ;//计数器周期arr 100 10000
        TIM_TimeBaseInitStruct.TIM_Prescaler = psc-1;//预分频系数psc 72    72
这两个是配置周期的
      TIM_OCInitStruct.TIM_Pulse = duty;//脉冲宽度 50 4000
这个是配置占空比的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-27 20:37:24 | 显示全部楼层
美羊羊是公羊 发表于 2021-2-27 11:01
TIM_TimeBaseInitStruct.TIM_Period = arr-1 ;//计数器周期arr 100 10000
        TIM_TimeBaseInitStr ...

感谢老哥的指点了,是我大意了,输出比较功能确实可以产生4路不同频率不同占空比的PWM。这个怎么设置成让他输出我想要的脉冲数呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-27 20:48:54 | 显示全部楼层
cyg1dm 发表于 2021-2-27 10:51
用两个控制器采用门方式是可以完成你说的操作的

感谢老哥的回复了,那这2个控制器启动也有个顺序的,4路脉冲也不是同时启动的吧?
回复 支持 反对

使用道具 举报

发表于 2021-2-27 22:48:47 | 显示全部楼层
白纸扇001 发表于 2021-2-27 20:37
感谢老哥的指点了,是我大意了,输出比较功能确实可以产生4路不同频率不同占空比的PWM。这个怎么设置成让 ...

这个就不知道,我只是个萌新。。。上面有大佬说可以用定时器中断来做。那个关于定时器多通道变频PWM我可能说错了,定时器好像不能输出变频的PWM,只能输出频率相同的不同占空比的PWM,不好意思,误导人了。。。。。

然后关于控制脉冲输出个数,按楼上大佬说用定时器的中断计数来计数就可以了,因为可以判断中断的来源,也就是那个通道,那么每中断一次,给他计数加一,达到设定值就关闭对应的通道,应该就可以控制输出打PWM个数了,

然后我去网上查了一下,这个博客可能有你想要的东西。
https://blog.csdn.net/a568713197/article/details/89070265
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-28 14:55:28 | 显示全部楼层
美羊羊是公羊 发表于 2021-2-27 22:48
这个就不知道,我只是个萌新。。。上面有大佬说可以用定时器中断来做。那个关于定时器多通道变频PWM我可 ...

好的,感谢老哥了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-12 08:20 , Processed in 0.055677 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表