[应用相关] 一路PWM设置

[复制链接]
 楼主| heimaojingzhang 发表于 2021-7-1 17:01 | 显示全部楼层 |阅读模式
一、什么是PWM
PWM是脉冲宽度调制,PWM我个人理解为一个方波信号,其参数有两个
(1)占空比:脉冲的有效电平占整个周期的百分比。
(2)频率:整个PWM波的频率,1/一个脉冲周期
由上可知,一个PWM波形我们可以通过调整其频率和占空比来达到我们需要的波形或是等效电压。(3.3V的电压如果PWM调制的等效电压为3.3占空比【60%占空比电压等效为3.3V60%=1.98V】)具体内容如图所示:

6105360dd847ed6730.png

 楼主| heimaojingzhang 发表于 2021-7-1 17:02 | 显示全部楼层
二、PWM的时钟来源
由于PWM是一个有频率有脉冲宽度的方波,所以一定存在一个标准的时钟信号为PWM提供基准时钟,在STM32F1系列中,其中定时器TIM1、TIM8是挂在在APB2上的,而定时器TIM2、3、4是关在在APB1上的。所以我们需要在时钟树上调整其时钟源频率来满足PWM波形需要。


 楼主| heimaojingzhang 发表于 2021-7-1 17:02 | 显示全部楼层
三、操作步骤

要求:构建一个500Hz,脉冲宽度为70%的PWM波

1、根据自己的stm32的芯片型号来选择,我这里是STM32F103RBTx

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FTV2F0ZXJiZW5iZW4=,size_16,color_FFFFFF,t_70.jpg


 楼主| heimaojingzhang 发表于 2021-7-1 17:02 | 显示全部楼层
2、选好芯片之后照旧设置RCC为外部时钟

20190622211401462.png


 楼主| heimaojingzhang 发表于 2021-7-1 17:02 | 显示全部楼层
3、设置定时器TIM1为PWM模式,并设置时钟源位内部时钟,如图:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FTV2F0ZXJiZW5iZW4=,size_16,color_FFFFFF,t_70.jpg


 楼主| heimaojingzhang 发表于 2021-7-1 17:03 | 显示全部楼层
4、配置时钟树,由于本次使用TIM1,所以主要配置APB2

592160dd84c2e1687.png
时钟源选择外部时钟,外部时钟为8MHz倍频9倍后变为72MHz后导入系统时钟,通过AHB分频后得到硬件时钟HCLK后分配给各个部件,图中标识了时钟频率最大值,根据后边的分频来保证各个部件不超过最大频率(按照需求配置,不要小于PWM的频率即可。PS:频率越低越节能,越高性能越好)


 楼主| heimaojingzhang 发表于 2021-7-1 17:03 | 显示全部楼层
5、定时器设置(设置PWM频率)

点击TIM1进入配置界面
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FTV2F0ZXJiZW5iZW4=,size_16,color_FFFFFF,t_70.jpg


 楼主| heimaojingzhang 发表于 2021-7-1 17:03 | 显示全部楼层
我现在需要使PWM频率达到500Hz,此时时钟树APB2设置为72MHz,所以存在以下计算公式:

                                                目的定时器频率=时钟源/(预分频系数*自动重载值)

                                                时钟源:72MHz
                                                目的定时器频率:500Hz


所以我们可以自己设置自动重载值和预分频系数使等式成立:

预分频系数:144
自动重载值:1000


由于计数是从0开始,所以需要在设置量上减1得到以下设置图
9128160dd84f14d7ad.png

 楼主| heimaojingzhang 发表于 2021-7-1 17:04 | 显示全部楼层
定时器设置完成后下拉定时器菜单可见PWM设置部分
3517660dd85188d9ab.png
PWM Mode为设置PWM输出模式

        模式1:        a、当定时器计数为向上计数,则计数小于占空比的部分为有效电平
                                     b、当定时器计数为向下计数,则计数大于占空比的部分为有效电平
                         计数方式在下图第二行

281460dd852074bbd.png


模式2:                        a、当定时器计数为向上计数,则计数大于占空比的部分为有效电平
                                 b、当定时器计数为向下计数,则计数小于占空比的部分为有效电平


总结:PWM mode 1和PWM mode 2互补


 楼主| heimaojingzhang 发表于 2021-7-1 17:04 | 显示全部楼层
到这步设置完成,点击菜单栏
20190622214451968.png
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FTV2F0ZXJiZW5iZW4=,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FTV2F0ZXJiZW5iZW4=,size_16,color_FFFFFF,t_70.jpg
 楼主| heimaojingzhang 发表于 2021-7-1 17:05 | 显示全部楼层
6、代码部分(设置PWM占空比)
在生成的项目的main.c部分添加如下代码

  /* USER CODE BEGIN 2 */
                        HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
                        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 700);
  /* USER CODE END 2 */


由于我们只设置了一路PWM,就启动一路就行,第一句是启动PWM,第二句是设置PWM的占空比,两个函数的第一参数都是定时器,第二参数为频道,设置占空比的第三参数为计数值,存在以下公式:

                                占空比=(计数值/自动重载值)*100%

自动重载值:定时器的自动重载值


到此为止,所有设置工作结束,编译,下载到板子上。


 楼主| heimaojingzhang 发表于 2021-7-1 17:05 | 显示全部楼层
7、测试部分
正所谓所有不给实验结果的博客都是流氓博客,所以在此花费几百大洋买了个逻辑分析仪来给大家展示一下测试结果

由于设置定时器的PWM后自动分配了PWM的输出引脚,我这里为PA8,所以我直接将逻辑分析仪频道0接到STM32的PA8引脚上,逻辑分析仪底线接地(PS:懒得接地的小伙子不怕分析仪烧了就不用接地了,哈哈哈哈哈嗝!!!!!)

我将逻辑分析仪频道0设置了对PWM的分析,方便大家查看(逻辑分析仪各人用的不一样,这里设置就不上图了,直接放结果)

以下是频率为500Hz,占空比为70%的PWM波:
9815860dd8556959b2.png
由图可知,一个周期为20ms,所以

                                                        f=1/T=1/0.02s=500Hz
                    f:频率
                        T:周期


由图可知,占空比为70%达到了一开始的实验要求。


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

本版积分规则

106

主题

4333

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

106

主题

4333

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部