第六篇,STM32脉冲宽度调制(PWM)编程

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

1.PWM概念

PWM叫脉冲宽度调制(Pulse Width Modulation),通过编程控制输出方波的频率和占空比(高低电平的比例),广泛应用在测量,通信,功率控制等领域(呼吸灯,电机)。

第六篇,STM32脉冲宽度调制(PWM)编程

    PWM由定时器驱动,PWM周期就是定时器的周期,为了调节占空比,需要在定时器的基础上加上一个比较计数器,同时需要GPIO输出波形。

第六篇,STM32脉冲宽度调制(PWM)编程

——————————————————————————————————————————

2.stm32中的PWM

    stm32中的PWM属于定时器功能,通过配置定时器就可以使用PWM,除了定时器的基本配置以外,还要加入一个比较计数值确定翻转电平的时机,还需要GPIO的复用功能输出PWM。

    stm32中PWM高低电平的顺序是由极性,PWM模式和计数模式共同决定。极性决定默认电平(有效电平),PWM模式指的是一个周期内有效电平和无效电平的顺序。

第六篇,STM32脉冲宽度调制(PWM)编程

 第六篇,STM32脉冲宽度调制(PWM)编程

    —————————————————————————————————————————

3.使用库函数实现PWM配置D1为呼吸灯

(1)开启时钟

GPIOF时钟 TIM14时钟,函数略

(2)初始化GPIO为复用功能

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(...);  函数略

(3)将定时器14通道1的复用功能映射到PF9

第六篇,STM32脉冲宽度调制(PWM)编程

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF); 
参数:     GPIOx - 哪一组GPIO     

           GPIO_PinSource - 哪个GPIO引脚     

           GPIO_AF - 哪个复用功能(只能映射具有的复用功能)

(4)初始化定时器

TIM_TimeBaseInit(......); 函数略

(5)初始化PWM

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

      参数:     TIMx - 哪个定时器     

                TIM_OCInitStruct - 初始化结构      
typedef struct {

  uint16_t TIM_OCMode;        /*!< PWM模式 */   
  uint16_t TIM_OutputState;   /*!< 输出状态使能 */   
  uint16_t TIM_OutputNState;  /*!< 忽略  */

  uint32_t TIM_Pulse;         /*!< 比较计数值 */   

  uint16_t TIM_OCPolarity;    /*!< 极性  */   
  uint16_t TIM_OCNPolarity;   /*!< 忽略 only for TIM1 and TIM8. */   uint16_t TIM_OCIdleState;   /*!< 忽略 only for TIM1 and TIM8. */   uint16_t TIM_OCNIdleState;  /*!< 忽略 only for TIM1 and TIM8. */ 
} TIM_OCInitTypeDef;  

  

(6)使能PWM的预装载和重装载功能

TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); 
TIM_ARRPreloadConfig(TIM14, ENABLE);

(7)启动定时器

TIM_Cmd(...); //高级定时器(TIM1/TIM8),还需要开启另一个开关 void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

参数:     TIMx - 哪个定时器    

           NewState - ENABLE/DISABLE

(8)运行时可调节占空比

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1);
 参数:     TIMx - 哪个定时器     
            Compare1 - 新的比较值 

__________________________________________________________________________________________________________________________________________________________

使用库函数配置GPIOF,通用定时器TIM14,使得D1灯呼吸闪烁,代码实现如下:

pwm.c

#include <stm32f4xx.h>
#include <pwm.h>

void timer14_pwm_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	
	//1.开启GPIOF和TIM14时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
	
	//2.初始化PF9为复用功能
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//高速
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//PF9
	GPIO_Init(GPIOF,&GPIO_InitStruct);
	
	//3.将PF9复用映射到TIM14
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
	
	//4.初始化定时器14 84M / 84 = 1MHz 1M ------ 1000 ----- 1ms
	TIM_TimeBaseInitStruct.TIM_Prescaler = 84-1;//预分频系数
	TIM_TimeBaseInitStruct.TIM_Period = 1000-1;//初始计数值
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;//向下计数
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟因子
	TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStruct);
	
	//5.PWM初始化
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;//低电平有效
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//使能
	TIM_OCInitStruct.TIM_Pulse = 800;//比较计数值
	TIM_OC1Init(TIM14,&TIM_OCInitStruct);
	
	//6.使能PWM的预装载和重装载功能
	TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(TIM14, ENABLE);
	
	//7.使能定时器14
	TIM_Cmd(TIM14,ENABLE);
}

主函数main.c

#include <stm32f4xx.h>
#include <includes.h>

int main()
{	
	u32 comp = 0;
	
	//1.中断优先级分组 2:2
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	//初始化
	//led_init();
	//key_init();
	beep_init();
	exti_init();
	mq2_init();
	delay_init();
	//timer2_init();
	//timer10_init();
	timer14_pwm_init();
	
	//D1为呼吸灯
	while(1){
		//1s从最暗到最亮
		while(comp<1000){
			TIM_SetCompare1(TIM14,comp);
			comp++;
			delay_ms(1);
		}
		
		//1s从最亮到最暗
		while(comp>0){
			TIM_SetCompare1(TIM14,comp);
			comp--;
			delay_ms(1);
		}
		
		delay_ms(200);
	}
	
}

其余模块函数的实现代码看其他章节文章来源地址https://www.toymoban.com/news/detail-407059.html

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

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

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

相关文章

  • STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

    本篇博客以STM32F103C8为例,其他系列MCU可能稍有不同,但原理一样。 相关链接博文: STM32CubeMX | STM32使用HAL库实现定时器PWM输出 STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量 1、介绍 以前写过一篇博文,介绍的是如何使用定时器的输入捕获功能测量脉冲的宽度以及周期,适

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

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

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

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

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

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

    2023年04月15日
    浏览(30)
  • (STM32)PWM输出控制电机旋转并且使用编码器读取脉冲数

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

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

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

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

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

    2024年02月06日
    浏览(32)
  • 【STM32F429】HAL库的PWM中断,精确控制脉冲数,控制步进电机

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

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

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

    2023年04月14日
    浏览(53)
  • 【STM32学习】——定时器输出比较功能&PWM脉宽调制&通用/高级定时器输出比较通道&舵机/直流电机简介&PWM驱动呼吸灯/舵机/直流电机代码实操

    声明:学习笔记根据b站江科大自化协stm32入门教程编辑,仅供学习交流使用!

    2024年02月03日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包