✨ 长期致力于磁通切换、永磁直线电机、矢量控制、定位力、推力波动、初始位置检测无位置传感器、A&D5345研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
如需沟通交流,点击《获取方式


(1)基于有限元与傅里叶分析的单齿结构定位力解析模型:

针对6槽17极磁通切换永磁直线电机的双凸极结构,提出将电机分解为若干个单齿模块,每个模块的定位力通过有限元计算得到离散数据点,然后采用傅里叶级数拟合为三角函数之和。分析表明,定位力的基波频率为电角度的12倍,幅值约为85牛,三次谐波幅值为32牛。将各单齿的定位力按照空间相位叠加,得到总定位力波动的峰峰值为210牛,占额定推力的17.5%。基于该解析模型,设计了一种电流谐波注入补偿方法:在d-q轴电流指令中注入5次和7次谐波,谐波幅值分别为基波幅值的6%和4%,相位优化后使合成推力波动降低至48牛,降幅达77%。通过有限元验证,注入谐波后的定位力波动实测为55牛,与模型预测吻合。该方法无需改变电机结构,仅通过控制系统实现,适用于已定型的电机产品。

(2)基于电流反馈解耦的定位力自适应补偿控制器:

在矢量控制框架内,设计了一个定位力观测器实时估计剩余推力波动,并通过前馈补偿消除其影响。观测器采用模型参考自适应结构,参考模型为理想直线电机的二阶动态,可调模型包含定位力傅里叶模型。自适应律根据速度跟踪误差和电流误差调整傅里叶系数,收敛时间约0.05秒。在速度环中加入谐振控制器,中心频率设置为定位力基波频率(12倍电频率),品质因数取10。实验平台以A&D5435装置为核心,采样频率为10千赫兹。实验结果表明,在0.2米每秒匀速运行时,加入补偿控制器后的推力波动峰峰值从原来的210牛降低到32牛,速度波动从±0.025米每秒减小到±0.006米每秒。在加速度为2米每平方秒的加减速过程中,推力波动的抑制效果依然明显,波动幅度不超过45牛。该补偿控制器在负载变化时也能自适应调整,当负载从空载增加到500牛时,定位力观测器在0.1秒内重新收敛,推力波动仅增加12牛。

(3)基于脉宽电压矢量注入的零速初始位置检测两步法:

为了解决磁通切换永磁直线电机动子初始位置未知时的无位置传感器启动问题,设计了一种两步检测法。第一步:依次施加六个不同方向(间隔60度电角度)的脉宽电压矢量,每个矢量持续500微秒,测量各相电流的峰值。根据电流峰值与电感饱和特性的关系,初步确定动子所在的60度电角度区间。第二步:在初步确定的区间内,施加更小步长的电压矢量(步长15度电角度),并采用高频小信号注入法(频率1千赫兹,幅值20伏)提取位置误差信号,通过比例积分调节器收敛到精确位置。实验结果显示,第一步的区间判断准确率为100%,第二步收敛后的位置误差小于2度电角度,相当于0.16毫米的直线位移。整个检测过程耗时0.12秒,启动转矩冲击小于额定转矩的8%。与传统的高频注入法相比,本方法不需要转子凸极效应,特别适用于磁通切换电机的双凸极结构,且避免了注入高频信号引起的额外噪声和损耗。在重载启动(500牛)条件下,本方法仍能准确检测初始位置,启动平稳无反转。

import numpy as np
import control
from scipy.optimize import minimize

class LFSPM_Model:
    def __init__(self):
        self.Ld = 0.008; self.Lq = 0.008
        self.Psi_f = 0.12
        self.B = 0.01  # viscous friction
        self.M = 12.5   # mass kg
        self.tau = 0.03 # pole pitch
    def force_equation(self, id, iq, x):
        # x: position in meters
        theta_e = 2*np.pi*x/self.tau
        cogging = 85*np.sin(12*theta_e) + 32*np.sin(36*theta_e)
        F_em = 1.5*np.pi/self.tau * (self.Psi_f*iq + (self.Ld-self.Lq)*id*iq)
        return F_em - cogging, theta_e

class ForceRippleObserver:
    def __init__(self, num_harmonics=2):
        self.A = np.zeros(num_harmonics)  # amplitudes
        self.phase = np.zeros(num_harmonics)
        self.gamma = 100.0  # adaptation gain
    def update(self, speed_error, theta_e):
        # adaptive law for Fourier coefficients
        for h in range(1, len(self.A)+1):
            self.A[h-1] += self.gamma * speed_error * np.sin(h*theta_e) * 0.001
            self.phase[h-1] += self.gamma * speed_error * np.cos(h*theta_e) * 0.001
        total_ff = 0.0
        for h in range(1, len(self.A)+1):
            total_ff += self.A[h-1]*np.sin(h*theta_e + self.phase[h-1])
        return total_ff

class InitialPositionDetector:
    def __init__(self, Ld, Lq, Vdc=300):
        self.Ld = Ld; self.Lq = Lq
        self.Vdc = Vdc
    def step1(self, phase_currents):
        # phase_currents: list of 6 peak currents for each vector
        max_idx = np.argmax(phase_currents)
        interval_deg = max_idx * 60
        return interval_deg
    def step2(self, interval_deg, injection_freq=1000):
        # inject high frequency voltage and demodulate
        angle = interval_deg + 30  # middle of interval
        error_signal = 0.0
        # simulate PI loop
        Kp_pi = 0.5; Ki_pi = 10.0
        integ = 0.0
        for _ in range(50):
            # simulate position error estimation (simplified)
            error = np.sin(2*(angle - interval_deg))  # characteristic of HF injection
            integ += error*0.001
            angle_corr = Kp_pi*error + Ki_pi*integ
            angle += angle_corr*0.001
        return angle

def optimal_harmonic_injection(F_ripple, theta_e):
    # minimize residual force ripple by injecting 5th/7th harmonics
    def objective(x):
        i5d, i5q, i7d, i7q = x
        F_total = F_ripple
        # add harmonic forces (simplified model)
        F5 = 50 * i5q * np.sin(5*theta_e)
        F7 = 30 * i7q * np.sin(7*theta_e)
        return np.sqrt(np.mean((F_total + F5 + F7)**2))
    bounds = [(-10,10),(-10,10),(-5,5),(-5,5)]
    res = minimize(objective, [0,0,0,0], bounds=bounds)
    return res.x

if __name__ == '__main__':
    motor = LFSPM_Model()
    observer = ForceRippleObserver()
    detector = InitialPositionDetector(0.008,0.008)
    # test initial detection
    fake_currents = [10,12,9,15,8,7]  # peaks from six vectors
    interval = detector.step1(fake_currents)
    print('Interval (deg):', interval)
    final_angle = detector.step2(interval)
    print('Final electrical angle:', final_angle)
    # test force ripple compensation
    theta = np.linspace(0,4*np.pi,1000)
    force_rip, _ = motor.force_equation(0,10, theta*0.03/(2*np.pi))
    comp = [observer.update(0.1, t) for t in theta]
    comp_force = force_rip + np.array(comp)
    print('Original ripple peak:', np.max(force_rip)-np.min(force_rip))
    print('Compensated ripple peak:', np.max(comp_force)-np.min(comp_force))

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐