STM32实战-高级定时器带死区的互补PWM输出

前言:

平时我们设计点击驱动电路时,一般会采用npn和pnp三极管,来控制电机的导通和关闭,但是三级管内部自带电容,断电后不会立马断掉,会经过很小的一段时间才会放电完毕,这时候要留有死区给电容放电,这就有了互补pwm波。

  同时,当电机出现故障,如果利用软件控制信号输出响应断电的话会有时间上的延时,相应的也就出现的刹车的概念,利用硬件电路直接断电,减少时间延时。如下图所示:

STM32实战-高级定时器带死区的互补PWM输出_第1张图片

程序主要实现的功能如下:

1、上电后,输出带死区的互补PWM;

2、触摸按键1调节PWM占空比;

3、刹车引脚高电平触发。

最终在示波器上的波形如下图所示:


目录

1.硬件电路 

 2.技术讲解

2.1高级定时器

2.2框图 

2.2.1重复计数

2.2.2死区 

2.2.3刹车 

3.软件编程 

 3.1HAL库函数

 3.2cubemax初始化

3.3编程函数 

3.3.1初始化函数

 3.3.2回调函数



1.硬件电路 

STM32实战-高级定时器带死区的互补PWM输出_第2张图片

 2.技术讲解

2.1高级定时器

高级控制定时器(TIM1)由一个 16 位的自动装载计数器组成,它由一个可编程预分
频器驱动。
它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形
(输出比较, PWM,嵌入死区时间的互补 PWM 等)。
使用定时器预分频器和 RCC 时钟控制预分频器,可以实现脉冲宽度和波形周期
从几个微秒到几个毫秒的调节。

高级控制(TIM1)和通用(TIMx)定时器是完全独立的,它们不共享任何资源。它们
可以同步操作。

主要特性:

TIM1 定时器的功能包括:
● 16 位上,下,上/下自动装载计数器
● 16 位可编程预分频器,计数器时钟频率的分频系数为 1~65535 之间的任意数值
● 4 个独立通道:
- 输入捕获
- 输出比较
- PWM 生成(边缘或中间对齐模式)
- 单脉冲模式输出
- 死区时间可编程的互补输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 在指定数目的计数器周期之后更新定时器寄存器
刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
● 如下事件发生时产生中断/DMA:
- 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
- 触发事件(计数器启动,停止,初始化或者由内部/外部触发计数)
 

2.2框图 

STM32实战-高级定时器带死区的互补PWM输出_第3张图片 

2.2.1重复计数

之前我们在设置自动重装载之后,定时器会在设置的时间进入中断,高级定时器新增了重复次数计数器,设置重复次数,每到达设置时间计数一次,当满足计数阈值,就会响应中断。

STM32实战-高级定时器带死区的互补PWM输出_第4张图片

2.2.2死区 

死区 为了给三极管电容放电的时间,我们可以通过软件控制pwm波形上升沿,或者下降沿的响应时间,一般设置在几微妙,需要通过示波器调节。调整前后图形一般如下所示:

STM32实战-高级定时器带死区的互补PWM输出_第5张图片

2.2.3刹车 

高级定时器带有刹车检测功能,相比软件检测,硬件强制停止,对实时性要求更高,图解如下图所示:

STM32实战-高级定时器带死区的互补PWM输出_第6张图片 

3.软件编程 

 3.1HAL库函数

  本次我们新增的库函数是互补pwm波的输出,具体函数如下:

STM32实战-高级定时器带死区的互补PWM输出_第7张图片 

STM32实战-高级定时器带死区的互补PWM输出_第8张图片 

 3.2cubemax初始化

 STM32实战-高级定时器带死区的互补PWM输出_第9张图片

3.3编程函数 

 整体框架都一样,只是回调函数中修改为互补pwm波形输出,只要有按键按下,响应中断,进入回调函数,初始化函数部分上电启动pwm互补函数库。具体代码如下:

3.3.1初始化函数

static void Peripheral_Set()
{
	Timer6.Timer6_Start_IT(); //启动定时器6
	
	//启动定时器1pwm互补输出
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
}

 3.3.2回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == KEY1_Pin)
	{
		LED.LED_Flip(LED2);
		
		/***
		调整pwm占空比,用于测试重复计数器功能,
		***/
		if(TIM1->CCR1 == 50)
		{
			TIM1->CCR1 = 80; //调整占空比80%
		}
		else
		{
			TIM1->CCR1 = 50; //调整占空比为50%
		}
	}
}

 

你可能感兴趣的:(stm32,单片机,嵌入式硬件)