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);

}

}

三、总结

程序设计思路如下

相关推荐
水利行业RTU手艺人3 分钟前
STM32 野外 RTU 固件升级配置丢失错乱终极解法:告别结构体字节偏移与 FATFS 掉电损坏的 KV 键值对实战
stm32·单片机·嵌入式硬件
d111111111d19 分钟前
MQTT+STM32+云平台+AT命令的编写
服务器·笔记·stm32·单片机·嵌入式硬件·算法
九思十安21 分钟前
HNU2026-计算机系统-笔记 6 整数
笔记
宵时待雨44 分钟前
linux笔记归纳5:进程控制
linux·运维·笔记
LCG元1 小时前
STM32实战:基于STM32F103的触摸屏(TSC2046)驱动与校准
stm32·单片机·嵌入式硬件
国科安芯1 小时前
抗辐射 MCU 赋能商业航天电源系统:基于 AS32S601 的高可靠能量管理控制器设计与辐照验证
stm32·单片机·嵌入式硬件·mcu·risc-v·空间计算
中屹指纹浏览器1 小时前
2026浏览器缓存指纹持久化溯源机制与多层级缓存隔离优化方案
经验分享·笔记
羊群智妍1 小时前
2026 AI搜索优化技术实践:GEO监测工具选型报告
笔记
Tutankaaa2 小时前
从单场到多场并发:知识竞赛平台的弹性扩展能力
服务器·笔记·学习·职场和发展
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2026.05.11 题目:2553. 分割数组中数字的数位
笔记·算法·leetcode