STM32F103RCT6输出互补PWM波(HAL库)

本文主要介绍如何使用STM32F103RCT6单片机的高级定时器输出互补PWM。如有疑问,欢迎留言讨论。

一、硬件介绍

STM32F103RCT6共有两个高级定时器,分别为TIM1和TIM8。本文将使用TIM1定时器的TIM_CH1和TIM_CH1N输出互补PWM波,其中CH1N输出于CH1互补(即反相)的PWM。

由STM32F103RC数据手册可知,TIM_CH1通道对应的引脚为PA8,TIM_CH1N通道对应的引脚为PB13。

二、程序设计(HAL库)

"atim.h"文件

#ifndef __ATIM_H

#define __ATIM_H

#include "./SYSTEM/sys/sys.h"

/* 输出通道引脚 */

#define ATIM_TIMX_CPLM_CHY_GPIO_PORT GPIOA

#define ATIM_TIMX_CPLM_CHY_GPIO_PIN GPIO_PIN_8

#define ATIM_TIMX_CPLM_CHY_GPIO_CLK_ENABLE() do{__HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */

/* 互补输出通道引脚 */

#define ATIM_TIMX_CPLM_CHYN_GPIO_PORT GPIOB

#define ATIM_TIMX_CPLM_CHYN_GPIO_PIN GPIO_PIN_13

#define ATIM_TIMX_CPLM_CHYN_GPIO_CLK_ENABLE()

do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PB口时钟使能 */

/* 刹车输入引脚 */

#define ATIM_TIMX_CPLM_BKIN_GPIO_PORT GPIOB

#define ATIM_TIMX_CPLM_BKIN_GPIO_PIN GPIO_PIN_12

#define ATIM_TIMX_CPLM_BKIN_GPIO_CLK_ENABLE()

do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PB口时钟使能 */

/* 互补输出使用的定时器 */

#define ATIM_TIMX_CPLM TIM1

#define ATIM_TIMX_CPLM_CHY TIM_CHANNEL_1

#define ATIM_TIMX_CPLM_CHY_CCRY ATIM_TIMX_CPLM->CCR1

#define ATIM_TIMX_CPLM_CLK_ENABLE() do{__HAL_RCC_TIM1_CLK_ENABLE(); }while(0)

/* 声明函数 */

void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc);

/* 高级定时器 互补输出 初始化函数 */

void atim_timx_cplm_pwm_set(uint16_t ccr, uint8_t dtg);

/* 高级定时器 互补输出 设置输出比较值 & 死区时间 */

注意:"do...while(0)"循环要和"#define ATIM..."在同一行,网页无法显示二者处于同一行,特此指出。

"atim.c"文件

TIM_HandleTypeDef g_timx_cplm_pwm_handle; /* 定时器x句柄 */

TIM_BreakDeadTimeConfigTypeDef g_sbreak_dead_time_config = {0}; /* 死区时间设置 */

void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc)

{

GPIO_InitTypeDef gpio_init_struct = {0};

TIM_OC_InitTypeDef tim_oc_cplm_pwm = {0};

ATIM_TIMX_CPLM_CLK_ENABLE(); /* TIMx 时钟使能 */

ATIM_TIMX_CPLM_CHY_GPIO_CLK_ENABLE(); /* 通道X对应IO口时钟使能 */

ATIM_TIMX_CPLM_CHYN_GPIO_CLK_ENABLE(); /* 通道X互补通道对应IO口时钟使能 */

ATIM_TIMX_CPLM_BKIN_GPIO_CLK_ENABLE(); /* 通道X刹车输入对应IO口时钟使能 */

gpio_init_struct.Pin = ATIM_TIMX_CPLM_BKIN_GPIO_PIN;

gpio_init_struct.Mode = GPIO_MODE_AF_PP;

gpio_init_struct.Pull = GPIO_PULLDOWN;

gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(ATIM_TIMX_CPLM_BKIN_GPIO_PORT, &gpio_init_struct);

gpio_init_struct.Pin = ATIM_TIMX_CPLM_CHY_GPIO_PIN;

HAL_GPIO_Init(ATIM_TIMX_CPLM_CHY_GPIO_PORT, &gpio_init_struct);

gpio_init_struct.Pin = ATIM_TIMX_CPLM_CHYN_GPIO_PIN;

HAL_GPIO_Init(ATIM_TIMX_CPLM_CHYN_GPIO_PORT, &gpio_init_struct);

/* 配置IO口复用功能 */

g_timx_cplm_pwm_handle.Instance = ATIM_TIMX_CPLM; /* 定时器x */

g_timx_cplm_pwm_handle.Init.Prescaler = psc; /* 预分频系数 */

g_timx_cplm_pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数模式 */

g_timx_cplm_pwm_handle.Init.Period = arr; /* 自动重装载值 */

g_timx_cplm_pwm_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;

g_timx_cplm_pwm_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /* 使能影子寄存器TIMx_ARR */

HAL_TIM_PWM_Init(&g_timx_cplm_pwm_handle) ;

/* 初始化定时器的ARR和PSC等参数 */

tim_oc_cplm_pwm.OCMode = TIM_OCMODE_PWM1;

tim_oc_cplm_pwm.OCPolarity = TIM_OCPOLARITY_HIGH;

tim_oc_cplm_pwm.OCNPolarity = TIM_OCPOLARITY_HIGH;

tim_oc_cplm_pwm.OCIdleState = TIM_OCIDLESTATE_SET;

tim_oc_cplm_pwm.OCNIdleState = TIM_OCNIDLESTATE_SET;

HAL_TIM_PWM_ConfigChannel(&g_timx_cplm_pwm_handle, &tim_oc_cplm_pwm, ATIM_TIMX_CPLM_CHY); /* 设置 PWM 模式 1、输出极性,以及输出空闲状态等 */

/* 设置死区参数,开启死区中断 */

g_sbreak_dead_time_config.OffStateRunMode = TIM_OSSR_DISABLE;

g_sbreak_dead_time_config.OffStateIDLEMode = TIM_OSSI_DISABLE;

g_sbreak_dead_time_config.LockLevel = TIM_LOCKLEVEL_OFF;

g_sbreak_dead_time_config.BreakState = TIM_BREAK_ENABLE;

g_sbreak_dead_time_config.BreakPolarity = TIM_BREAKPOLARITY_HIGH;

g_sbreak_dead_time_config.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE; HAL_TIMEx_ConfigBreakDeadTime(&g_timx_cplm_pwm_handle,&g_sbreak_dead_time_config);

/* 配置函数短路功能 */

HAL_TIM_PWM_Start(&g_timx_cplm_pwm_handle, ATIM_TIMX_CPLM_CHY);

HAL_TIMEx_PWMN_Start(&g_timx_cplm_pwm_handle, ATIM_TIMX_CPLM_CHY);

/*启动通道输出和互补通道输出 */

}

void atim_timx_cplm_pwm_set(uint16_t ccr, uint8_t dtg)

{

g_sbreak_dead_time_config.DeadTime = dtg;

HAL_TIMEx_ConfigBreakDeadTime(&g_timx_cplm_pwm_handle,&g_sbreak_dead_time_config);

__HAL_TIM_MOE_ENABLE(&g_timx_cplm_pwm_handle);

ATIM_TIMX_CPLM_CHY_CCRY = ccr;

}

"main.c"文件

#include "./SYSTEM/sys/sys.h"

#include "./SYSTEM/usart/usart.h"

#include "./SYSTEM/delay/delay.h"

#include "./BSP/LED/led.h"

#include "./BSP/TIMER/atim.h"

int main(void)

{

HAL_Init();

Stm32_Clock_Init(RCC_PLL_MUL9);

delay_init(72);

uart_init(115200);

led_init();

atim_timx_cplm_pwm_init(360 - 1, 1 - 1);

/* 72Mhz的计数频率(0.0139us),(360*0.0139)200Khz波形輸出. */

atim_timx_cplm_pwm_set(216, 3);

/* 正占空比:216/360,死区时间:1*(4*13.9)ns. */

while(1)

{

LED(1);

delay_ms(100);

LED(0);

delay_ms(100);

}

}

三、总结

程序设计思路如下

相关推荐
ling___xi14 小时前
《计算机网络》计网3小时期末速成课各版本教程都可用谢稀仁湖科大版都可用_哔哩哔哩_bilibili(笔记)
网络·笔记·计算机网络
达文汐15 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
中屹指纹浏览器16 小时前
中屹指纹浏览器底层架构深度解析——基于虚拟化的全维度指纹仿真与环境隔离实现
经验分享·笔记
Hello_Embed16 小时前
libmodbus 移植 STM32(基础篇)
笔记·stm32·单片机·学习·modbus
无聊的小坏坏16 小时前
实习笔记:用 /etc/crontab 实现定期数据/日志清理
笔记·实习日记
香芋Yu16 小时前
【机器学习教程】第04章 指数族分布
人工智能·笔记·机器学习
深蓝海拓18 小时前
PySide6从0开始学习的笔记(二十六) 重写Qt窗口对象的事件(QEvent)处理方法
笔记·python·qt·学习·pyqt
中屹指纹浏览器18 小时前
中屹指纹浏览器多场景技术适配与接口封装实践
经验分享·笔记
qqssss121dfd18 小时前
STM32H750XBH6的ETH模块移植LWIP
网络·stm32·嵌入式硬件
宏集科技工业物联网18 小时前
预防性维护与能源效率:SCADA 在工业运营中的关键作用
经验分享·scada·预测性维护·工业自动化·能耗管理