STM32定时器输出PWM脉冲

这篇具有很好参考价值的文章主要介绍了STM32定时器输出PWM脉冲。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是PWM脉冲?

PWM (Pulse Width Modulation) 脉冲宽度调制,通常应用于惯性系统中,(不是不能即停的设备,因为如果设备不具有关心,那么运动是断断续续的,不具有连续性),通过脉宽调节输出不同的波形作用域受控对象。

二、 PWM中三个重要的参数

1.频率=1/Ts ;这个很好理解,就是在单位时间内输出的波形的个数啦。

STM32定时器输出PWM脉冲

 文章来源地址https://www.toymoban.com/news/detail-611468.html

2.占空比= Ton/Ts; 在一个脉冲周期内,脉冲波形中高电平的宽度占整个周期内波形宽度的比值。

STM32定时器输出PWM脉冲

3.分辨率=占空比变化步距,指PWM最小能设定到的高电平时间所占周期的比例,也即最小占空比,意思就是把一个周期的时间分成了多少份,如果是10份,那么占空比的精度就为10%。如果分成1000份,那么占空比的精度就为0.1%。譬如频率为600HZ的PWM,若最小能给到的时钟是60kHZ,则分辨率即为(1/60k)/(1/600)=1%。在同一个系统中,由于时钟不变,提高频率,则周期变小,分辨率会变大。(前面的话可能不太好理解,那我就以自己的大白话给大家解说一下吧: 说白了其意思就是说把一个波形脉冲分成了多少分,例如分辨率为0.1%,那就是把一个波形脉冲分割成了1000分,分别由不同份数的高低电平组个,例如占空比为50%d的脉冲,那就是有500份高电平,500份低电平,注意是连续的

三、 PWM脉冲输出配置(重点来啦)

事实上,需要输出PWM脉冲,仅需要进行两部分寄存器的配置,分别是时基单元(前面定时器中断的时候已经详细说过这里不再赘述)、输出比较单元的配置。首先看一下基本的结构如图3所示。

定时器在不断进行计数,其CNT不断增大,(我这里说的是向上计数),同在不断的与CRR(使用者自己设定的值)寄存器的值进行比较,通过比较与CRR的值大小关系,与设定的模式进行工作,具体的模式如图4所示。

本试验使用的是PWM1 模式,计数的方式使用向上计数。其中计数从0到A点的工程中CNT<CRR,输出有效电平(高电平),A点到B点过程中CNT>=RCC,输出无效电平(低电平),这就完成了一个波形输出,不断的循环便能输出一系列波形。

STM32定时器输出PWM脉冲

 

STM32定时器输出PWM脉冲

STM32定时器输出PWM脉冲

四、 具体程序

好了废话不多说下面我们一起来看看具体的代码吧。这里是输出占空比 0---->100,100--->0不断变化的的脉冲波,其频率为1000HZ,分辨率为1%.

CODE  :PWM.c

#include"pwm.h"
void PwmInit(void)
{
//打开定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //定时器2是通用定时器,其时钟挂在到APB1时钟线上
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE); //打开对应的GPIO的时钟,注意这里不同的外设可能挂载的时钟不同,所以需要看原理图,


GPIO_DeInit(GPIOA);// 注意这里的函数非常的重要,这里是将对应的GPIO端口初始化成默认的样子,因为这个端口可能在以前使用过,其他的配置可能发生了改变
GPIO_InitTypeDef GPIOC_LED_PWM_Init; // 定义GPIO的结构体,也就是外设的结构体
GPIOC_LED_PWM_Init.GPIO_Pin= GPIO_Pin_0; // 配置需要使用的引脚
GPIOC_LED_PWM_Init.GPIO_Mode=GPIO_Mode_AF_PP; //配置引脚的输出的模式,这里使用大额CH1输出波形,所以是复用模式
GPIOC_LED_PWM_Init.GPIO_Speed=GPIO_Speed_50MHz; // 配置输出的频率,这个在输入的时候不需要配置
GPIO_Init(GPIOA ,&GPIOC_LED_PWM_Init); // 使用初始化函数初始化刚刚定义的结构体,以及对应的GPIO端口
//配置定时器2的时钟源来自内部时钟源,其实这里系统默认的就是内部时钟,所以这一步配置可以省去
TIM_InternalClockConfig(TIM2);
//定时器结构体配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1 ; //内部时钟分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=100-1; //定时器溢出值
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1; //分频系数
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; //这里使用的是通用定时器没有复用计数功能,这里设置为0
//配置定时器2初始化
TIM_TimeBaseInit(TIM2 ,&TIM_TimeBaseInitStructure);
TIM_Cmd(TIM2,ENABLE); //使能定时器

//配置比较输出单元
TIM_OCInitTypeDef PwmStruct;
TIM_OCStructInit(&PwmStruct); //给结构体赋初值,保证结构体中每一个变量都有初始值,防止使用高级定时器的时钟时出现错误,应为通用定时器不具有某一个功能
PwmStruct.TIM_OCMode=TIM_OCMode_PWM1; // 输出模式
PwmStruct.TIM_Pulse=0; //CCR
PwmStruct.TIM_OutputState=ENABLE; // PWM 输出使能
PwmStruct.TIM_OCPolarity= TIM_OCPolarity_High;
TIM_OC1Init(TIM2,&PwmStruct);
}
//程序运行过程中设置不同的占空比
void PWM_SetCompare1(uint16_t Compare)
{

TIM_SetCompare1(TIM2 ,Compare);

}

 CODE :main.c

int main(){
Led_funcing();
PwmInit();
uint8_t i;
while(1)
{
for(i=0;i<=100;i++)
{
PWM_SetCompare1(i);
delay(100);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare1(100-i);
delay(100);
}
}
}

有条件的宝宝可以使用LED灯 马达自己模拟一下,我是用的是仿真模式输出。

STM32定时器输出PWM脉冲

 好啦,今天就给大家分享到这里,如有错误和不合理的地方请大家指正。

 

到了这里,关于STM32定时器输出PWM脉冲的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32TIM定时器PWM输出比较(适用于通用,高级定时器)

    在定时器中我们最常用的功能就是输出PWM,大多是用在电机控制方面,目前网络上相关资料也有很多,但是,很多不利于我们“现搜现用”我这里不是说我写的有多好,而是你搜索到此类文章时大部分是急于解决目前的问题,一段相关代码和讲解就行,当然不是学习背后的原

    2024年01月25日
    浏览(27)
  • STM32(7)-定时器输出PWM的原理分析

    概念+代码 OC(Output Compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的前3个通道额外拥有死区生成和互补输出的功

    2024年02月04日
    浏览(27)
  • STM32使用CubeMx配置定时器输出PWM

            项目中经常使用到STM32来输出PWM,每次配置过后过不了多久就会忘记,稍微需要对配置做出修改时都要翻很久的手册,所以决定结合实例把PWM配置的详细步骤记录下来,这样在下次配置时可以很快的捡起来。         本文档的行文结构如下,首先,说明实际需

    2024年02月03日
    浏览(34)
  • STM32使用高级定时器输出互补pwm波

    最近做的一个项目用到stm32,网上查了很多资料,也踩了很多坑,这里记录一下配置的步骤和说明 硬件使用的是stm32h750vbt6; 软件用到了stm32cubemx和keil5; 打开Debug模式方便调试,可以忽略,不影响代码运行 在用cube配置时钟源时,有下面三个选项 Disable(禁用) BYPASS Clock Sou

    2024年02月16日
    浏览(22)
  • stm32定时器输出pwm&IO口模拟pwm——呼吸灯

    什么是pwm波?pwm就是脉冲宽度调制,就是占空比可变的脉冲波形,通过改变占空比,输出不同的pwm波,就能实现许多有趣的功能,比如说我们生活中常见的呼吸灯就是通过这样实现的。接下来我们就以呼吸灯为例,学习stm32通过定时器输出pwm波和io口模拟输出pwm波。 控制方式就

    2024年01月18日
    浏览(27)
  • STM32笔记——定时器输出比较功能(产生PWM波)

    目录 一、概述 二、PWM简单介绍  三、通用定时器输出比较 3.1 输出比较简介 3.2 输出比较通道 3.3 产生PWM的过程 四、实验硬件介绍及PWM模块程序 4.1 舵机简介 4.2 直流电机及驱动芯片TB6612  4.3 PWM模块驱动程序         主要介绍通用定时器输出比较功能,在GPIO口输出PWM来控

    2024年02月13日
    浏览(17)
  • STM32高级定时器输出指定数量PWM(STM32CubeMx配置)

    高级定时器中有一个重复计数器,本实验输出指定个数PWM就是利用了重复计数器的特性,先来看看重复计数器的特性是什么: 计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件 这是什么意思呢,这里举个例子比如说我设定重复计数器的

    2024年02月02日
    浏览(41)
  • STM32实战-高级定时器带死区的互补PWM输出

    前言: 平时我们设计点击驱动电路时,一般会采用npn和pnp三极管,来控制电机的导通和关闭,但是三级管内部自带电容,断电后不会立马断掉,会经过很小的一段时间才会放电完毕,这时候要留有死区给电容放电,这就有了互补pwm波。   同时,当电机出现故障,如果利用软

    2024年02月08日
    浏览(20)
  • stm32f407单一定时器输出四路PWM波

    最近在玩遥控器多路pwm捕获,顺带着写了一下pwm波输出的代码,下面我来说一下407板子输出pwm波的具体配置及函数说明。 输出效果如下。PS:因为我的分析仪只能接一个,就只看一路的输出 1、开启时钟及定时器引脚复用 在输出PWM波时要开启定时器时钟及GPIO时钟,本例以TI

    2024年02月12日
    浏览(12)
  • HAL库STM32常用外设教程(一)—— 定时器 输出PWM

    本篇文章为个人参考总结所用,如果错误还望指出。 涉及的知识: 1、STM32CubeMx的部分使用 2、PWM原理及常用概念 3、用单片机生成一定频率的PWM 用到的软件及单片机: 1、STM32CubeMx 2、IDE: MDK-Keil软件 3、芯片:STM32F407ZGT6 4、开发板:正点原子探索者 注:不同型号的单片机实现

    2024年02月02日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包