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

}

}

三、总结

程序设计思路如下

相关推荐
Caramel_biscuit36 分钟前
STM32 CAN学习
stm32·嵌入式硬件·学习
不是小盆友1 小时前
零基础上岸高项丨经验分享
经验分享·软件工程·pat考试·软考高级·软考·软考高项·苏景一软考
cwtlw1 小时前
JavaRedis和数据库相关面试题
java·数据库·笔记·面试
坏柠1 小时前
深入浅出SPI通信协议与STM32实战应用(W25Q128驱动)(理论部分)
stm32·单片机·嵌入式硬件
DayDayUp..1 小时前
[算法学习笔记] 《Hello算法》第10章 搜索
笔记·学习
Long_poem2 小时前
【自学笔记】ELK基础知识点总览-持续更新
笔记·elk·jenkins
长潇若雪2 小时前
《STL 六大组件之容器篇:简单了解 list》
开发语言·c++·经验分享·list·类和对象
cwtlw2 小时前
PhotoShop学习03
笔记·学习·photoshop
喾颛顼3 小时前
Mac下小智AI本地环境部署
人工智能·经验分享·macos
Peter11467178503 小时前
服务器入门操作1(深度学习)
服务器·人工智能·笔记·深度学习·学习