电机控制 stm32f4-pwm tim

CUBE配置 - jamaal555 - 博客园 (cnblogs.com)

STM32CUBEMX配置教程(六)高级定时器单通道输出互补PWM波(带死区和刹车)_怡步晓心rui的博客-CSDN博客_stm32高级定时器刹车

一、配置

 

 

 

 

 

1:是否开启从模式。这是TIM的功能,一个TIM可以作为另一个TIM的从TIM。电机中只有一个pwm tim,无需各个tim之间同步,故disable。
2trigger source:见F7中文手册 图 133.连主TIM的TRGO。因为只用TIM1,所以这里disable。也是该tim作为从模式的时候才会选的。disable。
3:时钟源,选内部时钟。TIM1 TIM8高级定时器,是挂在APB2时钟上的,其他定时器是挂在APB1时钟上的。

时钟计算:

 

 

 

84M.
4:channel。应选择三路,都配置成PWM Generation CHX CHXN
5:组合通道。配置abz编码器的时候才会用到。
6:Activate Break Input 允许刹车。(死区相关配置)
7:使用etr作为清除源。
8:暂时不知道有什么用。也不能勾选。
9:单脉冲模式。手册22.3.19. 定时器开始后,定时一段时间,然后产生一个脉冲。(脉冲宽度也可调)。电机中不用这个功能。

 

 

 

1:PSC:预分频系数。上文得到的84M是CK_INT,经过PSC+1分频后,得到CK_CNT,CK_CNT才是真正计数的频率。
  ARR:计数周期period。
  counter mode:计数模式:向上计数、向下计数、中心对齐123.  
  ckd:这个分频指的是从CK_INT 得到tDTS,后者是死区及采样时钟。这里不分频。
  RCR: 重复计数器。这个设置比较重要。实际上,只有当RCR==0的时候,才会产生溢出事件。也就是说,上/下溢RCR+1次,才会产生UEV更新事件。
    电机中想要的是在下溢产生UEV,并产生中断,那么就需要设置RCR=1。同时,需要特别注意初始是上溢还是下溢。
    处理方法:
    法1:在启动TIM后,写入RCR,将在下溢时刻发生更新事件。
    法2:判断tim1->cr1的dir位,判断方向。
  ARP:自动重载预装载。使能,ARR寄存器进行缓冲。不使能,ARR不缓冲。缓冲指的是发生UEV更新事件时,才真的把ARR的值写入影子寄存器。
2:MSM:使能,则TIM1会产生一个TRGO或TRGO2信道给到其他定时器(TRGO)或AD DA(TRGO2)。电机中可以给到AD,在AD中触发源要选择Timer1 Trigger2 Out Event
  Trigger Event selection:选择update event,则产生更新事件时,会触发TRGO输出。
3:BRK:刹车死区相关配置。刹车需要配置tim-bkin引脚,将引脚镰刀电压电流(过压/过流时,会立刻停止输出pwm。这就是刹车)
  BRK state:使能。才能配置下边的具体参数。
  BRK polarity:low。刹车引脚输入低电平的时候,pwm输出关闭。
  M7这里还有刹车输入滤波器、源的设置。
4:automatic output state:disable。  enable 的意思是检测到低电平了(如果前边设置的是低电平),就自动关闭pwm。一般不自动,而是手动。
   OSSR:使能。这样禁用时,输出无效电平 。见下文详细。
  lock configuration:上锁设置,上锁后某些参数就不能更改了。
  死区时间:见下文。
 5:mode:pwm mode 1  模式12 只是极性不同。
   pulse:这个就是占空比。
   输出比较预装载:开启,只有更新时才会写入影子寄存器。

HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);

TIM1->CCR1=249; //修改占空比

中心对齐123的区别是:

 

电机中设置中心对齐模式1。其实电机用的是下溢中断,不是输出比较中断,所以无所谓。

 

 

 

 

关于OSSR和OSSI的作用,看文档有点云里雾里,通过实验,我个人认为其主要作用如下:

OSSR在MOE=1时起作用,即PWM处于运行状态。下面分条陈述:
1:若互补通道都使能(CCxE=CCxNE=1),此时很容易理解,两个端口按照配置正常输出PWM波。
2:若互补通道都禁用(CCxE=CCxNE=0),此时存疑,可以认为两个端口都处于高阻状态。
3:若互补通道有一个使能,一个禁用。则使能的端口正常输出PWM波,禁用的端口的状态与OSSR相关。
  若OSSR=0,则禁用端口输出高阻(存疑),与CCxP或者CCxNP无关。
  若OSSR=1,则禁用端口输出无效电平。假设OC1N为被禁用,即(CC1NE=0),则此时OC1N的输出为无效电平,即CC1NP为0时,高电平有效,输出电平为0,CC1NP为1是,低电平有效,
输出电平为1。

OSSI与OSSR的作用很类似,其只有在MOE
=0时起作用,即PWM处于高阻状态。我们假定互补的两个通道都使能,下面分条陈述: 1:若OISx与OSIxN不同,有且只有一个电平为高电平,则通道输出的电平对应空闲状态。即OCxN=OSIxN,OCx=OISx。 2:若OISx=OSIxN=1时,只有CCxP=CCxNP=0时,OCx=OCxN=0;其余时候OCx=OCxN=1。 3:若OISx=OSIxN=0时,与前面相似,只有CCxP=CCxNP=1时,OCx=OCxN=1,其余时候OCx=OCxN=0。 上面3种情况是OSSI=1的效果,若OSSI=0,此时输出高阻(存疑)。 可以这样理解:若是OISx=OSIxN且CCxP=CCxNP时,此时输出的是无效电平。其余的时候,OCxN=OSIxN,OCx=OISx。

 

tDTS是上边CKD设置的。

 

 

 

 

 二、在keil中编写中断服务函数

https://www.cnblogs.com/jamaal555/articles/15345208.html

进一步进入HAL_TIM_IRQHandler():

 

所有的tim中断的回调都在这个函数中。即此函数的功能是找到打开的中断的callback,并执行它。所以我们修改重写callback即可,剩下的不用管,hal帮我们做了。

 

 

这个就是电机中的总中断,20KHZ。

另外,要手动打开定时器,定时器才会工作:

  HAL_TIM_Base_Start_IT(&htim1);

 

附常用的几个回调函数:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);//更新中断            电机中用这个中断
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);//输出比较
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);//输入捕获
void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);//触发中断

 pwm操作:

                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);         //打开六路pwm
                HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
                HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
                HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,(uint16_t)(5400+5400*pmsm.volA));
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,(uint16_t)(5400+5400*pmsm.volB));
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,(uint16_t)(5400+5400*pmsm.volC));

 注意:

 

没有1,不能打开中断。没有2,不能开启pwm。

 

 

 

 

 

 
posted @ 2022-04-28 11:25  jamaal555  阅读(383)  评论(0)    收藏  举报