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

STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置...

[复制链接]
Royliang 发布时间:2020-7-23 11:20
STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置六步曲

) y. J1 X# V+ U: R+ h
一、stm32的pwm输出引脚是使用的IO口的复用功能。
二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。
三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。
四、给出了PWM频率和占空比的计算公式。

" `6 |$ y9 C+ E) ^0 q
步骤如下:

' G# l; {4 x' @9 B
1、使能TIM3时钟

" O! z% Y5 i% g: g& X8 t; ]8 r
11.jpg

+ Z6 I. n# r0 U% q' M
RCC->APB1ENR |= 1 << 1;

, U$ h7 x! s2 `3 s* X
2、配置对应引脚(PA6)的复用输出功能
5 P) d( l. Z) k7 o, Q
22.jpg
+ x8 b3 ?: h$ z; U# }
GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
GPIOA->ODR |= 1 << 6;//PA6上拉
: z+ f' P) B' H7 r- a" y
3、设定计数器自动重装值及是否分频
. c- S/ O: s/ D& \. Z& w
TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
TIM3->PSC = psc;//预分频器,0为不分频
4 Z" L% `% b  Y0 u$ }
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可

2 z, G; w$ P( ^4 Y5 c3 r
33.jpg
6 Q+ j! s- l3 }$ c& ^
注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。
6 ]8 s  n" S  D( r
44.jpg
/ G/ w+ I( c# M- v* p
//TIM3->CCMR1 |= 6 << 4;//CH1 PWM1模式
TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
TIM3->CCMR1 |= 1 << 3;//CH1预装载使能
% l% ~6 w5 t! z6 H! \! d- v8 B
5、输出使能设置
* a+ w2 t. Y; J* x
55.jpg

8 r8 E" D1 S% {6 v# O
TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能
: J$ h1 J$ v( R" f& b- v
6、自动重装载预装载允许位(ARPE)及 定时器 使能
, Q/ H2 h- N% U5 j& C0 [
66.jpg
5 @6 R3 c: B2 Z' c1 e  u8 T4 A# a
TIM3->CR1 = 0X0080;//ARPE使能(此句不配置也行)
TIM3->CR1 |= 0X01;//使能定时器3
下面给出TIM3_CH1及TIM3_CH2的PWM输出代码:
void PWM_Init_TIM3_CH1(u16 arr, u16 psc)
{
   //1、使能TIM3时钟   
   RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
   //2、配置对应引脚(PA6)的复用输出功能
   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的模式
   TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
   TIM3->CCMR1 |= 1 << 3;//CH1预装载使能   
   //5、输出使能设置
   TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能
   //6、自动重装载预装载允许位(ARPE) 及 定时器 使能
   TIM3->CR1 = 0X0080;//ARPE使能
   TIM3->CR1 |= 0X01;//使能定时器3
}
void PWM_Init_TIM3_CH2(u16 arr, u16 psc)
{
   RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
   
   GPIOA->CRL &= 0X0FFFFFFF;//PA7清0
   GPIOA->CRL |= 0XB0000000;//复用功能输出(推挽50MHz输出)
   GPIOA->ODR |= 1 << 7;//PA7上拉
   TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
   TIM3->PSC = psc;//预分频器 不分频
   TIM3->CCMR1 |= 7 << 12;//CH2 PWM2模式
   TIM3->CCMR1 |= 1 << 11;//CH2预装载使能
   TIM3->CCER  |= 1 << 4;//输入/捕获2输出使能
   TIM3->CR1 = 0X0080;//ARPE使能
   TIM3->CR1 |= 0X01;//使能定时器3
}
频率:
//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)
占空比:
//duty circle = TIM3->CCR1 / arr(单位:%)
注:本文方法的一个定时器4个通道的pwm输出的频率是相同的,但占空比可以不同!

9 Q3 [" Q4 h- F8 _0 h$ L7 M+ i6 b) S
赞 收藏 评论0 发布时间:2020-7-23 11:20

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版