STM32高级定时器输出指定数量PWM(STM32CubeMx配置)

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

原理了解

高级定时器中有一个重复计数器,本实验输出指定个数PWM就是利用了重复计数器的特性,先来看看重复计数器的特性是什么:

计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件

这是什么意思呢,这里举个例子比如说我设定重复计数器的值为3,则计数器上溢一次则重复计数器的值变为2,再继续上溢知道重复计数器的值变为0,此时在溢出一次,则产生更新中断,即如果重复计数器的值为3,则计数器需要溢出4次才会产生更新事件,那么结合本实验输出指定数量的PWM波,通过将N-1写入重复计数器中,则可以产生N个PWM波。stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
从上图来看,当RCR为0时,计数器每溢出一次就会产生更新事件;当RCR为1时,计数器每溢出两次就会产生更新事件,以此类推;那么这里着重看一下最后一个是怎么产生更新事件,当由软件产生一次更新事件后,计数器的值会回到初始状态即0或最大值,然后再溢出4次再次产生更新事件,即软件产生了更新事件后,将会把RCR的值装载进影子寄存器中,重新开始计数。

STM32CubeMx配置

定时器及通道配置

这里使用定时器8通道一作为我们的PWM输出,配置如下:
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
选择内部时钟源,通道一配置为PWM输出,然后设置PWM周期的频率,这里以2KHz设置,根据公式:

Tout= ((arr+1)*(psc+1))/Tclk

先代入PSC为7200-1,Tclk为72M(系统时钟源),则可算出arr为5000-1。
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
配置PWM为模式一,pulse为设置占空比,设置为arr一半则占空比为50%,输出极性为高。
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
打开定时器8更新中断,设置抢占优先级及相应优先级(根据用户自身需求)

GPIO口选择

查看数据手册
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
PC6为定时器八通道一的复用口,同时查看硬件原理图:
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
选择PE5作为输入验证程序输出指定数量PWM,通过生成N个PWM使LED亮N次;选择PB5作为输出,控制LED亮灭证明程序烧写成功。
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
添加PE4按键,通过按键更改生成的PWM数量。
STM32CubeMx配置如下:
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
配置完成后就可生成工程了。

工程生成及代码编写

工程文件

生成工程后,可以看到左边已经有了相关代码:
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
在输出指定数量PWM波中有如下几个比较重要的函数:

void MX_TIM8_Init(void);		//定时器八初始化函数
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle);		//相关时钟使能、中断开启函数
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);	//使能PWM输出
HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource);	//产生指定事件
void TIM8_UP_IRQHandler(void);						//定时器8中断处理服务函数
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);	//定时器中断公共处理函数
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);		//更新中断回调函数,需要用户重写该函数
__HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__);		//这是一个宏定义,使能中断
__HAL_TIM_ENABLE(__HANDLE__);		//这是一个宏定义,使能计数器

代码编写

tim.c编写

首先打开tim.c文件:
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
可以看到里面已经帮我们完成了STM32CubeMx配置的初始化,需要完成输出指定数量PWM波功能我们需要开启PWM输出及使能更新中断,即在用户代码区中添加如下函数:

__HAL_TIM_ENABLE_IT(&htim8, TIM_IT_UPDATE);
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);

中断相关函数

打开stm32f1xx_it.c文件可以看到中断的处理函数已经写好了:
stm32高级定时器cube配置,STM32学习记录,stm32,嵌入式硬件,单片机
需要做的则是编写中断回调函数,即:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

实现功能函数

首先为了实现输出指定PWM波实验,这里新添一个atimp.c文件方便管理:

atim.c及atim.h编写

#include "atimp.h"

static uint8_t g_npwm_set = 0;		//pwm设置输出数量

//输出pwm个数配置函数
void atim_timx_npwm_chy_set(uint8_t npwm)
{
    if(0 == npwm)
        return;
    
    g_npwm_set = npwm;
    HAL_TIM_GenerateEvent(&htim8, TIM_EVENTSOURCE_UPDATE);          //通过软件启动更新中断
    __HAL_TIM_ENABLE(&htim8);                                       //使能计数器
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM8)
    {
        if(g_npwm_set)                                                      //判断设置的pwm数量
        {
            TIM8->RCR = g_npwm_set-1;                                       //要想产生N个pwm将N-1放入RCR寄存器中
            HAL_TIM_GenerateEvent(&htim8, TIM_EVENTSOURCE_UPDATE);          //通过软件启动更新中断将设定值放入影子寄存器中
            __HAL_TIM_ENABLE(&htim8);                                       //使能计数器产生进行PWM输出
            g_npwm_set = 0;
        }
        else
        {
            TIM8->CR1 &= ~(1 << 0);                                         //关闭计数器
        }
    }
}
#ifndef __ATIMP_H__
#define __ATIMP_H__

#include "main.h"
#include "tim.h"

void atim_timx_npwm_chy_set(uint8_t npwm);

#endif

用到按键,再添加一个key.c文件

key.c及key.h编写

#include "key.h"

uint8_t key_scan()
{
    static uint8_t key_sta = 1;
    uint8_t key_value = 0;
    
    if(key_sta && (KEY0 == 0))
    {
        HAL_Delay(10);
        key_sta = 0;
        
        if(KEY0 == 0)
            key_value = KEY0_PRESS;

    }
    else if(KEY0)
    {
        key_sta = 1;
    }
    
    return key_value;
}
#ifndef __KEY_H
#define __KEY_H

#include "main.h"

#define KEY0_PRESS 1        //PE4按下状态

#define KEY0 HAL_GPIO_ReadPin(GPIOE, KEY0_Pin)      //读取当前PE4状态

uint8_t key_scan(void);

#endif

main.c编写

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM8_Init();
  /* USER CODE BEGIN 2 */
    uint8_t key = 0;            //记录键值
    uint8_t t =0;
    atim_timx_npwm_chy_set(5);	//设置PWM输出5次
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    key = key_scan();
    if(key == KEY0_PRESS)
    {
        atim_timx_npwm_chy_set(3);	//设置PWM输出3次
    }
    
    /*LED翻转证明程序正常工作*/
    t++;
    if(t > 20)
    {
        t = 0;
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
    }
    HAL_Delay(10);
  }
  /* USER CODE END 3 */
}

至此,代码就编写完成啦。文章来源地址https://www.toymoban.com/news/detail-784530.html

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

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

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

相关文章

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

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

    2024年01月25日
    浏览(54)
  • STM32使用高级定时器输出互补pwm波

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

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

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

    2024年02月08日
    浏览(47)
  • 基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(3)----定时器中断产生指定数量脉冲

    在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。本文将详细介绍如何利用STM32CUBEMX配置定时器以输出指定数量的PWM脉冲。 定时器是STM32微控制器的一个重要功能模块,可用于生成各种定时

    2024年02月14日
    浏览(48)
  • STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)

    目录 1.实验目的 2.实验效果 3.理论部分 3.1时钟源 3.2时基单元 3.3输入捕获 4.程序流程 4.1GPIO初始化结构体 4.2时基初始化结构体 4.3输出比较结构体 4.4刹车和死区结构体的初始化 5.程序源码 使用高级定时器,输出两路互补的PWM输出,需要有带死区和不带死区两种情况 图1:不带

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

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

    2024年02月03日
    浏览(52)
  • STM32F4使用高级定时器(TIM1和TIM8)输出PWM问题

    STM32F4使用高级定时器(TIM1和TIM8)输出PWM时要使用TIM_CtrlPWMOutputs使能PWM输出,否则不会输出PWM波形,这一点是和通用定时器输出PWM不一样的地方,通用定时器是不用配置TIM_CtrlPWMOutputs函数的。、

    2024年02月15日
    浏览(40)
  • 【正点原子STM32连载】第二十三章 高级定时器互补输出带死区控制实验 摘自【正点原子】APM32F407最小系统板使用指南

    本章将介绍使用APM32F407输出带死区和刹车控制的两路互补PWM。通过本章的学习,读者将学习到高级定时器的互补输出、死区插入和刹车的功能的使用。 本章分为如下几个小节: 23.1 硬件设计 23.2 程序设计 23.3下载验证 23.1 硬件设计 23.1.1 例程功能 定时器8通道1及其互补通道输

    2024年02月09日
    浏览(61)
  • 定时器详解 -- 定时器中断、PWM输出 --stm32

    STM32F103系列芯片拥有多种定时器,包括基本定时器、通用定时器和高级定时器,每种定时器都具有一些特定的功能。 向上计数:计数器从0计数到自动重装载值(ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 向下计数:计数器从自动重装载值(ARR)开始向下计数

    2024年02月11日
    浏览(59)
  • STM32 MCU 定时器详解(3)--高级定时器

    16位递增、递减、中心对齐计数器(计数值:0~65535) 16位预分频器(分频系数:1~65536) 可用于触发DAC、ADC 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式 使用外部信号控制定时器且可实

    2024年04月17日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包