前言:
之前做无人机的时候和pwm是经常打交道,不过最近这一年多由于“转行”已经很久不接触了,但是还是会在论坛默默潜水,发现好的资料也还是会仔细阅读,今天就分享一篇关于pwm的文章。

素材来源:http://www.openedv.com

首先,本人虽然初学STM32但极力反对一种误人子弟的观点:“对于STM32这样级别的MCU,有库函数就不用去看寄存器怎么操作的了!”

好了,言归正传,最近总看到很多朋友对于PWM这个实验有很多的疑惑,看到原子也在极力的回复也挺累的(体谅一下幸苦的原子大神,(__) ),所以我打算写这么一篇文字来阐述一下我个人对STM32的PWM的理解。

首先来说,你要使用PWM模式你得先选择用那个定时器来输出PWM吧!除了TIM6、TIM7这两个普通的定时器无法输出PWM外,其余的定时器都可以输出PWM,每个通用定时器可以输出4路PWM,高级定时器TIM1、TIM8每个可输出7路PWM,这里为了方便起见,我们选择与实验相同的TIM3的通道2来说明。选好定时器及通道后,下一步就是要使能定时器的时钟,根据需要看看是否需要重映射IO,然后就是配置输出PWM的IO及定时器,到这里原子的视频及例程都有详细的介绍,这里只需要提一点有些网友疑惑的TIM_TimeBaseStructure.TIM_ClockDivision = 0;这句话是什么作用?其实仔细看过技术手册后发现这句话与PWM输出实验其实是没关系的,这句话是设置定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例的(与输入捕获相关),0表示滤波器的频率和定时器的频率是一样的。至于其余部分,我就不再赘述。做完这些准备工作后,我就针对大多数朋友疑惑的地方——PWM模式的初始化设置做一个详细的阐述:先贴代码
1 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
3 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
4 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
5 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器,即TIM3_CCR2的预装载值在更新事件到来时才能被传送至当前寄存器中。
6 TIM_Cmd(TIM3, ENABLE); //使能TIM3
这6句话就把PWM的通道配置好了,一句句来解释:
这里原子选择的PWM2模式,为什么选择的是PWM2模式呢?为什么不选择PWM1模式呢?两者又有什么区别呢?下面我们就一探究竟,PWM1和PWM2模式是由CCMR1的OC1M和OC2M来决定的,因为我们选择的是是通道2,所以设置的是OC2M,再看相关介绍
OC1M[2:0]:输出比较1模式(Output compare 1 enable)
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电
平。
看到红色的“有效电平”了吧,那么这又是谁定义的呢?别急,再看手册,可知它是由CCER这个寄存器的CCxP来决定的这里是通道2,所以是CC2P,继续看介绍

CC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity) 位1
CC1通道配置为输出:
0:OC1高电平有效
1:OC1低电平有效
现在很清楚了吧,又因为第3句,TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高,所以这里我们设置的CC2P是0,也就是默认的OC2高电平有效。这样第3句话也捎带着解释了,哈哈!由于我们的战舰板的LED是低电平亮,而刚开始的给CC2P用来设置占空比的led0pwmval为0它是小于等于TIM3_CNT的,也就符合TIMx_CNT>=TIMx_CCR1时通道2输出有效电平,也就是高电平,所以你把原子的例程原封不动的Down到板子里,会看到刚上电,LED灯是不亮的。现在这块明白了吧!若你觉得还是不爽,我就非得用PWM1模式,那也可以,就像有个网友说“我拿原子的PWM Code就改了一个PWM1模式,按原子讲的PWM1和PWM2的输出是相反的啊,可是我上电发现LED是常亮的啊?怎么回事啊,求解释啊。。。”我们来分析一下这位朋友的代码,他把PWM2改成了PWM1,别的什么都没动,那么现在符合“PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平”
,否则为无效电平。“结果必然是就是LED长亮喽,要想得到跟原代妈一样的效果,那就把CC2P设置成1,OC2低电平有效,这样就可以了,有兴趣的朋友可以动手试试!(实践出真知吗!)

四轴无人机那些事 番外篇 4 关于PWM模式的理解相关推荐

  1. 四轴无人机那些事 番外篇 2 加速度计

    加速度计原理:    加速度传感器实际上是用MEMS技术检测惯性力造成的微小形变,把加速度传感器水平静止放在桌子上,它的Z轴输出的是1g的加速度.因为它Z轴方向被重力向下拉出了一个形变.可惜的是,加速 ...

  2. 四轴无人机那些事 番外篇 3 磁罗盘

    地磁的北极在地理的南极的附近 地磁的南极在地理的北极的附近 磁体的同名磁极相斥,异名磁极相吸 所以指南针的北极总是指着地理的北极(地磁的南极) 1.红色指针指向北面,白色指针指向南面.在表盘上&quo ...

  3. 番外篇1-对于分布式服务器的理解

    (1)前期知识 1.单机结构:单个服务器计算机 –单个服务器容载量有限 ->> 2.集群结构(负载均衡调度器+多个服务器充当节点) ----当增加节点无法提高显著提高集群性能(高吞吐量(t ...

  4. 设计牛人——设计入门答疑番外篇有感

    看了老牛(牛MO王)的U1番外篇问答感慨非常多,事实上自己也算不上入门非常久的大师,只是有时间去整理整理自己在网页设计方面的经验分享给大家是一件非常好的事情,尤其是对一些想做设计或者想在设计方面转行的 ...

  5. Soul网关源码阅读番外篇(一) HTTP参数请求错误

    Soul网关源码阅读番外篇(一) HTTP参数请求错误 共同作者:石立 萧 * 简介     在Soul网关2.2.1版本源码阅读中,遇到了HTTP请求加上参数返回404的错误,此篇文章基于此进行探索 ...

  6. IO多路复用(番外篇)、poll、epoll三者的区别

    Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本 ...

  7. 面试官画像(十年沉浮 | 番外篇)

    有面试,就有面试官.他们的作用,说好听点,就是找到志同道合的人,共同缔造可期待的明天. 但不总是这样.面试官也是人,所以这个过程依然精彩.本篇是<程序员画像,十年沉浮>的番外篇,xjjdo ...

  8. 揭开 Growth Hacking 的神秘面纱(番外篇)+ 大结局

    揭开 Growth Hacking 的神秘面纱(番外篇)+ 大结局 覃超帝国兴亡史  12月11日 11:45 FACEBOOK  互联网  分类 :互联网 阅读:1527 抢沙发 Growth Ha ...

  9. [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法

    数学之美番外篇:平凡而又神奇的贝叶斯方法 Tags: 数学, 机器学习与人工智能, 计算机科学 save it69 saved tags: 贝叶斯 math bayesian algorithm 数学 ...

最新文章

  1. 【C++自我精讲】基础系列二 const
  2. 评价指标:目标检测的评价指标 - mAP
  3. 腾讯----小Q的歌单
  4. 流畅的Python 5. 函数
  5. LeCun:放弃深度学习吧,AI的未来是能量学习
  6. 大理大学日常作业计算机基础知识,大理学院成人高等教育大学计算机基础课程作业.doc...
  7. ValueError: This model has not yet been built. Build the model first by calling `build()` or calling
  8. 我用Python爬了点你们需要的电影,这些电影真的很不错~
  9. DNS协议及Bind应用
  10. 游戏运行库microsoft visual c++ 2010 spi 64检测不到
  11. Android开发学习之摇一摇功能的简单实现
  12. 使用Python获取上市公司资讯,并进行判断利好利空消息(判断部分待更新)
  13. win10系统怎么去除桌面图标的小箭头
  14. 【GIS教程】ArcGIS做日照分析(附练习数据下载)
  15. 14种异常检测方法汇总
  16. 万变不离其宗之ZYNQ启动介绍
  17. 训练网络时,loss损失的问题
  18. 什么是单例模式以及单例模式的几种实现
  19. LCD驱动源码分析(s3cfb.c)
  20. dfs与bsf问题合集

热门文章

  1. kafka教程之linux安装教程(一)
  2. c语言 Linux CURL发送Http get请求 带参数
  3. Windows 10版本business_editions和consumer_editions的区别
  4. keilU5中.lib文件的生成与调用
  5. JVM致命错误日志(hs_err_pid.log)解读
  6. git 如何进行版本回退?
  7. 查看LINUX放开端口,linux如何查看端口是否开放?
  8. 谈谈英语学习(5):听力
  9. 有C++/C的java学习
  10. 图像金字塔(Python实现)