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

}

}

三、总结

程序设计思路如下

相关推荐
2401_843785239 分钟前
STM32 PWM驱动舵机
stm32·单片机·嵌入式硬件
wdxylb1 小时前
GIt使用笔记大全
笔记·git·elasticsearch
Ching·1 小时前
物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】
stm32·嵌入式硬件·物联网
一只码代码的章鱼1 小时前
计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)
笔记·计算机网络
霸王蟹2 小时前
el-table组件样式如何二次修改?
前端·javascript·vue.js·笔记·学习·前端框架
haidizym2 小时前
(笔记+作业)书生大模型实战营春节卷王班---L1G3000 浦语提示词工程实践
笔记
字节全栈_kYu2 小时前
FastDFS实用笔记 (Docker 搭建环境 + 整合 SpringBoot)
spring boot·笔记·docker
憨猪在度假2 小时前
Cmake学习笔记
c++·笔记·学习
泪不是Web妳而流3 小时前
【HTML入门】Sublime Text 4与 Phpstorm
网络·经验分享·编辑器·html·学习方法·sublime text·phpstorm
学游戏开发的3 小时前
UE学习日志#19 C++笔记#5 基础复习5 引用1
c++·笔记·学习·游戏引擎·unreal engine