content_views"
class="markdown_views prism-atom-one-dark">
前言
本文简单介绍了PWM定时器生成与通道输出的关系。
1.简介
PWM(脉宽调制) 通过周期性的高低电平切换产生可变占空比的信号c;广泛应用于电机控制、LED调光等领域。其核心依赖**定时器(Timer)**模块生成精确的时间基准c;具体关系如下:
定时器通过内部计数器周期性递增/递减c;生成固定频率的时钟信号。计数器的溢出频率决定了PWM信号的频率。
PWM_23">3.通道作为PWM的输出接口
每个定时器通常有多个通道(如STM32的TIM1有4个通道)c;每个通道可独立输出PWM信号。通过配置通道的比较寄存器(CCR)c;可调整占空比。
4.协同工作流程
ckquote> - 定时器计数器(CNT)按配置的频率累加。
- 当CNT值小于通道的CCR值时c;PWM输出高电平(或低电平c;取决于极性配置)。
- 当CNT超过CCR但**未达到自动重装载值(ARR)**时c;电平翻转。
- CNT达到ARR时c;复位并触发更新事件c;开始新周期。
ckquote>
5.关键公式
ckquote> - PWM频率 = 定时器时钟源频率 / [(PSC + 1) * (ARR + 1)]
- 占空比 = CCR / (ARR + 1) * 100%
ckquote>
PWM_37">二、输出PWM的设置步骤(通用流程)
以下步骤以STM32为例c;但原理适用于多数微控制器:
1. 选择定时器与通道
根据硬件设计c;选择支持PWM输出的定时器及对应通道(如TIM3_CH1对应PB4引脚)。
2. 配置时钟源
<code class="prism language-c">class="token comment">// 使能定时器时钟(以STM32为例)
class="token function">RCC_APB1PeriphClockCmdclass="token punctuation">(RCC_APB1Periph_TIM3class="token punctuation">, ENABLEclass="token punctuation">)class="token punctuation">;
code>
3. 初始化定时器参数
预分频器
ckquote> 预分频器(PSC):降低定时器时钟频率。
ckquote>
自动重装载
ckquote> 自动重装载值(ARR):设定计数周期c;与PSC共同决定PWM频率。
ckquote>
<code class="prism language-c">TIM_TimeBaseInitTypeDef TIM_TimeBaseStructclass="token punctuation">;
TIM_TimeBaseStructclass="token punctuation">.TIM_Prescaler class="token operator">= class="token number">71class="token punctuation">; class="token comment">// 72MHz/(71+1)=1MHz
TIM_TimeBaseStructclass="token punctuation">.TIM_CounterMode class="token operator">= TIM_CounterMode_Upclass="token punctuation">;
TIM_TimeBaseStructclass="token punctuation">.TIM_Period class="token operator">= class="token number">999class="token punctuation">; class="token comment">// PWM频率=1MHz/(999+1)=1kHz
class="token function">TIM_TimeBaseInitclass="token punctuation">(TIM3class="token punctuation">, class="token operator">&TIM_TimeBaseStructclass="token punctuation">)class="token punctuation">;
code>
<code class="prism language-c">TIM_OCInitTypeDef TIM_OCStructclass="token punctuation">;
TIM_OCStructclass="token punctuation">.TIM_OCMode class="token operator">= TIM_OCMode_PWM1class="token punctuation">; class="token comment">// PWM模式1(CNT < CCR时输出有效电平)
TIM_OCStructclass="token punctuation">.TIM_OutputState class="token operator">= TIM_OutputState_Enableclass="token punctuation">;
TIM_OCStructclass="token punctuation">.TIM_Pulse class="token operator">= class="token number">500class="token punctuation">; class="token comment">// 初始占空比50%(CCR=500)
TIM_OCStructclass="token punctuation">.TIM_OCPolarity class="token operator">= TIM_OCPolarity_Highclass="token punctuation">; class="token comment">// 高电平有效
class="token function">TIM_OC1Initclass="token punctuation">(TIM3class="token punctuation">, class="token operator">&TIM_OCStructclass="token punctuation">)class="token punctuation">; class="token comment">// 初始化通道1
code>
5. 配置GPIO为复用功能
<code class="prism language-c">GPIO_InitTypeDef GPIO_InitStructclass="token punctuation">;
GPIO_InitStructclass="token punctuation">.GPIO_Pin class="token operator">= GPIO_Pin_4class="token punctuation">;
GPIO_InitStructclass="token punctuation">.GPIO_Mode class="token operator">= GPIO_Mode_AF_PPclass="token punctuation">; class="token comment">// 复用推挽输出
GPIO_InitStructclass="token punctuation">.GPIO_Speed class="token operator">= GPIO_Speed_50MHzclass="token punctuation">;
class="token function">GPIO_Initclass="token punctuation">(GPIOBclass="token punctuation">, class="token operator">&GPIO_InitStructclass="token punctuation">)class="token punctuation">;
code>
6. 启动定时器与通道
<code class="prism language-c">class="token function">TIM_Cmdclass="token punctuation">(TIM3class="token punctuation">, ENABLEclass="token punctuation">)class="token punctuation">; class="token comment">// 启动定时器
class="token function">TIM_CtrlPWMOutputsclass="token punctuation">(TIM3class="token punctuation">, ENABLEclass="token punctuation">)class="token punctuation">; class="token comment">// 若为高级定时器(如TIM1)c;需额外使能主输出
code>
7. 动态调整占空比
<code class="prism language-c">class="token function">TIM_SetCompare1class="token punctuation">(TIM3class="token punctuation">, new_CCRclass="token punctuation">)class="token punctuation">; class="token comment">// 修改通道1的CCR值以改变占空比
code>
8.关键注意事项
频率与分辨率的权衡
ckquote> 频率与分辨率权衡:ARR值越大c;PWM分辨率越高c;但最大频率降低。
ckquote>
中央对齐模式
ckquote> 中央对齐模式:计数器先递增后递减c;PWM频率减半c;适合某些电机控制场景。
ckquote>
死区电压
ckquote> 死区时间:H桥驱动中**c;高级定时器可插入死区**c;防止上下管直通。
ckquote>
9.示例应用:呼吸灯
<code class="prism language-c">class="token comment">// 在循环中逐渐改变CCR值
class="token keyword">forclass="token punctuation">(class="token class-name">uint16_t iclass="token operator">=class="token number">0class="token punctuation">; iclass="token operator"><=class="token number">1000class="token punctuation">; iclass="token operator">+=class="token number">10class="token punctuation">) class="token punctuation">{class="token function">TIM_SetCompare1class="token punctuation">(TIM3class="token punctuation">, iclass="token punctuation">)class="token punctuation">;class="token function">Delay_msclass="token punctuation">(class="token number">10class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>
通过以上步骤c;定时器与PWM通道协同工作c;实现了灵活的信号输出控制。实际开发中需参考具体芯片的数据手册c;确保寄存器和库函数正确配置。