stm32专题二十六:互补输出 死区刹车

发布者:三青最新更新时间:2021-10-28 来源: eefocus关键字:stm32  互补输出 手机看文章 扫描二维码
随时随地手机看文章

互补输出+死区刹车


这一部分代码,主要是初始化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);

}

关键字:stm32  互补输出 引用地址:stm32专题二十六:互补输出 死区刹车

上一篇:stm32专题二十六:高级定时器介绍
下一篇:stm32专题二十六:输入捕获 脉宽测量

推荐阅读最新更新时间:2024-11-12 12:41

stm32定时器输入捕获pwm
花了两天时间终于把stm32f103的定时器输入捕获弄懂了,这里以TIM3的通道ch1为例,要实现输入捕获需要配置一下寄存器,TIMx_ARR,TIMx_PSC,TIMx_CCMR1,TIMx_CCER,TIMx_DIER,TIMx_CR1,TIMx_CCR1.这里抓取了一些收据手册中寄存器描述的图 下面一一介绍: TIMx_ARR寄存器为自动重装载的值 TIMx_CR1这里了只要用到它的第0位即使能位。 TIMx_CCMR可以配置对应通道映射到那个IC,TI。 这里我们是第一通道故只需配置低8位,cc1s为配置ch1映射到那个TI,IC1PSC为配置是否分频,1c1f为配置是否滤波。 TIMx_psc寄存器 T
[单片机]
STM32使用ADC功能
1.关于ADC输入通道与GPIO口的输入关系需要查看STM32芯片手册(p31)而非数据手册。 2.外部触发源指的是触发ADC采样的触发信号,这与1的GPIO口输入是两个不同概念。而JEXTBEL 或者EXTBEL 决定具体是哪个触发源。 3.大的方向,触发模式分为了 ADON位触发启动和外部触发启动ADC转换两种。用后者就行了 4.当我们使用一个ADC要采集多个通道时,单独规则组由于只使用了一个数据寄存器,并且是整个组转换完后才会触发中断,因此数据会覆盖,这种情况下需要使用DMA方法(后面采用试试),这时数据写到SRAM中了。而单独使用注入组总共可最多有四个通道,对应四个数据寄存器,不存在覆盖。 5.关于注入通道
[单片机]
<font color='red'>STM32</font>使用ADC功能
STM32入门系列-学习STM32要掌握的内容
STM32芯片架构 STM32F103系列芯片的系统架构如下: STM32芯片基于ARM公司的Cortex-M3内核,由ST公司设计生产,内核与总线矩阵之间有I(指令)、S(系统)、D(数据)三条信号线。内核通过总线矩阵与FLASH、SRAM、外设连接。而外设包括GPIO、USART、I2C、SPI等。 STM32芯片系统结构 STM32F103 系列芯片(不包含互联网型)的系统结构如下: 从上图可以看出,在小容量、中容量和大容量产品中,主系统由以下部分构 成: 四个驱动单元: Cortex-M3 内核 DCode 总线(D-bus) Cortex-M3 内核系统总线(S-bus) 通用 DMA1
[单片机]
<font color='red'>STM32</font>入门系列-学习<font color='red'>STM32</font>要掌握的内容
stm32和电机开发(从架构图到文档编写)
很多同学不喜欢写文档,总觉得写文档耽误事,影响开发效率。实际上,不一定是那么回事。在实际开发中,编写文档的目的主要是为了厘清自己的思路,在开发代码前把所有的事情都考虑到,防止代码写了一半,需要推倒重来的情形发生。 当然,很多时候编写文档的确是枯燥的,那么有没有什么好的办法,可以让文档编写稍微变得容易一点,答案就是先写架构图。因为文档本身就可以看成是架构图+文字的格式。 1、先编写架构图 架构图是软件的魂。我们拿到软件开发需求后,第一步要做的就是模块拆分、流程抽象和接口设计。这部分可以找一些合适的软件来完成,比如visio、openoffice draw、processon都可以。总之,只要能达到目的就行。比如我们写一个网站
[单片机]
<font color='red'>stm32</font>和电机开发(从架构图到文档编写)
如何采用STM32单片机产生PWM
STM32产生PWM是非常的方便的,要需要简单的设置定时器,即刻产生! (1)使能定时器时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); (2)定义相应的GPIO: /* PA2,3,4,5,6输出-》Key_Up,Key_Down,Key_Left,Key_Right,Key_Ctrl */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //下拉接地,检
[单片机]
STM32 DS18B20代码详解
DS18B20是最常用来学习某一个新的开发工具的,程序都是大同小异,主要是要注意时序中的延时要准确,指令要正确,这里记录一下! ------------------第一部分是--------ds18b20.h---------------------- #ifndef __DS18B20_H #define __DS18B20_H #include stm32f10x.h #include bsp_SysTick.h //精确延时函数头文件----参考http://blog.csdn.net/xuxuechen/article/details/40783209这个看一下 #define HIGH 1 #define
[单片机]
<font color='red'>STM32</font> DS18B20代码详解
基于STM32和EV1527的无线接收解码程序
一、1527的数据帧结构 无线遥控的编码,从编码类型上来说,分为2类,一类是固定码,也就是编码芯片的地址是不变的,芯片型号以 EV1527、PT2262 为代表。另一种是滚动码,芯片的地址码是变化的,芯片以HS300、HS301为代表。 1 EV1527 数据帧结构 EV1527 是一片由 CMOS 设计制造的可预烧内码的学习码编码IC ,由软件解码;内码共有 20 个位元可预烧 1048576 组内码组合,降低使用上编码重复的机率。 EV1527 每帧数据由 24 个数据位组成,前 20 位为地址码,对于一个芯片来说,地址位的内容是固定的,是出厂前就预制好的,并且理论上每个芯片的地址码是唯一的。后面 4 位为按键
[单片机]
基于<font color='red'>STM32</font>和EV1527的无线接收解码程序
STM32(cortex_m3) 的 Bit-Banding 怎样理解
Bit-Banding的意思:对Bit-Band区一个字的操作对应实际存储器中的一位。 在STM32F10xxx的技术参考手册中第2.3.3节,有这样的描述: Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果 。 即M3利用别名区简化了位操作了位段区的位操作(将一般的读-改-写简化为写)。 别名区空间大小是位段区的32倍(因为每1位映射为1字)。 在STM32F10x里存储器映像中包括2个位段区,分别是: SRAM区低1MB 0x2000 0000 - 0x200f ffff
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved