STM32使用PWM(脉冲宽度调制)

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

一、PWM概述

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出(1或0)来对模拟电路进行控制的一种非常有效的技术。

PWM应用场景如下:

使用PWM信号控制温度。
使用PWM信号控制比例阀的开度。
使用PWM信号控制电机的转速(直流电机 步进电机 伺服电机)
使用PWM信号控制舵机的转向。

占空比:占空比是指在一个脉冲循环内,通电时间(可能是高电平,可能是低电平)相对于总时间所占的比例。

二、STM32的PWM分析

PWM产生框架图如下:

stm32pwm,stm32,stm32,单片机,嵌入式硬件

定时器部分是提供PWM周期,如在定时器1MHZ,计1000个数,那么PWM周期:1ms(周期不能过长)

stm32pwm,stm32,stm32,单片机,嵌入式硬件

输出极性:程序设置默认输出的电平。当通道有效,则输出默认的设置电平;通道无效,输出与设置的极性相反的电平(设置999为速度最快为高极性,反之为低极性)

PWM 模式 1–– 在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。

在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为无效状态( OC1REF=“0”),否则为有效状态( OC1REF=“1”)。

PWM 模式 2–– 在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为无效状态,否则为有效状态。

在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。

三、PWM产生的流程

1)使能定时器4和相关IO口时钟。
	PB6----TIM4_CH1
(2)使能定时器4和相关IO口时钟。
	使能定时器4时钟:RCC_APB2PeriphClockCmd();
	使能GPIOB时钟:RCC_AHB2PeriphClockCmd ();3)初始化IO口为复用功能输出。
	函数:GPIO_Init();
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;       //复用功能 4)初始化定时器:ARR,PSC等:
	TIM_TimeBaseInit();5)初始化输出比较参数:
	TIM_OC1Init();6)使能预装载寄存器: 
	TIM_OC1PreloadConfig(TIM4, 	TIM_OCPreload_Enable);7)使能自动重装载的预装载寄存器允许位	
	TIM_Cmd(TIM4, ENABLE);8)不断改变比较值CCRx,达到不同的占空比效果:
	TIM_SetCompare1();

示例代码

将这段代码放到你的工程文件中,将GPIO引脚号改为你的LED灯的引脚号,你将看到led灯以呼吸灯的形式闪烁。文章来源地址https://www.toymoban.com/news/detail-647472.html

void Pwm_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	 TIM_OCInitTypeDef TIM_OCInitStruct;
	//使能定时器4和相关IO口时钟。
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
	//初始化IO口为复用功能输出。
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;//引脚1
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//速率
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	//初始化定时器:ARR,PSC等:
	TIM_TimeBaseInitStruct.TIM_Period=2000-1;//周期数 计2000个数  在1000000HZ下 20ms 
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;//预分频 72HZ/720= 100000HZ
	TIM_TimeBaseInitStruct.TIM_ClockDivision=0;//分频因子 一个脉冲记一个数
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	//初始化输出比较参数:
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1
	TIM_OCInitStruct.TIM_Pulse = 0;//脉冲值
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//高极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//使能
	TIM_OC4Init(TIM3,&TIM_OCInitStruct);
	//使能预装载寄存器: 
	TIM_OC4PreloadConfig(TIM3, 	TIM_OCPreload_Enable); 
	//使能自动重装载的预装载寄存器允许位	
	TIM_Cmd(TIM3, ENABLE);
}
#include "stm32f10x.h"
#include "delay.h" 

//主函数
int main(void)
{
	int i;
	//中断优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	LED_Init();//初始化LED
	Pwm_Init();//设置定时器3输出PWM
	
	while(1)//呼吸灯
	{
		//从暗到亮
		for(i=1; i<499; i++)//定时器4重装载值为499
		{
			
			TIM_SetCompare1(TIM3,i);//根据i的值设置比较值,调整占空比
			delay_ms(20);//根据实际情况进行调整,方便观察效果
		}
		
		//从亮到暗
		for(i=499; i>0; i--)
		{
			
			TIM_SetCompare1(TIM3,i);
			delay_ms(20);
		}
	}
	return 0;
}

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

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

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

相关文章

  • 基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的PWM(脉冲宽度调制)应用

    STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR PCA辅助寄存器AUXR1 作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的单片机引脚 PCA工作模式寄存器CMOD 作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块以下功能 (1)、空闲情况下是否停止

    2024年02月08日
    浏览(49)
  • (STM32)PWM输出控制电机旋转并且使用编码器读取脉冲数

    目录  前言 一、pwm输出让电机转  1.电机的接线说明 2.驱动的接线说明 3.pwm输出代码  pwm.c pwm.h 4.输出pwm控制电机旋转 二、配置定时器编码器模式 1.定时器编码器模式 编码器原理 编码器相关的概念 2.编码器模式——代码部分 3.获取脉冲数 三、定时读取编码器读取的脉冲数

    2024年02月03日
    浏览(58)
  • 步进电机简单使用:STM32 PWM输出固定数目的脉冲数(基于CubeMX)

    使用步进电机之前,我们需要了解步距角的概念:步进电机接收到一个脉冲转动的角度,步进电机步距角通常 为1.8°,即步进电机接收到一个脉冲转动1.8°,则若步进电机接收到360°/1.8°=200个脉冲,步进电机就能转动一圈 步进电机通过驱动器控制,驱动器如下图所示(都比较

    2024年02月06日
    浏览(45)
  • STM32定时器输出PWM脉冲

    一、什么是PWM脉冲? PWM (Pulse Width Modulation) 脉冲宽度调制,通常应用于惯性系统中,( 不是不能即停的设备,因为如果设备不具有关心,那么运动是断断续续的,不具有连续性 ),通过脉宽调节输出不同的波形作用域受控对象。 二、 PWM中三个重要的参数 1.频率=1/Ts ;这个很

    2024年02月15日
    浏览(54)
  • STM32精准脉冲数PWM生成方法解答

    本文介绍了在STM32上生成精准脉冲数PWM的方法,包括使用定时器中断法和两个定时器结合产生PWM脉冲的方法。详细讨论了定时器的配置和工作原理,以及如何通过定时器控制脉冲的个数和周期。通过示例代码和硬件仿真,展示了如何实现精准的脉冲数PWM输出。

    2024年02月03日
    浏览(40)
  • 12.[STM32]PWM脉宽调制-舵机控制(一篇足以)

    🍌 🍌🍌 作者简介:大家好啊,我叫DW,每天分享一些我新学到的知识,期待和大家一起进步 🍋 🍋🍋 系列专栏: STM32 🍎 🍎🍎 🍎🍎🍎 🌞小实验目标:控制舵机旋转🌞 🍊如有写得不好的地方欢迎大家指正🍊 创作时间:🍊🍊🍊2022年5月2日🍊🍊🍊 在机器人机电控

    2023年04月15日
    浏览(40)
  • STM32主从模式实现两路同步PWM脉冲输出,频率、占空比可调

    原理:定时器1为主模式,定时器8为从模式,TIM1的定时器使能操作作为触发输出[TRGO]触发TIM8并使能TIM8的计数器,同时输出两路频率、占空比以及脉冲数量(小于256个,高级定时器重复计数功能为8位)可调PWM波形。 关键代码: 定时器1(TIM1)设为主模式: 定时器2(TIM8)设为从

    2024年02月13日
    浏览(42)
  • Proteus基于51单片机通过PWM脉冲调制控制电机转速_按键与串口控制转速_电机转速可测

    临近期末,学校的单片机课程需要做课程设计,主要内容是基于51单片机的可调速电机,具体要求如下,在此记录一下具体的一个解题方案。 要求利用单片机输出PWM波形,通过改变占空比,改变电枢两端电压的平均值,从而改变电动机的转速 通过按键进行手动速度调整(速度

    2023年04月14日
    浏览(68)
  • 【STM32F429】HAL库的PWM中断,精确控制脉冲数,控制步进电机

    这两天在调步进电机,希望是使得步进电机每次都达到期望的高度。在查了一天的资料,发现大部分上传的资料都是使用CubeMX生成的,可复制性很高,但未免有失可读性,故上传我的心得经验。 本来原子哥的例程里有整合度很高的,已经封装好的精确控制步进电机前进距离的

    2024年02月08日
    浏览(53)
  • 【STM32单片机】STM32控制SG90舵机的PWM部分参数的设置解答

    我们要知道,SG90舵机接收的PWM信号的参数:f=50Hz,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。 换句话说,我们要用单片机产生一个 周期(20ms) 的PWM波,然后获得对应这些时长(分别是 0.5ms 、 1ms 、 1.5ms 、 2ms 、 2.5ms )的 高电

    2024年02月13日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包