温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
基于
Keil
直流电机
建模
仿真
实验
验证
wwwele169com|95实验研究0 引言STM32 系列单片机在无刷直流电机的控制应用领域使用非常普遍13。不少开发者使用 Keil Vision 作为 STM32的编程开发工具。不过,开发者很少挖掘使用它的特殊仿真功能,例如调试函数功能4、逻辑分析仪功能等。目前,在技术上能同时实现 C 语言代码仿真运行及STM32 单片机仿真有三种方式。第一种方式,利用 Keil Vision 的 DLL 虚拟接口扩展功能进行仿真57。主要是通过 VC+等开发软件,依据电机数学模型,开发专用的 DLL库来实现。这种方式必须借助第三方编程软件进行二次开发,开发难度较高、周期长、实用性不强。第二种方式,通过电路仿真软件 Proteus 实现仿真控制812。Proteus 只支持少量 STM32 型号仿真,在兼容性方面存在不足,各种调试问题较多。第三种方式,利用 Matlab Simulink 实现无刷直流电机控制仿真并自动生成代码1315。主要是通过Simulink 生成控制图框并仿真运行,再通过 RTW 模块自动生成 C 语言代码。该方法直观性好、可自动生成控程序,是目前研究热点之一。但是,该方法存在使用配置繁琐、代码可读较性差、代码冗长执行且效率不高等问题,并不适合容在量小、运算速度低的 STM32 芯片上使用。为 减 少 Matlab、Proteus、VC+等辅助工具的使用,仅在Keil Vision 软件上并实现无刷直流电机仿真与控制程序开发。本文提出了一种新方法,即将无刷直流电机的数学模型转换为 Keil Vision 调试脚本,建立无刷直流电机仿真模型。并设计多段目标速度曲线来验证控制程序对虚拟电机的控制效果,同时测试实际平台控制效果。1 无刷电机模型 1.1 电压平衡方程电机的数学模型采用二相导通、星形、三相六状态形式,电压平衡方程1617整理如下:000000000000aaaabbbbccccueRiLMiuRiLMp ieRiLMiue =+(1)式中,p 是微分算子(d/dt);ia、ib、ic是三相电、子电流(A);ua、ub、uc是三相电子电压(V);ea、eb、ec是三相定子的反电动势(V);L 为三相定子自感(H);M为三相定子互感(H);R 为三相定子绕组的相电阻()。电磁转矩方程:()ea ab bc crTe ie ie i=+(2)其中,Te为电磁转矩(N.m);r为转子角速度(rad/s)。启动时,速度r为零。如果利用公式(2)计算电磁转矩,结果为无穷大,与实际情况不符。因此,需要将公式进行转换。根据 BLDC 的反电势波形为梯形波的特点,如图 1 所示。基于 Keil 的无刷直流电机建模仿真与实验验证何凡锋,刘晓波,丁浩(首都航天机械有限公司,北京,100076)摘要:为挖掘Keil软件的仿真潜力,提高C语言电机控制程序开发效率,提出了一种利用Keil调试脚本实现无刷直流电机建模与仿真的方法。首先,将无刷直流电机的平衡方程离散化,建立数学模型;然后,把离散方程编写成调试脚本文件;最后,在调试脚本里面加入霍尔信号计算、电压计算、反电势计算等辅助函数构成一个完整的电机仿真模型。仿真试验与实验验证结果表明,在使用相同控制程序的情况下,仿真电机与实际电机的转速都能成功追踪目标速度。该方法对于拓展Keil软件仿真能力、减少其他仿真软件使用、降低开发者负担方面极具实用意义。关键词:虚拟仿真;BLDC;PWM控制;Keil;调试脚本0123456789101112-1-0.500.510123456789101112-1-0.500.510123456789101112-1-0.500.51cba角度/rad图 1 a、b、c反电动势波形图DOI:10.16589/11-3571/tn.2023.03.02896|电子制作 2023 年 2 月实验研究引入三个与转子的实际电角 e 有关的函数 a、b、c,函数各取值范围都是-1+1。根据反电动势与转子的转速成正比、与梯形波成正比、与极对数成正比、与磁链成正比的关系,得公式:()()()nraeabnrbecnrcep fluxeep fluxep flux =(3)式中,pn是电机极对数;flux 是单个绕组的磁链(Wb);e 为转子电角度(rad)。由公式(2)与(3),可把电磁转矩方程转换为:()()()()enaeabebcecTp fluxiii=+(4)另外,无刷电机的运动方程为:reLrdTTBJdt=+(5)其中,B为阻尼系数(N.m.s/rad);J为电机转动惯量(kg.m2);TL为负载转矩(N.m)。根据公式(1)到(5),整理得:()()()asaaaebsbbbecscccereLrrrdiLuRiedtdiLuRiedtdiLuRiedtdJTTBdtddt=(6)其 中 r 为 转 子 的 角 度(rad),电 角 度 e 关 系 为e=pnr。1.2 平衡方程离散化将方程(6)近似离散化,采样周期 T 小于最小时间常数的 1/10。在一个周期 T 内,时间 t kt(k+1)T,k 是自然数,整理后的电机离散方程:()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()11111aaaaeabbbbebccccecreLrrrrrTikTukTRikTekTikTLMTikTukTRikTekTikTLMTikTukTRikTekTikTLMTkTT kTTBkTkTJkTkT TkT+=+=+=+=+=+(7)式中,Te(kT)=pnfluxa(e(kT)ia(kT)+b(e(kT)ib(kT)+c(e(kT)ic(kT)。2 脚本语言编写电机模型Keil Vision软件提供了一种功能强大的调试脚本语言,其语言编写格式与 C 编程语言相似,是纯文本文件。这里的脚本是针对 STM32F103C8T6 芯片而编写,脚本的 PWM 端口分别是 PA8、PA9、PA10、PB13、PB14、PB15,霍尔传感器端口是 PB8、PB7、PB6,主要内如图 2 所示。图 2 电机仿真模型脚本图脚本的第 1 行,reset 命令用于刷新工作区;第 2 行,定义全局变量;第 429 行,编写了两个局部辅助函数;第30144 行,放置了 BLDC 的主仿真 SIGNAL 信号函数。信号函数内部由变量定义及初始化部分和主循环体部分两部分组成。主循环体包括霍尔信号计算部分、三相电压计算部分、反电势计算部分、电机微分方程求解部分和辅助调试部分组成;第 145 行,用于启动电机。下面介绍脚本文件的一些主要部分。2.1 辅助函数部分辅助函数部分由 Hall 和 Phi_abc 两个局部函数组成。Hall 局部函数用于计算霍尔高低电平信号,输入参数 pole表示电机的极对数,rot_angle 表示电机转子当前实际角度,hall_mounting_angle 是指霍尔传感器在电机定子静止坐标下的安装角度,其返回值为 0 与 1,0 代表低电平,1 代表高电平。主要工作原理是:根据转子的 NS 磁极划分成 1N 个扇形区,奇数扇区代表 N 极,偶数扇区代表 S 极。工作时,假想转子是固定的,霍尔传感器能绕着转子转动,转动方向与实际转向相反,当转动到 the_r 角度后,判断该位置落在转子 1N 个扇区的具体区,再根据扇区的极性输出高低电平。函数内容如下:func int Hall(float the_r,float pole,float hall_mounting_angle)float N,the;int i;N=2*pi/(2*pole);the=(hall_mounting_angle-the_r+N/2)%(2*pi);wwwele169com|97实验研究if(the trap)temp=trap;if(temp -trap)temp=-trap;return(temp/trap);2.2 霍尔信号计算部分霍尔信号计算部分的目的是把仿真模型的转子位置信号传递给 STM32F103C8T6 控制程序。霍尔传感器是按120标准安装,分别用 Ha、Hb、Hc 表示,其安装位置分别是在 60、180、300位置。主要代码如下:Ha=Hall(theta_r,m_Pn,pi/(3*m_Pn);Hb=Hall(theta_r,m_Pn,pi/m_Pn);Hc=Hall(theta_r,m_Pn,-pi/(3*m_Pn);p1index=Ha*4+Hb*2+Hc;PORTB=(PORTB&(0 x018)|(0 x018)*Ha);/PB8PORTB=(PORTB&(0 x017)|(0 x017)*Hb);/PB7PORTB=(PORTB&(0 x016)|(0 x01EGR产生 CC1G 中断_WSHORT(0 x40000814,0 x0002);/0 x40000814 是TIM4-EGR 在内存中的地址p0index=p1index;主要工作原理是:Hall 函数计算转子当前角度下三处霍尔传感器的高低电平,然后向芯片 PB8、PB7、PB6 三个霍尔信号引脚输出电平信号,并触发定时器 TIM4 的 CC1G中断。p1index、p0index是便于Hall索引计算的全局变量。_WSHORT 函数系统自带函数,用于直接对程序段内存地址进行写入操作。2.3 三相电压计算部分根据本次所用开发板硬件电路设计,STM32F103C8T6芯片的PWM控制端口输出高电平,相应的桥臂MOS则关闭,反之则开启。仿真时,程序不断地查询 PWM 控制端口的电平,根据端口的电平计算Ua,Ub,Uc的电压。主要内容如下:if(_RBYTE(0 x200000B9)=0 x05|_RBYTE(0 x200 000B9)=0 x06)reg_ccmr1=_RSHORT(0 x40012C18);/CCMR1 读取桥臂状态reg_ccmr2=_RSHORT(0 x40012C1C);/CCMR2pu=(reg_ccmr1&0 x0070)4;pv=(reg_ccmr1&0 x7000)12;pw=(reg_ccmr2&0 x0070)4;if(pu=6|pv=6|pw=6)/过 滤 杂 乱 信 号,确 保 在PWM 输出状态才换向switch(p1index)case 4:if(PORTA&(0 x018)Ua=0;Ub=0;Uc=0;elseUa=Udc/2.0;Ub=0;Uc=-Udc/2;break;case 1:if(PORTA&(0 x0110)Ua=0;Ub=0;Uc=0;elseUc=Udc/2.0;Ua=0;Ub=-Udc/2;break;case 5:if(PORTA&(0 x018)Ua=0;Ub=0;Uc=0;elseUa=Udc/2.0;Ub=-Udc/2;Uc=0;break;case 2:if(PORTA&(0 x019)Ua=0;Ub=0;Uc=0;elseUa=-Udc/2;Ub=Udc/2.0;Uc=0;break;case 6:if(PORTA&(0 x019)Ua=0;Ub=0;Uc=0;elseUa=0;Ub=Udc/2;Uc=-Udc/2;break;case 3:if(PORTA&(0 x0110)Ua=0;Ub=0;Uc=0;elseUa=-Udc/2;Uc=Udc/2;Ub=0;break;elseUa=0;Ub=0;Uc=0;2.4 反电势计算部分反电势的计算比较简单,先通过 Phi_abc 函数计算之后,再乘以电机极对数、转子转速就得到了各相反电势。内容如下:phi_a=Phi_abc(theta_e-pi/6,m_trap);/m_trap=0.5phi_b=Phi_abc(theta_e-pi/6-pi*2/3,m_trap);phi_c=Phi_abc(theta_e-pi/6+pi*2/3,m_trap);ea=m_Pn*m_flux*phi_a