OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2721|回复: 6

想用STM32 做一个4路PWM发生器要求脉冲数精确

[复制链接]

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2015-12-22
在线时间
18 小时
发表于 2018-5-21 09:36:43 | 显示全部楼层 |阅读模式
1金钱
想用一个STM32做一个脉冲发生的设备 要求是4路  如何做能保证脉冲数精确。这是通过PWM的频率来调速。 这个使用4个定时器 还是使用一个定时器中的4路PWM

最佳答案

查看完整内容[请看2#楼]

建议你另外一种方法,一个定时器,在中断里面控制io,可以做到一个定时器,很多路pwm输出,且每一路周期,占空比,波形个数任意控制,并且对硬件布局无影响(任意io口都可输出pwm,方便布线)。我目前的产品控制12路步进电机就是这么实现的,由于不同电机的负重不同,S型加减速参数不同,所以这种方法是最灵活的。还可以检测电机的限位传感器,随时终止pwm输出
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2018-5-21 09:36:44 | 显示全部楼层
本帖最后由 xsx127 于 2018-5-21 11:19 编辑

建议你另外一种方法,一个定时器,在中断里面控制io,可以做到一个定时器,很多路pwm输出,且每一路周期,占空比,波形个数任意控制,并且对硬件布局无影响(任意io口都可输出pwm,方便布线)。我目前的产品控制12路步进电机就是这么实现的,由于不同电机的负重不同,S型加减速参数不同,所以这种方法是最灵活的。还可以检测电机的限位传感器,随时终止pwm输出

stm32

stm32
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-21 09:48:45 | 显示全部楼层
精确脉冲用定时器主从模式,论坛里又例子,到底用几个定时器pwm,看你pwm的周期是否一样吧
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2015-12-22
在线时间
18 小时
 楼主| 发表于 2018-5-21 12:50:37 | 显示全部楼层
xsx127 发表于 2018-5-21 11:02
建议你另外一种方法,一个定时器,在中断里面控制io,可以做到一个定时器,很多路pwm输出,且每一路周期, ...

你这个12个不是同时控制吧? 如果我让步进电机1转200转  步进电机2 220转  步进电机3 260转 。。。并且这几个步进电机同时工作  这样行吗? 如果可以能详细说一下嘛
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2018-5-21 13:44:10 | 显示全部楼层
肯定是同时控制啊,我用的定时器50us中断一次,每次中断都依次判断所有电机状态,需要运动的,步数达到的,限位出发中断运行的。
[mw_shl_code=c,true]void TIM3_IRQHandler(void)
{       
        if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
        {
                motor = getMotor(Motor_1);
                if(motor->moveStepNum > 0)
                {
                       
                }

                motor = getMotor(Motor_2);
                if(motor->moveStepNum > 0)
                {
                       
                }
#if(Motor4Type == Motor4IOMotor)               
                motor = getMotor(Motor_4);
                if(motor->moveStepNum > 0)
                {
                       
                }
#endif               
       
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        }
}[/mw_shl_code]
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2015-12-22
在线时间
18 小时
 楼主| 发表于 2018-5-21 14:38:51 | 显示全部楼层
xsx127 发表于 2018-5-21 13:44
肯定是同时控制啊,我用的定时器50us中断一次,每次中断都依次判断所有电机状态,需要运动的,步数达到的, ...

你说的是不是
利用改变定时器输出比较通道的捕获值,当输出通道捕获值产生中断时,在中断中将捕获值改变,这时, 输出的I/O会产生一个电平翻转,利用这种办法,实现不同频率的PWM输出。
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2018-5-21 15:10:19 | 显示全部楼层
xueqiang198511 发表于 2018-5-21 14:38
你说的是不是
利用改变定时器输出比较通道的捕获值,当输出通道捕获值产生中断时,在中断中将捕获值改变 ...

就一个简单的定时器计数,溢出就中断啊
[mw_shl_code=c,true]TIM_TimeBaseStructure.TIM_Prescaler=84-1;  //?????
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //??????
        TIM_TimeBaseStructure.TIM_Period= 50;   //??????
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//??????14
        TIM_ARRPreloadConfig(TIM4, ENABLE);
        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
        TIM_Cmd(TIM4, ENABLE);

        TIM_ARRPreloadConfig(TIM4,ENABLE);//ARPE??

    NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //???3??
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x04; //?????1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; //????3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);        [/mw_shl_code]
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 04:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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