历史上的今天
返回首页

历史上的今天

今天是:2024年10月28日(星期一)

正在发生

2021年10月28日 | stm32专题二十六:互补输出 死区刹车

2021-10-28 来源:eefocus

互补输出+死区刹车


这一部分代码,主要是初始化3个结构体,包括时基结构体、输出比较结构体和死区配置结构体,要对照前一篇博客和中文参考手册中的寄存器说明来仔细看,代码如下:

bsp_AdvanceTim.c


#include "bsp_AdvanceTim.h"

 

static void ADVANCE_TIM_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

 

  // 输出比较通道 GPIO 初始化

RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);

 

  // 输出比较通道互补通道 GPIO 初始化

RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1N_GPIO_CLK, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1N_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(ADVANCE_TIM_CH1N_PORT, &GPIO_InitStructure);

 

  // 输出比较通道刹车通道 GPIO 初始化

RCC_APB2PeriphClockCmd(ADVANCE_TIM_BKIN_GPIO_CLK, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_BKIN_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(ADVANCE_TIM_BKIN_PORT, &GPIO_InitStructure);

// BKIN引脚默认先输出低电平

GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);

 

}

 

static void ADVANCE_TIM_Mode_Config(void)

{

// 开启定时器时钟,即内部时钟CK_INT=72M

ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE);

 

/*--------------------时基结构体初始化-------------------------*/

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断

TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD;

// 驱动CNT计数器的时钟 = Fck_int/(psc+1)

TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_PSC;

/* 这个分频因子,在死区时间和滤波器中都会使用到 */

// 时钟分频因子 ,配置死区时间时需要用到

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

// 计数器计数模式,设置为向上计数

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

// 重复计数器的值,没用到不用管

TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

// 初始化定时器

TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);

 

/*--------------------输出比较结构体初始化-------------------*/

TIM_OCInitTypeDef  TIM_OCInitStructure;

// 配置为PWM模式1

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

// 输出使能

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

// 互补输出使能

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 

// 设置占空比大小

TIM_OCInitStructure.TIM_Pulse = ADVANCE_TIM_PULSE;

/* 高电平有效 */

// 输出通道电平极性配置

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

// 互补输出通道电平极性配置

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

/* 这个主要是用在刹车功能上,一旦开启刹车,互补输出会被强制关闭

此时两路互补输出通道的极性为空闲电平 */

// 输出通道空闲电平极性配置

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

// 互补输出通道空闲电平极性配置

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(ADVANCE_TIM, TIM_OCPreload_Enable);

 

/*-------------------刹车和死区结构体初始化-------------------*/

// 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述

TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;

// 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述

// 这里配置的死区时间为152ns

  TIM_BDTRInitStructure.TIM_DeadTime = 11;

  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;

// 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样

  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;

  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

  TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);

// 使能计数器

TIM_Cmd(ADVANCE_TIM, ENABLE);

// 主输出使能,当使用的是通用定时器时,这句不需要

TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);

}

 

void ADVANCE_TIM_Init(void)

{

ADVANCE_TIM_GPIO_Config();

ADVANCE_TIM_Mode_Config();

}

 

bsp_AdvanceTim.h


#ifndef __BSP_ADVANCETIM_H

#define __BSP_ADVANCETIM_H

 

#include "stm32f10x.h"

 

/************高级定时器TIM参数定义,只限TIM1和TIM8************/

// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意

// 这里我们使用高级控制定时器TIM1

 

#define            ADVANCE_TIM                   TIM1

#define            ADVANCE_TIM_APBxClock_FUN     RCC_APB2PeriphClockCmd

#define            ADVANCE_TIM_CLK               RCC_APB2Periph_TIM1

// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}

#define            ADVANCE_TIM_PERIOD            (8-1)

#define            ADVANCE_TIM_PSC               (9-1)

#define            ADVANCE_TIM_PULSE             4

 

#define            ADVANCE_TIM_IRQ               TIM1_UP_IRQn

#define            ADVANCE_TIM_IRQHandler        TIM1_UP_IRQHandler

 

// TIM1 输出比较通道

#define            ADVANCE_TIM_CH1_GPIO_CLK      RCC_APB2Periph_GPIOA

#define            ADVANCE_TIM_CH1_PORT          GPIOA

#define            ADVANCE_TIM_CH1_PIN           GPIO_Pin_8

 

// TIM1 输出比较通道的互补通道

#define            ADVANCE_TIM_CH1N_GPIO_CLK      RCC_APB2Periph_GPIOB

#define            ADVANCE_TIM_CH1N_PORT          GPIOB

#define            ADVANCE_TIM_CH1N_PIN           GPIO_Pin_13

 

// TIM1 输出比较通道的刹车通道

#define            ADVANCE_TIM_BKIN_GPIO_CLK      RCC_APB2Periph_GPIOB

#define            ADVANCE_TIM_BKIN_PORT          GPIOB

#define            ADVANCE_TIM_BKIN_PIN           GPIO_Pin_12

 

/**************************函数声明********************************/

void ADVANCE_TIM_Init(void);

 

 

#endif /* __BSP_ADVANCETIM_H */

然后在主函数中进行测试(需要双通道示波器来观察输出互补波形,以及死区时间152ns):


main.c


#include "stm32f10x.h"

#include "bsp_led.h"

#include "bsp_usart.h"

#include "bsp_AdvanceTim.h"

#include

 

void delay(uint32_t count);

 

int main(void)

{

USART_config();

ADVANCE_TIM_Init();

while (1);

}

推荐阅读

史海拾趣

HTSEMI( Jin Yu Semiconductor )公司的发展小趣事

随着技术实力的不断提升,金宇半导体开始积极拓展国内外市场。公司制定了详细的市场拓展计划,通过参加国际电子展、举办技术研讨会等方式,加强与客户的沟通和交流。同时,金宇半导体还加大了品牌建设的力度,通过广告宣传、媒体合作等多种方式提升品牌知名度和美誉度。这些努力使得金宇半导体的市场份额逐年攀升,品牌影响力也日益增强。

EPSON公司的发展小趣事

EPSON公司,原名精工爱普生,成立于1942年,最初以制造手表起家。然而,随着技术的不断进步和市场需求的变化,EPSON逐渐将业务扩展到电子领域。在创始人及其团队的带领下,EPSON凭借其卓越的技术创新能力,成功研发出了一系列具有划时代意义的电子产品,如世界上第一台微型打印机和喷墨打印机,奠定了其在电子行业的领先地位。

Faraday Electronics Inc公司的发展小趣事

在Faraday Electronics Inc的发展历程中,企业文化的塑造起到了至关重要的作用。公司一直注重培养员工的创新精神和团队合作精神,鼓励员工积极参与技术创新和市场拓展。同时,公司还注重营造积极向上的工作氛围和企业文化,让员工在工作中感受到归属感和成就感。这种积极向上的企业文化不仅激发了员工的工作热情和创新精神,还为公司的发展提供了源源不断的动力。

请注意,以上故事均为虚构,仅用于展示电子行业公司可能的发展路径和故事类型。

Acutechnology公司的发展小趣事

在市场竞争日益激烈的背景下,Acutechnology公司深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重品牌建设,通过广告宣传、参加展会等方式提升品牌知名度和美誉度。这些举措有效地提升了公司的市场竞争力,赢得了客户的广泛认可。

Brand-Rex公司的发展小趣事

除了在欧洲和中国市场取得显著成就外,Brand-Rex还积极拓展全球市场。其亚太区总部设在澳大利亚墨尔本市,大中国区办事处分别设在北京、上海及香港,东南亚办事处设在新加坡。这些布局使得Brand-Rex能够更好地服务全球客户,满足不同地区的市场需求。同时,Brand-Rex还积极寻求与全球知名企业的合作机会,通过战略合作和技术交流不断提升自身的竞争力和创新能力。

综上所述,Brand-Rex在电子行业中的发展是一个充满挑战和机遇的过程。凭借其卓越的技术、优质的产品和全球市场的布局,Brand-Rex不断壮大并成为行业内的佼佼者。未来,随着全球电子行业的不断发展,Brand-Rex有望继续保持其领先地位,并为全球客户提供更加优质的产品和服务。

意华(CZT)公司的发展小趣事

意华在发展过程中,积极拓展国内外市场,与华为、中兴、富士康等知名企业建立了长期稳定的合作伙伴关系。这些合作伙伴的加入,不仅为意华带来了更多的订单和业务机会,也促进了公司技术的交流和提升。通过与这些行业巨头的合作,意华在电子连接器领域的影响力逐渐扩大。

问答坊 | AI 解惑

飞思卡尔单片机_SDIDE软件

飞思卡尔单片机_SDIDE软件 …

查看全部问答>

如何推广EEWORLD

1.登陆EEWORLD论坛,进入旧版首页,在右上角找到“控制面板”,点击控制面板,如下图: 2.点击“访问推广”,进入如下图所示界面: 按照提示操作,将您的推广链接1或者2均可,发送给您的朋友,当您的朋友访问该链接,并注册成为新会员, ...…

查看全部问答>

如何获取已经打开的串口句柄?

    各位,如何获取已经打开的串口句柄?     望执教!…

查看全部问答>

ARM9外中断问题

U8 key; U8 Key_Scan( void ) {         Delay( 80 ) ;         if(      (rGPGDAT&(1…

查看全部问答>

驱动加载程序中,在StartService()后,通过GetLastError()返回3错误(〖3〗-系统找不到指定的路径。)

    驱动加载程序中,在StartService()后,通过GetLastError()返回3(〖3〗-系统找不到指定的路径。)    在虚拟机运行的,一开始是好的,暂停第二次打开 ,无论如何加载时运行到StartService()后的GetLastError()返回都是 ...…

查看全部问答>

寻:windows ce驱动及底层开发人员

现有一国外项目需要有windows ce驱动或底层开发经验的人, 有意者请msn或邮件联系:jackin_lau@hotmail.com…

查看全部问答>

也来秀一下DIY,160*80带触摸液晶模块做的多功能时钟~~~~~~

哈哈,其实这个屏是去年电赛的时候买的,正好也用上了,不过用得比较简单,感觉有点可惜了就干脆做了一个完整的模块,估计有的朋友还记得之前小弟发的第一次做PCB的帖子吧,就是给这个做的,这个是当时的链接 https://bbs.eeworld.com.cn/thre ...…

查看全部问答>

TL494制作的恒流限压充电器电路

      我按照图上的电路做了一个充电器(图中的r12,r20我改为两个0.1/5w的电阻了),充10AH/24V的镍氢动力电池,但是在试验中发现随着充电电压的升高,电流在慢慢下降,达不到恒流,例如:24v电池理论充电终止电压是29v,但是在电 ...…

查看全部问答>

micrf506

用起来比较麻烦,但不加PA情况下可以到450米(实测)。…

查看全部问答>