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

}

}

三、总结

程序设计思路如下

相关推荐
卡梅德生物科技小能手6 分钟前
卡美德生物科普:LOXL2(赖氨酰氧化酶样蛋白2)
人工智能·经验分享·生活
自小吃多25 分钟前
某志步进电机驱动器故障排查标准流程
笔记
嵌入式ZYXC39 分钟前
第2篇:《面试题:LDO和DC-DC的区别?分别用在什么场景?》
stm32·单片机·嵌入式硬件·面试·职场和发展
zhangrelay1 小时前
后智能时代智能体推演预测娱乐文-节选-
笔记·学习·娱乐
小碗羊肉1 小时前
【Agent笔记 | 第六篇】Agent关键组件
笔记·agent
likerhood1 小时前
服务器使用 vLLM 部署 Qwen2.5-Coder-7B-CL 笔记
服务器·笔记·vllm
Upsy-Daisy1 小时前
Hermes Agent 学习笔记 01:一个会记忆、会学习、能长期运行的 AI Agent
人工智能·笔记·学习
我命由我123451 小时前
工程中安全帽颜色含义
运维·经验分享·学习·职场和发展·求职招聘·职场发展·学习方法
LuminousCPP1 小时前
从零开始学 C++|系列开篇:从 C 到 C++ 的衔接之路
开发语言·c++·笔记
星恒随风2 小时前
C++ 类和对象入门(一):从 class、访问限定符到 this 指针
开发语言·c++·笔记·学习·状态模式