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

2023-05-16

前言:

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

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

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

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.硬件电路 

 2.技术讲解

2.1高级定时器

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

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

主要特性:

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

2.2框图 

 

2.2.1重复计数

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

2.2.2死区 

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

2.2.3刹车 

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

 

3.软件编程 

 3.1HAL库函数

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

 

 

 3.2cubemax初始化

 

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%
		}
	}
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐