记录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(水晶/陶瓷 谐振器,可理解为时钟来源选择为外部晶振)(后续文章中可能会有关于晶振的学习记录,敬请期待!)


现在就可以将时钟频率设置为最大,stm32f103RC频率最大为72M。如果时钟来源不选择为外部晶振的话,频率最大只能选择为64M,可自行尝试。

三、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中对芯片引脚进行操作。

四、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的占空比。


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

时钟原本的频率为72M,这里设置精度尽量高,Prescaler(预分频)设为1/8,Counter Period设为900 - 1,这样计数值为900,能保证精度。

下面设置比较值,900 x 20% = 180,所以这个值为180。这里要特别注意,因为前面在使能PWM时Channel1里设置的是PWM Generation CH1,意思是计数值小于比较值输出高电平,高于比较值输出低电平,而Channel1里的另一个选项PWM Generation CH1 N是取反的意思,勾选这个之后计数值小于比较值时输出低电平,高于计数值时输出高电平,与前文的讲述一致。(这里与我们的日常认知不同,重点

五、Generate Code

在对Project进行一些命名等设置之后就可以直接生成代码了

六、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中,否则会报错)

七、Final Effect

用示波器对PA0进行测量(TIM1的Channel1对应的引脚为PA0)

哈,成功产生一个频率为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相关推荐

  1. STM32 Cube MX学习笔记——TOF 高速单线激光雷达 L10(usart)

    STM32 Cube MX学习笔记--TOF 高速单线激光雷达 L10_串口中断通信 1. TOF 高速单线激光雷达 L10 2. STM32 Cube MX配置 3.代码配置 4.编译 烧录 显示 ...

  2. SMT32F407+FreeRTOS+LWIP+LAN8720使用Cube MX情况下无法实现网线热插拔

    项目场景: STM32F407+LAN8720使用Cube MX HAL库生成工程: 问题描述 使用Cube MX生成STM32F407+Free RTOS + LAN8720工程,在可以ping通后 ...

  3. STM32+Cube MX使用MPU6050 DMP时,在外部中断中调用read_dmp函数发生系统卡死问题的根本原因分析

    系统环境 硬件: MCU:STM32F405RGT6 IMU:MPU6050 软件: 开发环境:KEIL MDK-ARM uVision5 MPU6050使用DMP 复现步骤 程序中MPU6050 D ...

  4. 【STM32】标准库与HAL库对照学习教程六--位带操作

    [STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...

  5. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  6. 【STM32】标准库与HAL库对照学习教程十三--软件IIC控制AT24C02

    [STM32]标准库与HAL库对照学习教程十三--软件IIC控制AT24C02 一.前言 二.准备工作 三.AT24C02(EEPROM)介绍 1.AT24C02简介 2.引脚功能 3.设备地址 四. ...

  7. 【STM32】标准库与HAL库对照学习教程外设篇--红外避障传感器

    [STM32]标准库与HAL库对照学习教程外设篇--红外避障传感器 一.前言 二.准备工作 三.红外避障传感器 1.传感器原理说明 2.传感器特性 四.标准库使用红外传感器 1.实验程序 2.实验效果 ...

  8. 【STM32】STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲

    [STM32]STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲 一.前言 二.时钟是什么 三.时钟树 1.时钟树图 2.时钟树讲解 左边部分 中间部分 右边部分 特殊部分 四.初始化 ...

  9. 蓝桥杯STM32G431RBT6学习——定时器PWM输出

    蓝桥杯STM32G431RBT6学习--定时器PWM输出 前言 PWM波输出作为定时器的一个常用功能,也属于高频的考点.从数据手册的定时器解析可以了解到(上篇描述):除了基本定时器(TIM6.7)外, ...

最新文章

  1. Java接口和Java抽象类
  2. 攻防世界Reverse第十一题csaw2013reversing2
  3. 每天一个JavaScript实例-canvas绘图
  4. LeetCode 第 19 场双周赛(231 / 1120,前20.6%)
  5. 连接真机开发安卓(Android)移动app MUI框架 完善购物车订单等页面——混合式开发(五)
  6. eclipse中maven工程添加本地库至Maven Dependencies
  7. MVC+EF 入门教程(四)
  8. keras 多分类一些函数参数设置
  9. linux系统 锐捷_linux系统的锐捷安装
  10. 计算导论与c语言基础pdf下载,Cousera 计算导论与C语言基础 学习笔记
  11. 使用npm运行react程序报错The 'mode' option has not been set, webpack will fallback to 'production' for th
  12. 国家级专精特新小巨人企业是什么?
  13. 读书《AB实验:科学归因与增长的利器》(刘玉凤)
  14. 开源HIDS OSSEC部署与扩展使用(安检)
  15. Himall商城表单数据类、插件类
  16. 快速获取一个网站的所有资源,图片,html,css,js......扒站,仿站必备工具
  17. js中call()方法的用法
  18. 一个40岁老码农的总结,奋斗没有意义,选择大于努力
  19. mysql支持存储emjoy表情
  20. 激光主要性能参数(一)--波长

热门文章

  1. Python编程:itertools库排列组合
  2. PUCCH(2)格式与DTX检测(源于5G上行控制信道增强技术研究)
  3. 2010高分传记剧情《国王的演讲》DVD中英双字1024高清
  4. 组装一台计算机的配置,2000元组装一台i7迷你主机电脑配置推荐
  5. 什么是Cookie?怎样设置和读取Cookie?
  6. php面试题之PHP核心技术
  7. 喵星球上的点名(后缀自动机+dfs序+莫队)
  8. 提升效率:优化Java代码的35个小技巧
  9. micro-ros arduino esp32 ros2 笔记
  10. 如何通过看电影学英语来源