FOC电机ST系列处理器使用的基础学习笔记

ST公司开源了STM32相关的FOC控制代码,通过其MotoControl Workbench 选择对应的开发板和电机板可以快速的生成FOC控制代码。

英飞凌的方案

STM系列新品试用FOC的资源消耗

在这里插入图片描述

在这里插入图片描述

分解STM工作原理一定要看的文档:

《STM32 电机控制 SDK》 透彻的分析了STM32代码相关的基本原理,认真看了该文档能更好的理解相关程序。

更详细的英文文档介绍《STM32 电机控制 SDK》
建议看英文的比较好。

电机参数识别:

电机的基本知识
如2216、2814等,这个数字,前两位是定子外径(mm)、后两位的是定子高度(mm)。

注意这个:该值为对数,在很多电机上可以看到磁铁个数。该值为磁铁个数/2,因为是对数关系。图中的电机就是磁体数比线圈数多,一般线圈数是3的倍数
在这里插入图片描述
官方说明测试的方式是,给电机任意两根线通上电。电流和电压不能太大容易烧毁电机而且电流大电机不容易用手进行转动,电流太小也不行电流小了不容易感觉到相位。需要能感觉到加电后手转动有明显的能有个个的相位。给上电后标记电机的一个指向点,手动转动电机感觉经过几个相位就能回到原来的相位就是多少极对数。其实极对数不影响运行,只是极对数不对计算圈速的时候对应不上,其实就是类似步进电机的几步对应一圈的概念。

极对数在有外部传感器时需要和实际一致

有外部传感器比如磁绝对位置传感器,极对数和计算转动的角度有固定关系不能错,会导致计算出现点角度计算出来的角度和外部传感器的不一致,会有判断错误停止的可能。
没有外部创感器可以随便填,只是你填写的速度和你实际的对不上。填的极对数越小对应的MAX Rated Speed 越大。

在这里插入图片描述

NP 数量:
1)槽数(N):定子铁芯的槽数量。无刷电机是三相电机,所以槽数是3的倍数。
2)极数(P):定子上磁钢的数量,磁铁必定是南北极成对使用,极数必然是偶数。
电机槽数和极数有些电机型号直接写为槽数N极数P,如12P14N,是12槽14极的意思。

KV值理解
无刷电机KV值定义为转速/V,意思为输入电压增加1伏特(V),无刷电机空转转速(转/分钟)增加的转速值。从这个定义来看,电压与电机空转转速是遵循严格的线性比例关系的,并且是常量,无论电机在那个工作电压,电压和转速的关系都遵从值。

1)外转子:定子在里面,转子在外面叫外转子。

2)内转子:跟外转子相反,内转子是定子包着转子,转动的时候,只是转子转动(外壳不转)。内转子扭矩比较小,KV值高。

kRPM :
每分钟转速 kRPM = (V - RmI) x kv / 1000

RPM = 每分钟转速、V = 电压、Rm = 马达内阻 、I = 消耗电流值 、kv = 电压常数 (RPM / V)

我使用BULL RUN 电机12V 下测试出的效果,通过这个软件检测电机的参数。
电机链接方式如下:
排线是逻辑分析仪器连接的PWM波形测试管脚。三项电机的3根线的顺序,如果没有方向要求的话可以随便连接
在这里插入图片描述

在这里插入图片描述
Inertia:惯性
Friction:摩擦

无感电机位置检测

有感无感多种方式处理,使用的方式比较多

别家的例子

开发板的使用

教学视频

ST电机IHM002套件实操

电机有感无感模式

无感模式

无感工作模式,指的是没有霍尔传感器,通过检测未加电的绕组(如第一个周期时,AC通电,B绕组未加电)上产生的反向电动势,来获取换向时机的。此时就有一个问题,电机静止时,是没有反向电动势的,就需要先启动,等电机运转起来,再检测其反向电动势。

有感模式

有感工作模式,指的是有Hall霍尔传感器或者Quadrature Encoder正交编码器,这是安装在电机内部的传感器。通过霍尔传感器获得电机位置,来判断换向的时机。

一般有的说法是用霍尔做换向,用编码器做位置判断。

霍尔:
霍尔传感器:1.速度环控制反馈 2发挥电机启动力矩,频繁正反转,启动力矩大都需要加霍尔。(线性霍尔还可以做一圈内的角度控制)

霍尔传感器分为线型霍尔传感器和开关型霍尔传感器两种。   
(一)开关型霍尔传感器由稳压器、霍尔元件、差分放大器,斯密特触发器和输出级组成,它输出数字量。开关型霍尔传感器还有一种特殊的形式,称为锁键型霍尔传感器。   
(二)线性型霍尔传感器由霍尔元件、线性放大器和射极跟随器组成,它输出模拟量。   
线性霍尔传感器又可分为开环式和闭环式。闭环式霍尔传感器又称零磁通霍尔传感器,线性霍尔传感器主要用于交直流电流和电压测量。

霍尔有2种方式选择不同方式的输出波形有区别:

在这里插入图片描述
Sensors displacement:
在这里插入图片描述
Placement electrical angle:
见文档章节 8.3.2 Electrical angle extrapolation implementation
在这里插入图片描述

我认为是要说明转子的角度和霍尔传感器的关系。
翻译:
比如上图信号的从高到低或从低到高的转换也提供了同步的可能性包含当前电角度的软件变量。执行同步以避免测量电的突然变化角度。 为了做到这一点,预期电角度之间的差异,计算来自最后的速度测量,以及来自霍尔的真实电角度传感器信号(见)被计算。 新的速度测量值由此调整信息以弥补差异。从上图看出:“霍尔传感器输出转换”中可以看出,任何霍尔传感器转换提供有关转子位置的非常精确的信息。(理解霍尔传感器能测量速度,也可以通过霍尔传感器的原理(霍尔和永磁体固定的角度关系)和定时器的电流测量计算位置一起来计算电角度的值)

原文如下:
在这里插入图片描述

编码器:

编码器介绍

1精确位置环控制反馈,位数(也可以讲线数)越高精度越高。

定时器控制PWM输出

关于IHM07(死区控制通是依靠驱动器自身的能力完成的)

1.控制的EN1-3一直保持为高。
2.只有IN 1-3 是在变化

通过PWM管脚直接驱动IGBT或MOS 晶体管(需要小心处理死区控制等方面的问题)

这类型通常是一个PIN通过IGBTMOS 驱动模块直接驱动1个晶体管,所以上下桥臂的死区需要通过PWM设置来保证。该种模式对设计要求会高不少,需要非常小心处理上下半桥短路和死区控制。

关于电机类型

PMSM 分类

Surface-Mounted PMSM ,表贴式永磁同步电机,磁铁在最外层,磁铁在线圈的外侧,电机的外壳旋转,其直,交电感差异很小,小于10%

Internal PMSM,内置式永磁同步电机,磁铁在线圈的内部,内部旋转,交,直电感之比高达2-2.5

在这里插入图片描述

1.表贴式(隐极式)电机(SPMSM)
Lq=Ld
表贴式转子结构
永磁磁极易于实现最优设计,能使电机的气 隙磁密波形趋于正弦波分布,进而提高电机的运行性能。
表贴式转子在恒功率运行范围不宽的三相PMSM广泛使用。

2.内置式(凸极式)电机 (IPMSM)
Lq>Ld
可以充分利用转子磁路不对称所产生的磁阻转矩,提高电机的功率密度,使得电机的动态性能较表贴式转子结构有所改善,制造工艺也较简单,但漏磁系数和制造成本都较表贴式转子结构大 。

对于STM32使用来说主要是影响Lq和Ld的关系,导致差异的原因可以认为因为磁铁在内部可能导致对磁极的对称性有影响(不清楚是否是正确答案,先这么理解)

在这里插入图片描述
注意:MTPA功能需要在IPMSM使用。

STM32 IHM07使用错误异常经验

一个自制板的使用经验
如果启动后立即出现硬件过流保护,可能由以下原因导致:
首先,需要再次确认ST MC Workbench中所有设置的参数是否和实际的硬件
参数一致:如电机的相关参数,驱动部分的参数,单片机IO设置等。
• 如果有其中任意一个参数设置错误,可能导致电机永远也无法正确启动。
• 如果有需要,可以让电机运行在开环模式,来测量Tnoise和Trise相关参数。
如果启动后立即出现硬件过流保护,可能由以下原因导致:
• 选择了错误的电流采样方式
• 选择了错误的电流采样参数:如取样电阻值,放大倍数, ICS增益, Tnoise, Trise等.
• 电流环的调节带宽过高:3电阻采样建议为2000rad/s, 单电阻采样建议为1000rad/s
• 由于布线受到干扰而导致误触发硬件过流保护,需要检查硬件设计。
如果出现电机只动一下,但是没有加速动作:
• 这种问题一般是因为开环电流不够大导致无法拖起转子加速,有时出现开环启动完成,
但报启动失败故障,这时:
• 需要减低加速率,或提高开环启动电流
如果以上方法可以解决,但是不能保证100%有效,请尝试增加定位功能。

如果转子可以转动并且有加速动作,但是还是会停止并且报“速度反馈失败”错误,可能由以下原因导致:
• 启动成功的限制条件过于宽松导致过早切入闭环。
• 如下的方法可以解决这样的问题:
• 提高“连续成功启动输出测试”值,正常情况下请不要大于5。
• 提高最小启动输出速度。
如果采用 以上方法导致开环的最终速度过高,或没有解决问题,可以尝试以下方法:
• 减少观测器的增益G2,它可以降低扰动对速度反馈的影响。
• 通常G2应该按照/2,/4,/6,/8方式来减少。
• 放宽观测器的收敛条件,这样使观测器更容易收敛:
• 使用新的电机库,可以设置速度变化波动为80%(PLL) ,或400%(Cordic)。
• 这种情况下需要增加反向电动势幅度与估算速度一致性的检查。
• 更改速度/扭矩的爬升率:根据实际负载和转子的惯性等情况,让加速度更加柔和,防止突然加速导致对反向电动势估算的扰动。
相关电机的使用说明

STM32d的速度位置检测

STM32 电机控制固件提供了四种速度和位置反馈功能实现。其中两个实现使用了嵌入在某些电机中的传感器,如霍尔传感器或正交编码器。另外两个实现根据 Luenberger 观测器的电机反电动势估计结果来估计转子的速度和位置。该观测器通过与一个锁相环(PLL)耦合来推算出速度和角度,另一个则是通过与坐标旋转数字计算机(CORDIC)耦合来重建转子的角度和速度

反电动势过零检测
反电动势过零检测

元件 说明
编码器速度和位置反馈 :该元件使用正交编码器的输出来测量电机转子的速度和位置。
霍尔速度和位置反馈: 该元件使用两个霍尔效应传感器的输出来测量电机转子的速度和位置。
状态观测器 + PLL 速度和位置反馈: 该元件使用状态观测器以及软件 PLL 来估计电机转子的速度和位置。
状态观测器 + CORDIC 速度和位置反馈 :该元件使用状态观测器以及 CORDIC(坐标旋转数字计算),STM32G 系列或者高等级的有相关硬件加速可以使用这种方式,来估计电机转子的速度和位置。

BR2804 1700kv 2300kv rc brushless motors
Model KV(rpm/v) Volate (v) MotorWeight (g)AppROX NoLoadCurrent (A) No Load Speed (rpm) Load Current(A) Load Speed(rpm) Prop Pull(g) G/A
BR2804-2300 2300 11.1 20 0.8 24830 10.8 14970 7035 380 35
BR2804-1700 1700 11.1 23 0.6 18000 5.6 12540 7035 257 46

总体描述

生成的代码主要有下面结果部分:
1.Application/MDK-ARM 是ARM的启动代码。
2.Application/User主要是用户代码。
3.Drivers/STM32G*** 是驱动部分代码。
4.Drivers/CMSIS应该是ARMCortex-M系列IP的硬件抽象标准,Common Microcontroller Software Interface Standard (CMSIS),CMSIS enables consistent device support and simple software interfaces to the processor and its peripherals, simplifying software reuse, reducing the learning curve for microcontroller developers, and reducing the time to market for new devices. (就理解一个抽象层,方便换芯片后快速使用不用改软件)。
5.Middlewares/MotorControl 该部分认为是电机控制的中间层,主要电机相关底层控制都在这个部分。

在这里插入图片描述

基本配置分析

使用2S 模式的芯片管脚定义如下:
在这里插入图片描述

ADC 采集电流

采集电流有下面几个方式,从SIMPLE FOC 拿了个图来做说明。我开始认为ST是检测时为了解每相加电压后的电流状态如下图白色部分时间的电流(主要受单电阻模式的干扰理解有误,以为在高压侧和低压侧时电机上没有电流的(实际是有电流的)。实际多电阻的情况下撤销外部施加的电压影响,电机磁场和惯性还是会让电流存在,这个时候测出来的电流是FOC需要的电流。

在线电流检测
低压侧电流检测
高压侧电流检测 (SIMPLE FOC 不支持,硬件上接法不性)

在这里插入图片描述
3种电流检测的3总模式硬件上的描述

在这里插入图片描述

下面的是2个采样点用1个ADC交换采集(采集下桥壁电流-低压侧电流采集)。

注意采集下桥臂因为有反向电流,采样原始波形有负。

在这里插入图片描述

程序可以使用没有用的PWM,比如PWM4使能但是不设置作为输出。作为AD 启动的自动触发条件,定时自动采集电流。
在这里插入图片描述

下面的是2个采样点用2个ADC交换采集(采集电机线上的电压-高压侧电流采集)。

采用2路同时采集,不用分2次触发可以一次触发。

在这里插入图片描述

在这里插入图片描述

单电阻采集

这部分我没有使用可以自行看相关介绍,看懂前2个应该能明白。

ADC 配置

ADC1 开启了两个通道电流采集,使用定时器触发模式来触发2个RANK 通道的采集,分别如下。
在这里插入图片描述

在这里插入图片描述

ADC2对温度和总线电压进行了采集。ADC2 开启了两个通道电流采集,使用定时器触发模式来触发2个RANK 通道的采集,分别如下。
在这里插入图片描述
在这里插入图片描述

对于电流的采集是要求比较高的部分,采用的定时器触发模式进行AD采集(需要在代码中确认一下,对于触发是哪两路需要确认一下)。

在这里插入图片描述

使用到的单位分析

在STM32程序中大量使用16位和32位的整形表示数据,比如角度、电流、电压因为使用整形计算比较适合单片机。不过使用整数表示相关数据实际上都是进行了比例缩放或者可以称为单位转变。

角度单位

转子角度单位
MC API 中使用的转子角度测量单位被称为 s16degree,其定义如下:
1s16degree = 2ߨ
65536rad (17)

在这里插入图片描述

速度单位

在这里插入图片描述

电流单位

在这里插入图片描述

电压单位

电机控制 API 使用的外加相电压单位被称为 s16V,其定义如下:
1s16V = VMAX/32768

VMAX也可以用类似的方式 获得,在设置时电压采样有设置值有个比例关系。
不过找到程序中是相电压:

/max phase voltage, 0-peak Volts/
#define MAX_VOLTAGE (int16_t)((ADC_REFERENCE_VOLTAGE/SQRT_3)/VBUS_PARTITIONING_FACTOR)

和一个BEMF反电动势电压,不过反电动势电压计算,其中1.2(我认为是一个范围值,故意为1.2倍·暂时想不到是什么原理在其他版本中没有看到1.2个个倍数)
#define MAX_BEMF_VOLTAGE (uint16_t)((MAX_APPLICATION_SPEED_RPM * 1.2
MOTOR_VOLTAGE_CONSTANT
SQRT_2)/(1000u*SQRT_3))

在这里插入图片描述

反向电动势原理

方向电动势仿真

中断分析

中断开启了ADC1-2 ,定时器BRK_TIM15,TIM16 UP 中断,串口2中断 外部15-10中断(具体GPIO?中断),DMA1中断,DAM2中断。
PC13为开始停止按键

static void MX_NVIC_Init(void)
{
  /* ADC1_2_IRQn interrupt configuration */
  NVIC_SetPriority(ADC1_2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),2, 0));
  NVIC_EnableIRQ(ADC1_2_IRQn);
  /* TIM1_BRK_TIM15_IRQn interrupt configuration */
  NVIC_SetPriority(TIM1_BRK_TIM15_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),4, 1));
  NVIC_EnableIRQ(TIM1_BRK_TIM15_IRQn);
  /* TIM1_UP_TIM16_IRQn interrupt configuration */
  NVIC_SetPriority(TIM1_UP_TIM16_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
  /* USART2_IRQn interrupt configuration */
  NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),3, 1));
  NVIC_EnableIRQ(USART2_IRQn);
  /* EXTI15_10_IRQn interrupt configuration */
  NVIC_SetPriority(EXTI15_10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),3, 0));
  NVIC_EnableIRQ(EXTI15_10_IRQn);
  /* DMA1_Channel1_IRQn interrupt configuration */
  NVIC_SetPriority(DMA1_Channel1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  /* DMA2_Channel2_IRQn interrupt configuration */
  NVIC_SetPriority(DMA2_Channel2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(DMA2_Channel2_IRQn);
}

调用关系分析

在main 函数中调用电机初始化,本程序主函数循环为空理解为说有的程序都运行在中断中:

__weak void MX_MotorControl_Init(void) 
{
  /* Reconfigure the SysTick interrupt to fire every 500 us. */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/SYS_TICK_FREQUENCY);
  /* Initialize the Motor Control Subsystem */
  MCboot(pMCI);
  mc_lock_pins();//对PIN 的初始
  
}
  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值