HAL+Cube MX 学习之PWM

记录HAL库+Cube MX的学习过程,不定期更新……

一、PWM’s introduction

PWM(Pulse width modulation脉冲宽度调制)是一种** 用数字信号控制模拟信号** 的一种技术,通过产生的高低电平(矩形波)来控制引脚的输出,从而可以控制lcd的亮与灭等,PWM是stm32定时器的一个重要应用,本文以产生一个频率为10kHz,占空比为20%为例说明。

二、Clock Configuration

首先进行时钟的配置,如图,在System view界面点击RCC进入时钟设置(与时钟有关的设置都在RCC中,不论是Cube MX或是库函数开发),HSE(外部高速时钟)选择Crystal/Ceramic Resonator(水晶/陶瓷 谐振器,可理解为时钟来源选择为外部晶振)(后续文章中可能会有关于晶振的学习记录,敬请期待!)
HAL+Cube MX 学习之PWM_第1张图片
HAL+Cube MX 学习之PWM_第2张图片
现在就可以将时钟频率设置为最大,stm32f103RC频率最大为72M。如果时钟来源不选择为外部晶振的话,频率最大只能选择为64M,可自行尝试。
HAL+Cube MX 学习之PWM_第3张图片

三、Enable PWM

在左侧categories(分类)中的Times选项中选择TIM1(其它的也都可以),并在弹出的TIM1 Mode and Configuration中设置时钟来源为Internal Clock(内部时钟),Channel(通道)里选择PWM Generation CH1,至此所有的设置已经完成了。在设置Channel后Cube MX已经为产生PWM配置了对应的引脚 ,TIM通道以及Channel选择不同时引脚也会变化。
值得注意的是,PWM产生的操作不是对引脚GPIO的操作,所以不要在Pinout view中对芯片引脚进行操作。
HAL+Cube MX 学习之PWM_第4张图片

四、PWM’s Configuration

要产生PWM有两个最重要的因素,一个是频率(即周期),一个是占空比(由于引脚产生的高电平时确定的,一般为3.3V,PWM的幅值也是确定的,在此不考虑)。我们要配置的主要是Counter Settings(计数设置)中的Prescaler(预分频)、Counter Period(计数周期),PWM Generation Channel1中的Pulse。
首先来理解PWM在单片机内部产生的机制,如图1,斜线表示定时器的计数,假设记到1000再从0开始重新计数,单片机的机制是设置一个比较值(Comparison value),其中一种方案是,当计数值小于这个值时,对相应引脚赋为低电平,计数值大于这个值时赋为高电平,于是引脚的输出就变成了图2,以此来实现PWM的输出,并通过改变比较值来调节PWM的占空比。

HAL+Cube MX 学习之PWM_第5张图片
这里还有一个问题,就是前面说的计数值应该为多少合适,假设计数值只有10个,那么当比较值变化时,占空比就只能在在0%到100%之间以10%的幅度变化,如果,计数值为1000,那么当比较值变化时,占空比就能够在0%到100%之间以0.1%的幅度进行变化。计数值取得越大,PWM占空比精度越高,可以根据需要进行调节。

时钟原本的频率为72M,这里设置精度尽量高,Prescaler(预分频)设为1/8,Counter Period设为900 - 1,这样计数值为900,能保证精度。
HAL+Cube MX 学习之PWM_第6张图片
下面设置比较值,900 x 20% = 180,所以这个值为180。这里要特别注意,因为前面在使能PWM时Channel1里设置的是PWM Generation CH1,意思是计数值小于比较值输出高电平,高于比较值输出低电平,而Channel1里的另一个选项PWM Generation CH1 N是取反的意思,勾选这个之后计数值小于比较值时输出低电平,高于计数值时输出高电平,与前文的讲述一致。(这里与我们的日常认知不同,重点
HAL+Cube MX 学习之PWM_第7张图片

五、Generate Code

在对Project进行一些命名等设置之后就可以直接生成代码了
HAL+Cube MX 学习之PWM_第8张图片

HAL+Cube MX 学习之PWM_第9张图片

六、Coding in MDK

在keil中需要写的代码很简单,简单到只有一行:HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_y); // 使能timx的通道y
这里用的是TIM1的Channel1,所以只需要把HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); 插入到int main()中即可(注意要写到main中,否则会报错)
HAL+Cube MX 学习之PWM_第10张图片

七、Final Effect

用示波器对PA0进行测量(TIM1的Channel1对应的引脚为PA0)
HAL+Cube MX 学习之PWM_第11张图片
HAL+Cube MX 学习之PWM_第12张图片

哈,成功产生一个频率为20%的pwm!

————————————————2019.08.27———————————————

Supplement

通过另一个HAL库函数可以直接修改比较值从而起到改变PWM占空比的作用

__HAL_TIM_SET_COMPARE(&htimx, TIM_CHANNEL_y, z); // 修改timx的通道y的pwm比较值为z

比如想要让PWM占空比变为50%,只需修改z的值为450即可。通过这个函数,还可以让PWM占空比实时变化,只需要让z的值不断变化即可。(身边没有示波器,可自行验证……)
HAL+Cube MX 学习之PWM_第13张图片

你可能感兴趣的:(HAL+Cube,MX stm32开发)