这里就不对STM32的PWM进行讲解了,想要了解的可以百度一下,这里主要说怎么实现。

  1、建立工程,我选的是STM32F103zet6芯片,选择定时器的PWM功能

  

  2、配置时钟,我这里配的是内部时钟,没有配外部时钟,而且不是最大时钟,有需要的可以自己改

  

  3、配置定时器,这里的话默认就可以,因为代码里面需要对配置的初始化代码进行修改的,而修改后才可以实现该功能

  

  4、生成代码后,修改代码,找到PWM初始化函数,修改为如下代码,注意要把初始化函数前面的 static 关键字也去掉,而且函数声明也要跟着修改

void MX_TIM4_Init(uint16_t pre,uint16_t pul) //修改初始化函数,改变频率与PWM
{
//占空比=Pulse/Period;频率:f=48M/pre/per TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC; htim4.Instance = TIM4;
htim4.Init.Prescaler =pre; //分频(关键)
htim4.Init.Period = -;//计数周期 (关键,若100的计数周期对于一些频率跟占空比误差大的话,可以自己计算更改调试计数周期大小)
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
} sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = pul;//脉冲计数(关键)
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
} HAL_TIM_MspPostInit(&htim4); }

  5、接着在自己需要的代码里插入,PWM开始停止函数就可以啦

HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); //PWM开启函数
MX_TIM4_Init(uint16_t pre,uint16_t pul); //改变参数就可实现改变占空比跟频率的目的了
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);//停止PWM

  这里我说一下核心部分:占空比 = (Pulse/Period)*100%;频率: f = 48M/Prescaler/Period;影响PWM占空比跟频率的参数这主要是 Pulse、Prescaler、Period 这3个;频率跟占空比都与Period(计数周期)有关,只要我们把计数周期定下来,修改Prescaler、跟Pulse这两个值,就可以直接修改PWM的频率跟占空比了。具体要多少的占空比跟频率,就自己计算一下就可以了。举个例子说明一下:这里Period设为100,如果我要设定一个频率为1500Hz、占空比5%的PWM波,只需要传入参数Pulse=5(占空比 = Pulse / Period * 100% =(5/100) * 100%=5%)、Prescaler=320(f = 系统频率 / 分频 / 计数周期 = 48M/320/100 = 1500Hz)即可,逻辑分析仪采集结果如下图:

  

补充一点:如果频率要求快,而且精度要求高的,就选用晶振大的 STM32 系列,晶振大误差就小,这里如果定好占空比的话,只调频率可以调到很准确,或者定好频率调占空比也是一样,如果要同时改变频率跟占空比,频率高了就会有误差了,所以选用大晶振可以减小点误差。

附一个我自己算出来的频率占空比表(已全部用示波器调试验证):

  

STM32 Cubemx 输出可调频率与占空比的PWM的更多相关文章

  1. STM32F4_TIM输出PWM波形(可调频率、占空比)

    Ⅰ.概述 上一篇文章关于STM32基本的计数原理明白之后,该文章是在其基础上进行拓展,讲述关于STM32比较输出的功能,以输出PWM波形为实例来讲述. 提供实例工程中比较实用的函数:只需要调用该函数, ...

  2. 基于STM32F030F4P9和STM32 CUBEMX 输出PWM波形

    STM32F030F4P9定时器功能比较丰富,在此记录项目中使用其自动输出PWM波形(频率:50HZ).CubeMX配置定时器如下图说明. 在此定时器基础时钟为48MHZ,配置中不做分频处理,预分频系 ...

  3. STM32 精确输出PWM脉冲数控制电机(转)

    STM32 精确输出PWM脉冲数控制电机 发脉冲两种目的1)速度控制2)位置控制 速度控制目的和模拟量一样,没有什么需要关注的地方发送脉冲方式为PWM,速率稳定而且资源占用少 stm32位置控制需要获 ...

  4. STM32—TIMx输出PWM信号驱动MG996R舵机

    文章目录 一.前言 二.MG996R舵机简介 三.TIM定时器简介 四.通用定时器TIMx 1.TIMx主要功能 2.TIMx框图 3.计数单元 4.时钟选择 5.输出比较PWM 五.TIM3输出双路 ...

  5. STM32 CubeMx使用教程

    一.STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以 ...

  6. stm32定时器输出移相PWM(非主从模式)

    背景:由于项目需要,需要stm32输出任意相角度的PWM 前提知识: 1.stm32定时器的Tim,一般有多个OC.具体差别根据型号来定. 2.定时器的使能,理论上是多个通道同时使能 3.TIM_OC ...

  7. 【转】STM32定时器输出比较模式中的疑惑

    OCx与OCxREF和CCxP之间的关系 初学STM32,我这个地方卡了很久,现在终于有些明白了,现在把我的理解写下与大家共享,如果有不对的地方,还请指出. OCxREF就是一个参考信号,并且约定: ...

  8. STM32学习日志--使用DMA功能自动更新PWM的输出

    /******************************************************************************* 编译环境: EWARM V5.30 硬 ...

  9. (stm32f103学习总结)—stm32 PMW输出实验

    一.PWM简介 PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制.它是利用微处理器的数字输出来对模拟电路进行控 制的一种非常有效的技术,其控制简 ...

随机推荐

  1. IDEA解决中文乱码问题

    idea在使用过程中经常会遇到各种乱码问题,网上也有很多解决办法,今天所讲的就是终极解决办法: (1)首先,全局搜索文件 idea64.exe.vmoptions 找到之后,将该行代码复制进去即可   ...

  2. 【hihocoder 1312】搜索三·启发式搜索(普通广搜做法)

    [题目链接]:http://hihocoder.com/problemset/problem/1312?sid=1092352 [题意] [题解] 从末状态的123456780开始逆向搜; 看它能到达 ...

  3. 普通androidproject转换为C/C++project之后,再还原成androidproject的解决方式

    我们在调试android程序时,可能会把androidproject转换成C/C++project,或者Add Native Support.可是,我们怎么把C/C++project还原成普通的and ...

  4. 【零基础入门学习Python笔记013】元祖:戴上了枷锁的列表

    元组:戴上了枷锁的列表 因为和列表是近亲关系.所以元祖和列表在实际使用上是很相似的. 本节主要通过讨论元素和列表究竟有什么不同学习元祖. 元组是不可改变元素的.插入.删除或者排序都不能够.列表能够随意 ...

  5. 【iOS开发系列】XIB IBOutlets use strong or weak ?

    有人问.在ARC下,IBOutlets究竟应该定义成strong 还是 weak ?支持这个答案的人最多.答案仅是摘自官方文档的一个片段: From a practical perspective, ...

  6. Unity特殊目录和脚本编译顺序

     特殊目录和脚本编译顺序 大多数情况下,您能够选择不论什么你喜欢的目录在您的项目的名称.但unity储备一些名称以指示内容有一个特殊的用途.这些目录中有些会影响脚本编译的顺序.从根本上说,有四个单 ...

  7. ROS-SLAM仿真-cartographer

    前言:cartographer是谷歌2016年发布的一个开源slam算法,采用基于图网络的优化方法,主要基于激光雷达来实现. 使用源码编译方式. 一.新建工作空间 1.1 使用roboware新建名为 ...

  8. Spark RDD概念学习系列之RDD接口

    不多说,直接上干货!

  9. Centos7 minimal 系列之rabbitmq安装(八)

    一.安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. 这种方法网站访问不了 wget https://packages.erlang-solutions.com/ ...

  10. Codeforces 991E. Bus Number (DFS+排列组合)

    解题思路 将每个数字出现的次数存在一个数组num[]中(与顺序无关). 将出现过的数字i从1到num[i]遍历.(i from 0 to 9) 得到要使用的数字次数数组a[]. 对于每一种a使用排列组 ...