电机控制 stm32f4-pwm tim
CUBE配置 - jamaal555 - 博客园 (cnblogs.com)
STM32CUBEMX配置教程(六)高级定时器单通道输出互补PWM波(带死区和刹车)_怡步晓心rui的博客-CSDN博客_stm32高级定时器刹车
一、配置

1:是否开启从模式。这是TIM的功能,一个TIM可以作为另一个TIM的从TIM。电机中只有一个pwm tim,无需各个tim之间同步,故disable。 2:trigger 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。

浙公网安备 33010602011771号