当前位置: 首页> 财经> 金融 > 门户网站ui设计_兰州今日头条新闻_保定seo排名_武汉seo人才

门户网站ui设计_兰州今日头条新闻_保定seo排名_武汉seo人才

时间:2025/7/11 7:37:46来源:https://blog.csdn.net/aElect/article/details/144537859 浏览次数:0次
门户网站ui设计_兰州今日头条新闻_保定seo排名_武汉seo人才

本文主要介绍如何使用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);
    }
}

三、总结 

程序设计思路如下

关键字:门户网站ui设计_兰州今日头条新闻_保定seo排名_武汉seo人才

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: