STM32 PWM 计数器模式和对齐

ops/2025/2/6 23:52:59/

STM32 PWM 计数器模式和对齐

  • 1. TIM高级定时器简介
  • 2. PWM计数模式
    • 2.1 向上计数
    • 2.2 向下计数
    • 2.3 中心对齐模式(向上/向下计数)
    • 2.4 重复计数
  • 3 中心对齐模式1,2,3
  • 4. FOC中PWM相关设置说明
    • 4.1 Update Event 触发ADC采集
    • 4.2 Output Channel4触发ADC采集
    • 4.3 测试过程中发现的小问题

1. TIM高级定时器简介

TIM1和TIM8高级定时器框图如下:

  • CCxI:capture/compare x interrupt,例如CC1I,表示CC1 interrupt
  • OCxREF:
    在这里插入图片描述

TIM中的中断如下图,除了DMA中断外,常用的几类中断:

  • BI:break interrupt 刹车中断
  • TI:Trigger interrupt 触发中断
  • COMI:COM interrupt COM中断
  • CCxI:capture/compare interrupt,捕获/比较中断
  • UI:update interrupt,更新中断
    在这里插入图片描述

2. PWM计数模式

2.1 向上计数

  • 计数器从0开始计数到自动加载值(TIMx_ARR),然后重新从0开始计数,并产生一个计数器溢出事件
  • 如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新时间(UEV),否则每次计数器溢出时才产生更新时间
    在这里插入图片描述

2.2 向下计数

  • 计数器从自动加载值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件
  • 如果使用了重复计数器功能,在向下计数达到设置的重复计数次数(TIMx_RCR)时,产生更新时间(UEV),否则每次计数器下溢时才产生更新时间
    在这里插入图片描述

2.3 中心对齐模式(向上/向下计数)

  • 在中心对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR)-1,产生一个计数器溢出时间,然后向下计数到1,并产生一个计数器下溢事件,让后再从0开始重新计数
  • 中心对齐模式下:不能写入TIMx_CR1中的DIR方向位。它由硬件更新并指示当前的计数方向
  • 可以在每次计数上溢和每次计数下溢时产生更新事件,对应产生UI(update interrupt)中断

在这里插入图片描述
在这里插入图片描述

  • 在极性为高时(CH polarity = High),得到如下图PWM波形。
    • 计数器Counter< CCR时,输出高电平
    • 计数器Counter> CCR时,输出低电平
      在这里插入图片描述

2.4 重复计数

重复计数器在以下任一条件成立时递减:

  • 向上计数模式下每次计数器溢出时
  • 向下计数模式下每次计数器下溢时
  • 中心对齐模式下,每次上溢和每次下溢时

在这里插入图片描述
从上图中可以看出:对于中心对齐模式,RCR不同值的含义,此处产生UI(update interrupt)中断

  • 0: 每次上溢、下溢都会产生中断
  • 1:每次下溢时产生中断
  • 2:上溢、下溢间隔,产生中断
  • 3:每两次下溢产生中断
  • 3和重新同步:每两次下溢,或者同步时产生中断

在STM32CubeMX中设置Trigger Event为 UpdateEvent时,Repetition Counter才起作用
在这里插入图片描述

设置Trigger Event为其他模式时,Repetition Counter不起作用
在这里插入图片描述

3 中心对齐模式1,2,3

中心对齐模式寄存器TIMx_CR1中的CMS[1:0]:根据产生中断方式不同来区分,此处会产生CCxI(capture/compare interrupt),会影响输出比较中断触发时间点,但是不会影响PWM输出波形

  • 00: 边沿对齐模式。计数器依据方向位(DIR)向上或向下计数
  • 01:中心对齐模式1;输出比较中断标志位,向下计数时被设置
  • 10:中心对齐模式2;输出比较中断标志位,向上计数时被设置
  • 11:中心对齐模式3;输出比较中断标志位,向上计数和向下计数时被设置
    在这里插入图片描述
    在这里插入图片描述

对应STM32CubeMX选择counter mode
在这里插入图片描述

4. FOC中PWM相关设置说明

4.1 Update Event 触发ADC采集

  1. 选择Trigger EVent Selection为:Update Event
  2. 设置Repetition Counter = 1,只在每次下溢时产生中断,每次上溢时不产生中断
    在这里插入图片描述
  3. 因为是中心对齐模式,所以Counter register从0向上计数ARR值(3500),再从ARR值(3500)向下计数到0。所以Update Event触发的时间只和ARR寄存器相关,和CCR值无关
    在这里插入图片描述
  4. 这里CCR的值,即pulse,不会触发中断输出
    在这里插入图片描述

4.2 Output Channel4触发ADC采集

  1. 选择TIM1的Channel4为 PWM generation no Output
    在这里插入图片描述

  2. 设置Trigger EVent Selection为 Output compare(OC4REF)
    在这里插入图片描述

  3. 这里由CCR的值,即pulse触发中断,与ARR值,即period无关
    在这里插入图片描述

    • 如果pulse=1,则计数Counter刚开始马上触发中断,刚好在PWM Channel N的低电平中心点
    • 如果pulse=ARR值-1,则计数Counter快到ARR值(3500)时才触发中断,刚好在PWM Channel N的高电平中心点
      在这里插入图片描述
  4. 设置PWM generation Channel4的 pulse,确定采用时间点:

  • 设置为3500-1时:PWM-Channel 1 N 高电平中心点采样。图中蓝色对应PWM-Channel 1 N ,黄色对应PC4(在ADC注入中断函数中toggle电平)
    在这里插入图片描述
  • 设置为1时: PWM-Channel 1 N 低电平中心点采样。图中蓝色对应PWM-Channel 1 N ,黄色对应PC4(在ADC注入中断函数中toggle电平)
    在这里插入图片描述

4.3 测试过程中发现的小问题

以上两种模式有个,问题如下:

发现PWM Channel1 N(蓝色)高电平中心点,与注入中断触发输出(黄色)始终有3us的延时,无法消除。可能原因是中断回调函数中,设置PC4电平需要花费时间

void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
{HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);m0_phB = hadc->Instance->JDR1;m0_phC = hadc->Instance->JDR2;
}

请添加图片描述

请添加图片描述


http://www.ppmy.cn/ops/38718.html

相关文章

Linux常用命令指南

本章节是以Centos7 为例&#xff1a; 常用命令&#xff1a; 查看服务器IP地址 在虚拟机中执行 ip addr 注&#xff1a;重启网络服务 systemctl restart network 基本操作 pwd&#xff1a;print working directory 查看当前所在的目录 cd&#xff1a;change directory 切换目…

欧洲杯将至!Web3足球手游 World League Live 乘势而起

加密市场有众多赛道&#xff0c;如公链、AI、RWA、再质押、DePin、GameFi等。各赛道之间通常有板块轮动现象&#xff0c;每个板块都会有展现出强势的时段&#xff0c;也就是热点出现时&#xff0c;资金会大量涌入。对于普通投资者&#xff0c;需要观察这些板块轮动的动态&#…

《Oracle系列》Oracle SQL命令,创建用户、表空间,并赋予用户一系列权限

1. 创建用户 -- 创建一个名为ywgl的用户&#xff0c;并设置其密码为ywgl create user ywgl identified by ywgl;2. 创建表空间 -- 创建一个名为TS_YWGL的表空间&#xff0c;数据文件存储在/home/u01/oradata/orcl/YWGL.dbf&#xff0c; -- 初始大小为1500M&#xff0c;当…

访问git和vue很慢如何解决

场景 最近弄git和vue发现进他们的官网实在是太慢了&#xff0c;想自己能不能改善一下&#xff0c;后来自己指定了一下ip跳过了dns解析&#xff0c;现在把解决过程写一下。 解决方案 先进入 C:\Windows\System32\drivers\etc 修改HOSTS 修改之前先备份下HOSTSgit下过慢 在HO…

C# 中的匿名方法

C# 中的匿名方法是一种可以在代码中定义但不命名的方法。它们通常用于简化委托的使用&#xff0c;并可以在需要时直接声明和使用&#xff0c;而不必事先定义命名方法。 介绍&#xff1a; 匿名方法允许你在代码中直接创建一个没有名称的方法。它们通常与委托一起使用&#xff…

redis深入理解之数据存储

1、redis为什么快 1&#xff09;Redis是单线程执行&#xff0c;在执行时顺序执行 redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取(socket 读)、解析、执行、内容返回 (socket 写)等都由一个顺序串行的主线…

【国产SSL】哪家SSL证书可以保证数据不出境,是在国内验签

随着网络安全的重视&#xff0c;网站安装SSL证书已经是标配了。但是为什么目前常见的SSL证书都是国外的&#xff1f;数据受国外掌控&#xff0c;安全吗&#xff1f;那么哪家国产品牌是可以保证数据不出境的呢&#xff1f; 为什么目前常见的SSL证书都是国外的&#xff1f; 原因…

idea护眼主题推荐

idea是一个非常好用的开发工具&#xff0c;程序员们天天都与它打交道&#xff0c;最近写代码眼睛的了干眼症&#xff0c;对屏幕特别敏感&#xff0c;所以关注了下主题相关的内容&#xff0c;jetbrains官方也有主题市场插件&#xff1a;https://plugins.jetbrains.com/search?t…