OpenEdv-开源电子网

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

STM32的PWM与Toggle有啥区别

[复制链接]

8

主题

25

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2018-7-26
在线时间
68 小时
发表于 2018-9-12 11:02:32 | 显示全部楼层 |阅读模式
1金钱
接触STM32没多长时间。在使用时钟的时候有几个疑问。


用的TIM8实现控制电子,网上查资料可以使用PWM,也可以使用输出比较的TIM_OCMode_Toggle, 下面分别对比


使用PWM2:
设置频率为18K, arr= 1000-1, psc = 40-1。 用示波器测试也是显示18K左右,正常。 占空比50%用TIM_OCInitStructure.TIM_Pulse来控制,也正常。

使用TIM_OCMode_Toggle,
修改TIM_OCMode_PWM2 为TIM_OCMode_Toggle,其它配置不变,测试的是9KHZ? 这是为什么,看数据手册,“当TIMx_CCR1=TIMx_CNT时,翻转OC1REF的电平“意思未理解。


现在控制电机感觉一个电机就要用掉一个时钟。 有没有办法利用1时钟的通道1,2,3,4来分别控制四个电机,而不用四个时钟来控制四个电机?



最佳答案

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

PWM模式1和2 是通过计数值和比较值的比较 来确定有效电平的,所以一个计数重装载周期会翻转2次。toggle模式是计数值和比较值相同时翻转电平 ,所以一个技术重装载周期只会翻转一次电平,频率自然就只有PWM模式的一半了 画两张图 都是向上计数,相同重装载值和比较值 。 一个定时器的4个通道可以输出不同频率的波形的,需要用到冻结模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17786
金钱
17786
注册时间
2018-3-3
在线时间
523 小时
发表于 2018-9-12 11:02:33 | 显示全部楼层
本帖最后由 Psheng 于 2018-9-12 11:35 编辑

PWM模式1和2 是通过计数值和比较值的比较 来确定有效电平的,所以一个计数重装载周期会翻转2次。toggle模式是计数值和比较值相同时翻转电平 ,所以一个技术重装载周期只会翻转一次电平,频率自然就只有PWM模式的一半了

画两张图  都是向上计数,相同重装载值和比较值 。




toggle.png
pwm.png
一个定时器的4个通道可以输出不同频率的波形的,需要用到冻结模式


/*
*
*
*
*
*
*/
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-9-12 11:14:33 | 显示全部楼层
STM8不了解,STM32通用定时器是可以一个定时器每个通道都输出PWM的
没有脑袋
回复

使用道具 举报

8

主题

25

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2018-7-26
在线时间
68 小时
 楼主| 发表于 2018-9-12 11:25:56 | 显示全部楼层
美丽的时光机器 发表于 2018-9-12 11:14
STM8不了解,STM32通用定时器是可以一个定时器每个通道都输出PWM的

一个定时器的WM只能输出相同的频率, 这样没办法控制不同的电机不同速度
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-9-12 11:26:46 | 显示全部楼层
pwm是输出比较的特殊形式,要4个通道产生不同频率与占空比的方波就直接输出比较.要是4个电机方波周期可以一样就直接4个通道的pwm就可以了
回复

使用道具 举报

8

主题

25

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2018-7-26
在线时间
68 小时
 楼主| 发表于 2018-9-12 11:40:06 | 显示全部楼层
Psheng 发表于 2018-9-12 11:33
PWM模式1和2 是通过计数值和比较值的比较 来确定有效电平的,所以一个计数重装载周期会翻转2次。toggle模式 ...

谢谢,画的很清晰。看图toggle模式的情况下,是不是可以动态去的修改比较值做到CHX 输出不同的频率?  
回复

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17786
金钱
17786
注册时间
2018-3-3
在线时间
523 小时
发表于 2018-9-12 11:46:08 | 显示全部楼层
huzghost 发表于 2018-9-12 11:40
谢谢,画的很清晰。看图toggle模式的情况下,是不是可以动态去的修改比较值做到CHX 输出不同的频率?

是的,都可以的
/*
*
*
*
*
*
*/
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-9-12 11:50:09 | 显示全部楼层
huzghost 发表于 2018-9-12 11:25
一个定时器的WM只能输出相同的频率, 这样没办法控制不同的电机不同速度

http://www.openedv.com/posts/list/0/58928.htm
没有脑袋
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2018-9-12 11:59:04 | 显示全部楼层
不建议用pwm,电机走步数精确控制比较麻烦,并且控制电机启停的话,一个pwm只能对应一个电机。
我一直用的方法,一个定时器控制任意数目电机



[mw_shl_code=c,true]TIM_TimeBaseInitStructure.TIM_Period = 50;                                                                        //reload value 100
        TIM_TimeBaseInitStructure.TIM_Prescaler= (84 - 1);                                                  //84prescaler, 84MHZ/84 = 1us
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
        TIM_ARRPreloadConfig(TIM3, ENABLE);
        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
        TIM_Cmd(TIM3, ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

void TIM3_IRQHandler(void)
{

        if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
        {
                motor = getMotor(Motor_1);
                if(motor->moveStepNum > 0)
                {
                        motor->periodCnt++;
                       
                        if(motor->periodCnt <= motor->highPwmCnt)
                                setMotor1ClkGPIO(ON);
                        else if(motor->periodCnt < motor->totalPwmCnt)
                                setMotor1ClkGPIO(OFF);
                        else if(motor->periodCnt >= motor->totalPwmCnt)[/mw_shl_code]
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

8

主题

25

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2018-7-26
在线时间
68 小时
 楼主| 发表于 2018-9-12 13:23:07 | 显示全部楼层
xsx127 发表于 2018-9-12 11:59
不建议用pwm,电机走步数精确控制比较麻烦,并且控制电机启停的话,一个pwm只能对应一个电机。
我一直用的 ...

你这个是直接正反电源的电机吧,我那个是步进电机,需要用驱动器。
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2018-9-12 13:38:06 | 显示全部楼层
huzghost 发表于 2018-9-12 13:23
你这个是直接正反电源的电机吧,我那个是步进电机,需要用驱动器。

是步进电机啊,你仔细看看就明白了,后面还加减速,没贴出来呢
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 07:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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