你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

详解STM32的PWM输出及频率和脉宽(占空比)的计算

[复制链接]
eefishing 发布时间:2017-6-20 10:17

STM32电机培训online,大佬带你玩电机



一、stm32的pwm输出引脚是使用的IO口的复用功能。

二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。

三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。

四、给出了PWM频率和占空比的计算公式。

步骤如下:

1、使能TIM3时钟

11.png


RCC->APB1ENR |= 1 << 1;

2、配置对应引脚(PA6)的复用输出功能

12.png

GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
GPIOA->ODR |= 1 << 6;//PA6上拉

3、设定计数器自动重装值及是否分频

TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
TIM3->PSC = psc;//预分频器,0为不分频

4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可

13.png

注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。

14.png

//TIM3->CCMR1 |= 6 << 4;//CH1 PWM1模式

TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
TIM3->CCMR1 |= 1 << 3;//CH1预装载使能

5、输出使能设置

15.png

TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能

6、自动重装载预装载允许位(ARPE) 及 定时器 使能

16.png

TIM3->CR1 = 0X0080;//ARPE使能(此句不配置也行)
TIM3->CR1 |= 0X01;//使能定时器3

下面给出TIM3_CH1及TIM3_CH2的PWM输出代码:

  1. void PWM_Init_TIM3_CH1(u16 arr, u16 psc)
  2. {
  3.     //1、使能TIM3时钟   
  4.     RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
  5.     //2、配置对应引脚(PA6)的复用输出功能
  6.     GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
  7.     GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
  8.     GPIOA->ODR |= 1 << 6;//PA6上拉   
  9.     //3、设定计数器自动重装值及是否分频
  10.     TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
  11.     TIM3->PSC = psc;//预分频器 0为不分频
  12.     //4、设置PWM的模式
  13.     TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
  14.     TIM3->CCMR1 |= 1 << 3;//CH1预装载使能   
  15.     //5、输出使能设置
  16.     TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能
  17.     //6、自动重装载预装载允许位(ARPE) 及 定时器 使能
  18.     TIM3->CR1 = 0X0080;//ARPE使能
  19.     TIM3->CR1 |= 0X01;//使能定时器3
  20. }
  21. void PWM_Init_TIM3_CH2(u16 arr, u16 psc)
  22. {
  23.     RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
  24.    
  25.     GPIOA->CRL &= 0X0FFFFFFF;//PA7清0
  26.     GPIOA->CRL |= 0XB0000000;//复用功能输出(推挽50MHz输出)
  27.     GPIOA->ODR |= 1 << 7;//PA7上拉
  28.     TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
  29.     TIM3->PSC = psc;//预分频器 不分频
  30.     TIM3->CCMR1 |= 7 << 12;//CH2 PWM2模式
  31.     TIM3->CCMR1 |= 1 << 11;//CH2预装载使能
  32.     TIM3->CCER  |= 1 << 4;//输入/捕获2输出使能
  33.     TIM3->CR1 = 0X0080;//ARPE使能
  34.     TIM3->CR1 |= 0X01;//使能定时器3
  35. }
复制代码

频率:

//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)
占空比:

//duty circle = TIM3->CCR1 / arr(单位:%)

注:本文方法的一个定时器4个通道的pwm输出的频率是相同的,但占空比可以不同!


评分

参与人数 1 ST金币 +10 收起 理由
MrJiu + 10 神马都是浮云

查看全部评分

收藏 3 评论5 发布时间:2017-6-20 10:17

举报

5个回答
MrJiu 回答时间:2017-6-21 09:37:50
支持基础理论讲解!!!!!!!!
xmshao 回答时间:2017-6-21 15:06:19
谢谢!
epochal 回答时间:2017-6-21 21:50:48
谢谢分享!
anny 回答时间:2017-6-21 23:54:39
不错的帖子,谢谢楼主的分享
sasikawyh 回答时间:2018-10-24 11:28:13
谢谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版