8bit单片机FOC矢量控制PMSM电机无传感器

合集下载

基于高频注入法的pmsm无位置传感器控制

基于高频注入法的pmsm无位置传感器控制

摘要永磁同步电机(PMSM)因其体积小、效率高、能量密度高等特点,已经在工业生产、日常生活、新能源汽车等领域中得到了广泛的应用。

常用的永磁同步电机控制策略都需要实时获知转子的位置,目前一般是通过角度传感器来获得转子位置,但与此同时,带有角度传感器的控制系统往往需要控制系统提供额外的接口电路,而且需要考虑传感器的稳定性和成本等问题,一些工作情况比较恶劣的情况下甚至不允许系统加装传感器。

鉴于这些原因,无位置传感器的PMSM控制成为当前需要解决的一个问题。

本文针对这一问题,研究了基于高频信号注入法的PMSM无位置传感器的控制策略。

本文首先分析了PMSM的基本结构以及数学模型,然后介绍了空间矢量脉冲宽度调制(SVPWM)的理论。

在SVPWM的基础上,介绍了PMSM的矢量控制,即通过坐标变换解耦,把控制系统的励磁分量和转矩分量单独控制。

在矢量控制系统的大框架下,介绍了高频信号注入法的基本工作原理,即在电机的基波电压中注入幅值远低于直流总线电压、频率远高于转子电角度频率的正弦信号,然后对高频信号激励下的定子电流进行采样,通过滤波器获得含有转子位置的高频信号,再通过一系列数学运算解算出转子位置。

在这些理论基础上,建立了旋转高频注入法和脉振高频注入法的MATLAB/Simulink模型,仿真结果表明两种高频注入法都能较好的跟踪转子位置。

设计了以MKV46F256VLH16为核心的PMSM无位置传感器控制系统,并在图形化上位机FreeMASTER平台运行了基于脉振高频注入法的实验,得到了详细的实验波形和数据。

论文最后通过仿真和实验结果,得出结论。

关键词:永磁同步电机 无位置传感器 矢量控制 高频注入法AbstractPermanent Magnet Synchronous Motor(PMSM) has been widely used in the field of industrial production, daily life, new energy vehicles and so on due to its small volume, high efficiency, high energy density, etc. In general, common control strategy for PMSM needs real-time rotor position, which is usually obtained by rotor position sensor. Meanwhile, control system with position sensor should offer additional interface electric circuit, and the stability and cost of position sensor should be taken into consideration. In addition, position sensor could not be installed in harsh situation. In consideration of these reasons, sensorless control system for PMSM need to be proposed. This paper aims at this issue and studies strategy of sensorless control on PMSM based on high frequency signal injection.This paper analyzes the basic structure and mathematic model of PMSM, and introduces the theory of Space Vector Pulse Width Modulation(SVPWM). B ased on SVPWM, vector control system of PMSM is introduced, which decouples excitation and torque variable using coordinates transform, so two variables could be controlled alone. Basic principle of high frequency signal injection is introduced based on the frame of vector control. Sinusoidal signal is injected into motor basic voltage, whose amplitude is far below dc bus voltage and frequency is far higher than rotor electrical frequency. After sampling stator current which is generated by high frequency injection, high frequency signal with rotor position information could be obtained by filter. Rotor position could be solved with mathematic operation by high frequency signal. Based on these theoretical analysis, MATLAB/Simulink model of rotating high frequency signal injection and fluctuating high signal frequency injection are built, which have superior performance on rotor position trace. At last, a sensorless PMSM control system experiment platform is designed, which uses the MKV46F256VLH16 chip as the core component, and experiment of high frequency signal injection is operated on graphic upper-computer FreeMASTER, and detailed experimental waveforms and data are obtained.Finally, this paper draw a conclusion based on simulation and experiment.Keywords:PMSM; Sensorless; Vector Control; High Frequency Signal Injection目录摘要 (I)Abstract ................................................................................................................................................... I I 目录. (III)第一章绪论 (1)1.1研究背景 (1)1.2国内外发展现状及分析 (3)1.3本文主要研究内容 (5)第二章PMSM的数学模型与控制 (7)2.1永磁同步电机的基本结构 (7)2.2 PMSM的数学模型 (8)2.3 SVPWM算法的原理与实现 (12)2.4 PMSM的矢量控制 (15)2.5本章小结 (17)第三章高频信号注入法的PMSM无位置传感器控制 (18)3.1 高频激励下的PMSM数学模型 (18)3.2 旋转高频电压注入法的PMSM无传感器控制 (20)3.3 脉振高频电压注入法的PMSM无传感器控制 (23)3.3.1 脉振高频电压注入法的基本原理 (23)3.3.2 基于跟踪观测器的转子位置估计方法 (25)3.3.3 基于PLL转子位置估计方法 (26)3.4 转子极性判断 (28)3.5 本章小结 (30)第四章高频注入法的Simulink仿真 (32)4.1 基于SVPWM的FOC控制算法仿真 (32)4.1.1 SVPWM算法仿真模块 (32)4.1.2 基于SVPWM的FOC控制算法仿真 (35)4.2旋转高频电压注入法系统仿真 (37)4.3脉振高频电压注入法系统仿真 (41)4.4 两种高频注入法的比较 (43)4.5 本章小结 (43)第五章PMSM无传感器矢量控制系统设计 (45)5.1 系统硬件结构 (45)5.1.1 主控制芯片 (46)5.1.2 电源电路 (46)5.1.3 IPM功率电路 (48)5.1.4 信号采集电路 (49)5.1.5 通信电路 (51)5.2 系统软件结构 (51)5.2.1 主程序设计 (52)5.2.2 中断子程序设计 (52)5.2.3 SVPWM程序设计 (53)5.2.4 PID程序设计 (54)5.2.5 脉振高频注入法检测转子位置程序设计 (55)5.3 基于高频注入法的无位置传感器永磁同步电机矢量控制系统试验 (56)5.4本章小结 (60)结论与展望 (61)参考文献 (63)攻读硕士学位期间取得的研究成果 (67)致谢 (68)第一章绪论第一章绪论1.1研究背景能源一向是人类生活、工业生产必不可缺的物质根本。

《永磁同步电机全速度范围无位置传感器控制技术的研究与实现》范文

《永磁同步电机全速度范围无位置传感器控制技术的研究与实现》范文

《永磁同步电机全速度范围无位置传感器控制技术的研究与实现》篇一一、引言永磁同步电机(Permanent Magnet Synchronous Motor, PMSM)是一种重要的电动传动系统部件,因其具有高效率、高功率密度和良好的调速性能等优点,被广泛应用于工业、汽车、航空航天等领域。

然而,传统的PMSM控制系统通常需要使用位置传感器来获取电机的位置信息,这不仅增加了系统的复杂性和成本,还可能降低系统的可靠性和稳定性。

因此,无位置传感器控制技术成为了近年来研究的热点。

本文旨在研究并实现永磁同步电机全速度范围无位置传感器控制技术,以提高电机控制系统的性能和可靠性。

二、永磁同步电机基本原理永磁同步电机的基本原理是利用永磁体产生的磁场与定子电流产生的磁场相互作用,产生转矩,使电机转动。

PMSM的转子不需要外部供电,具有结构简单、运行可靠等优点。

然而,要实现电机的精确控制,必须准确获取电机的位置和速度信息。

传统的PMSM控制系统通过位置传感器来获取这些信息,但无位置传感器控制技术则通过电机内部的电气信号来估算电机的位置和速度。

三、无位置传感器控制技术无位置传感器控制技术主要通过电机内部的电气信号来估算电机的位置和速度。

常见的无位置传感器控制技术包括基于反电动势法、模型参考自适应法、滑模观测器法等。

本文采用基于反电动势法的无位置传感器控制技术,通过检测电机的反电动势来估算电机的位置和速度。

四、全速度范围无位置传感器控制策略为了实现永磁同步电机全速度范围的无位置传感器控制,需要采用合适的控制策略。

本文采用基于矢量控制的策略,通过实时调整电机的电压和电流来控制电机的位置和速度。

在低速阶段,采用初始位置估算和误差补偿技术来提高位置的估算精度;在高速阶段,则采用反电动势法来准确估算电机的位置和速度。

此外,还采用了自适应控制技术来应对电机参数变化和外部干扰的影响。

五、实验与结果分析为了验证本文所提出的无位置传感器控制技术的有效性,进行了实验验证。

永磁同步伺服电机(PMSM)的基本结构 和控制单元驱动器原理

永磁同步伺服电机(PMSM)的基本结构 和控制单元驱动器原理

永磁同步伺服电机(PMSM)的基本结构和控制单元驱动器原理导语:永磁交流伺服系统的驱动器经历了模拟式、模式混合式的发展后,目前已经进入了全数字的时代。

全数字伺服驱动器不仅克服了模拟式伺服的分散性大、零漂、低可靠性等确定,还充分发挥了数字控制在控制精度上的优势和控制方法的灵活,使伺服驱动器不仅结构简单,而且性能更加的可靠。

随着现代电机技术、现代电力电子技术、微电子技术、永磁材料技术、交流可调速技术及控制技术等支撑技术的快速发展,使得永磁交流伺服技术有着长足的发展。

永磁交流伺服系统的性能日渐提高,价格趋于合理,使得永磁交流伺服系统取代直流伺服系统尤其是在高精度、高性能要求的伺服驱动领域成了现代电伺服驱动系统的一个发展趋势。

永磁交流伺服系统具有以下等优点:电动机无电刷和换向器,工作可靠,维护和保养简单;定子绕组散热快;惯量小,易提高系统的快速性;适应于高速大力矩工作状态;相同功率下,体积和重量较小,广泛的应用于机床、机械设备、搬运机构、印刷设备、装配机器人、加工机械、高速卷绕机、纺织机械等场合,满足了传动领域的发展需求。

永磁交流伺服系统的驱动器经历了模拟式、模式混合式的发展后,目前已经进入了全数字的时代。

全数字伺服驱动器不仅克服了模拟式伺服的分散性大、零漂、低可靠性等确定,还充分发挥了数字控制在控制精度上的优势和控制方法的灵活,使伺服驱动器不仅结构简单,而且性能更加的可靠。

现在,高性能的伺服系统,大多数采用永磁交流伺服系统其中包括永磁同步交流伺服电动机和全数字交流永磁同步伺服驱动器两部分。

伺服驱动器有两部分组成:驱动器硬件和控制算法。

控制算法是决定交流伺服系统性能好坏的关键技术之一,是国外交流伺服技术封锁的主要部分,也是在技术垄断的核心。

交流永磁伺服系统的基本结构交流永磁同步伺服驱动器主要有伺服控制单元、功率驱动单元、通讯接口单元、伺服电动机及相应的反馈检测器件组成,其结构组成如图1所示。

其中伺服控制单元包括位置控制器、速度控制器、转矩和电流控制器等等。

无传感器FOC控制提高电器电机控制设计

无传感器FOC控制提高电器电机控制设计

无传感器FOC控制提高电器电机控制设计邮件群发对于大多数家用电器制造商,提高电器效率和降低可闻噪声是最优先考虑的事项。

通常,政府通过严格的法规来推动对效率的要求。

然后,有一些消费者会愿意引领潮流,以相对较高的价格购买“更绿色”的电器。

这驱使电器制造商研究相应的解决方案,解决效率和可闻噪声方面的问题,同时让增加的整体系统成本保持最低。

例如,电器制造商希望设计出可以快速响应速度变化(包括洗涤和甩干两个过程)的洗衣机。

一些高级电机控制技术,如磁场定向控制(FOC),也称为矢量控制,有助于设计出更加安静节能的洗衣机。

洗衣机控制拓扑本文主要关注如何部署FOC来设计高效、安静的洗衣机。

通过分析洗衣机的构造,可以了解为什么需要高效的电机控制技术。

如图1所示,最新型的洗衣机带有一个滚筒单元,该结构由BLDC电机或PMSM电机、电机控制器电路板、带按键用户界面电路板和显示单元组成。

控制器电路板和用户界面电路板可以使用串行链路(如UART、SPI或专有串行协议)进行通信,用以设置所需的洗涤负载、漂洗速度,以及处理其他命令。

根据所接收到的命令,电机控制器电路板会调整电机速度和扭矩。

电机是洗衣机中最主要的用电部件,用电量可达总用电量的85%。

因此,对于PMSM控制的任何改进,都可以显著节省用电和成本。

为此,高效的电机控制对于设计更好的电器非常关键。

图1新型洗衣机的构造新型信号控制器促进电器设计半导体技术的发展促进了数字信号控制器(DSC)和功率电子开关的产生,它们可以用于设计变速电机。

实际上,得益于DSC高效而高成本效益的电机功率管理,电器不再需要局限于使用一些定制的硬件和控制技术。

例如,借助Microchip最新一代的dsPIC DSC系列,电器制造商现在可以设计出显著节省用电和成本的电机系统。

这是因为dsPIC DSC上包含专用于电机控制应用的外设。

这些外设包括电机控制脉宽调制(MCPWM)、高速ADC和可扩展闪存程序存储器。

基于foc矢量控制的无刷直流电机控制器设计

基于foc矢量控制的无刷直流电机控制器设计

基于foc矢量控制的无刷直流电机控制器设计文章标题:基于FOC矢量控制的无刷直流电机控制器设计探索序无刷直流电机(BLDC)在各种应用中都得到了广泛的应用,由于其高效率、低噪音和低维护要求,成为了许多行业的首选。

在BLDC电机的控制中,FOC矢量控制技术已经成为了一种重要的控制方法。

本篇文章将全面探讨基于FOC矢量控制的无刷直流电机控制器设计的相关内容,旨在帮助读者更深入地理解这一技术并应用于实际项目中。

一、FOC矢量控制技术的概述在介绍基于FOC矢量控制的无刷直流电机控制器设计之前,首先我们需要了解FOC矢量控制技术的概念和原理。

FOC矢量控制是一种通过控制电机的电流和转子磁通实现对电机的高效、精准控制的技术。

在FOC矢量控制中,通过对电机的三相电流进行精准控制,可以实现电机的高效运行,降低能耗和提高性能。

1. FOC矢量控制的基本原理在FOC矢量控制中,电机的三相电流被分解为两个独立的分量:一个是沿着磁场转子磁通方向的磁通分量,另一个是与磁场垂直的转子电流分量。

通过对这两个分量进行独立控制,可以实现对电机的高精度控制,达到最佳的运行效果。

2. FOC矢量控制的优势相较于传统的直接转矩控制(DTC)技术,FOC矢量控制具有更高的控制精度和动态响应,能够更好地适应各种工况下的控制需求,对电机能效比提升和转矩波动降低等方面有着显著的优势。

二、基于FOC矢量控制的无刷直流电机控制器设计基于FOC矢量控制的无刷直流电机控制器设计是一个复杂而又具有挑战性的工程项目。

在设计过程中,需要考虑到电机的参数识别、闭环控制算法、硬件设计等多个方面的内容。

1. 电机参数识别在进行FOC矢量控制器设计之前,首先需要对电机进行参数识别。

这包括电机的定子电感、磁通链路和电阻等参数的准确测量和识别,这些参数的准确性将直接影响到FOC矢量控制的效果。

2. 闭环控制算法针对FOC矢量控制的无刷直流电机控制器设计,闭环控制算法是非常关键的一部分。

无速度传感器矢量控制原理

无速度传感器矢量控制原理

无速度传感器矢量控制原理无速度传感器矢量控制(Sensorless Vector Control)是一种在没有速度传感器的情况下实现电机精确速度和转矩控制的方法。

该控制方法广泛应用于交流电机,如感应电机和永磁同步电机。

无速度传感器矢量控制原理的核心在于通过电机自身的电压和电流信息,估计出电机的转速和转矩,进而控制电机的运行状态。

无速度传感器矢量控制的实现需要以下主要步骤:1. 电流采样与转换:首先,需要对电机的三相电压和电流进行采样并进行模数转换,通常使用模数转换器(ADC)来完成这项工作。

采样频率应该足够高,以确保对电流的精确测量。

2. 电流控制环:电流控制环的目的是保持电机的电流和预期值保持一致,以实现所需的电机转矩控制。

电流控制环通常由PID控制器组成,控制器使用电流误差信号来调整电机的电压,使电流保持在预期值。

3. 电流解耦:在电流控制环之后,需要进行电流解耦操作,将三相电流转换成直流坐标系下的两个分量:一个是磁场分量,另一个是扭矩分量。

这一步骤的目的是消除电机中的交叉耦合,使得电机的控制更为简单。

4. 转速和转矩估算:在无速度传感器的情况下,需要通过电流和电压信息来估计电机的转速和转矩。

估算转速的常用方法是利用感应电机的反电动势(back-EMF)或者永磁同步电机的电压方程,并使用观测器来估计转速值。

转矩的估算可以利用电流和电压信息,结合电机的恒功率特性来进行估算。

5. 转速和转矩控制:通过估算出的转速和转矩值,可以根据要求设定所需的转速和转矩控制策略。

通常采用PID控制器来根据转速和转矩误差来调整电机的电压,以使电机的运行状态达到设定值。

需要注意的是,无速度传感器矢量控制虽然可以不依赖于传感器来实现电机的速度和转矩控制,但在实际应用中,需要具备准确的电机模型和参数,以及高性能的数字信号处理器(DSP)或者微控制器(MCU)来实现控制算法。

此外,该方法在低速和低转矩运行时可能存在一些误差,因此在特定应用场景中,可能还需要使用速度传感器来提高控制的准确性。

无感FOC控制原理

无感FOC控制原理

无感FOC控制原理
FOC(Field-Oriented Control)即磁场定向控制,是一种电机矢量
控制方法。

它通过将三相交流电机的控制转化为两个独立轴的控制,分别
是磁场轴和扭矩轴,从而实现电机的高性能控制。

FOC的基本原理是将三相交流电机的磁场定向到一个轴上,再根据需
要的扭矩进行控制,从而实现电机的高效、精准控制。

FOC的控制过程主要包括四个步骤:磁场转换、磁场定向、电流控制
和速度/位置控制。

首先,在磁场转换阶段,三相交流电流经过变换,被转换到一个以磁
场轴为方向的直流电流上。

这一步骤是为了将三相交流电机的控制转化为
直流电机的控制。

然后,在磁场定向阶段,经过磁场转换后的直流电流被分解为两个分量,一个是磁场轴上的电流(Id),另一个是扭矩轴上的电流(Iq)。


场轴的电流控制电机的磁通,扭矩轴的电流控制电机的转矩。

接下来,在电流控制阶段,通过对磁场轴和扭矩轴上的电流进行控制,来达到对电机磁通和转矩的控制。

通常采用PID控制算法来实现电流控制,根据反馈信号和期望值之间的差异来调节输出信号。

最后,在速度/位置控制阶段,根据需要对电机的速度或位置进行控制。

通常通过对电机角度或速度进行反馈,结合PID控制算法来实现。

FOC控制的优点在于能够实现高效、高精度的电机控制,具有较低的
谐波失真和较高的输出效率。

同时,FOC控制还可以实现电机的快速动态
响应和较低的转矩波动。

总的来说,FOC控制是一种能够实现电机高性能控制的方法,通过将电机的磁场定向到一个轴上,并根据需要控制扭矩和速度/位置,实现电机精准、高效的控制。

意法半导体电机控制参考指南说明书

意法半导体电机控制参考指南说明书

电机控制3 意法半导体电机控制生态系统4 PMSM & BLDC电机8 3相感应电机(ACIM)12 步进电机14 直流有刷电机16 通用电机18 开关磁阻电机19 微控制器25 STM32电机控制生态系统29 电机驱动器IC39 电源模块44 功率MOSFET46 IGBT47 600-650 V IGBT系列48 1200 V IGBT系列49 二极管 & 整流器50 晶闸管、双向可控硅和交流开关 52 MOSFET和IGBT栅极驱动器56 碳化硅和氮化镓栅极驱动器58 信号调理ST对电机控制的承诺推进了环保革命。

在环保革命理念的指引下,电机控制正向着更高效电机和驱动器的方向快速发展。

此外,为了支持新技术的市场占有率,需要以最低成本提高集成度,同时提升安全性和可靠性。

ST致力于电机控制方面的研究已有20余年,是最早意识到这些趋势的公司。

意法半导体正通过一系列的创新突飞猛进,诸如集成式智能功率模块和系统级封装、单片式电机驱动器、快速高效的功率开关、具有电压暂态保护功能的可控硅、以及功能强大且安全的微控制器等。

无论您使用哪种电机技术(从传统的和坚固的,到最现代的和最高效的),ST都能够提供合适的电子器件和完整的生态系统(包括一系列评估板、参考设计、固件和开发工具),以简化和加速设计流程。

保持最新资讯更多信息和最新材料,请访问ST网站的控制应用页面http:///motorcontrol3意法半导体电机控制PMSM &永磁同步电机和直流无刷电机因其更高效、运行更安静、更可靠等优点,正在越来越多的应用中替代直流有刷电机。

尽管结构不同,但所有三相永磁电机(BLDC、PMSM或PMAC)都是由脉冲宽度调制(PWM)的三相桥(三个半桥)驱动,以便采用频率幅度可变的电压和电流为电机供电。

为了提供最高水平设计灵活性,ST的产品组合包括面向高压和低压应用的特定产品,如单片驱动IC、功率MOSFET、IGBT、栅极驱动器、功率模块和专用微控制器,用于满足广泛的应用需求。

无传感器PSMS马达FOC控制算法详解

无传感器PSMS马达FOC控制算法详解

is e s = T ω T ∝ is
v
电机
瞬时功率
− 转矩 x 转速 = 反电势 x 相电流
© 2008 Microchip Technology Incorporated. All Rights Reserved. 1258 FOC
Slide
16
PMSM运行
转矩产生
考虑到F的方向,T=Fr sin θ
S S N N
90°
S
采用FOC
S
N N N
S
转矩
BEMF(V) θ 电流(I)
T = Fs*Rs*sinθ
© 2008 Microchip Technology Incorporated. All Rights Reserved.
1258 FOC
Slide
21
PMSM运行
90°
π 0 -π
© 2008 Microchip Technology Incorporated. All Rights Reserved. 1258 FOC
Slide
3
课程安排
PMSM概述
− − − − − PMSM应用 PMSM与BLDC的比较 PMSM结构 PMSM特性 PMSM操作
© 2008 Microchip Technology Incorporated. All Rights Reserved.
1258 FOC
Slide
4
PMSM应用
© 2008 Microchip Technology Incorporated. All Rights Reserved.
1258 FOC
Slide
29
信号处理
b

PMSM永磁同步电机设计技术方案(PFC功率因数、FOC磁场导向及矢量控制设计永磁同步电机技术)

PMSM永磁同步电机设计技术方案(PFC功率因数、FOC磁场导向及矢量控制设计永磁同步电机技术)

PMSM永磁同步电机设计技术方案(PFC功率因数、FOC磁场导向及矢量控制设计PMSM永磁同步电机技术)1、多数电机控制系统通常将PFC作为系统的第一级。

由于逆变器中开关器件的存在,若没有PFC 输入级,那么所产生的电流中将会含有显著的谐波分量。

此外,由于电机负载的高度感性,输入电流将会给输入系统引入大量无功功率,从而降低整个系统的效率。

PFC 级作为电机控制应用中的一个前端转换器,能够较好地调节输出电压以及降低输入电流中的谐波含量。

2、本应用场合选用PMSM电机。

电能质量的提高通过进行功率因数校正(Power Factor Correction,PFC)来实现,而电机的高效控制可以通过使用无传感器磁场定向控制(Filed Oriented Control,FOC)技术来实现。

3、家电业通常要求这些算法能够得以低成本的方式加以实现。

这可通过将PFC 和无传感器FOC 算法集成在单片数字信号控制器(Digital Signal Controller,DSC)上来实现。

4、本PFC 和无传感器FOC 集成系统中,采用了带下列外设的处理器:⑴、脉冲宽度调制器(Pulse Width Modulator,PWM);⑵、模数转换器(Analog-to-Digital Converter,ADC);⑶、正交编码器接口(Quadrature Encoder Interface,QEI)。

5、处理器上的这些外设最好具有以下特性:A、多源触发ADC;B、输入转换速率最快为1Msp;C、同步采样多个模拟通道技术;D、故障检测与处理能力;图1显示了一个PFC 和无传感器FOC 集成系统的结构图。

在这类应用中,按照平均电流模式控制的标准升压转换器拓扑是实现数字化PFC的首选方法。

6、双分流无传感器FOC 法是一种驱动PMSM 电机的转速控制方法。

它克服了那些无法配置位置和速度传感器的应用中存在的限制条件。

7、PMSM 电机的速度和位置可以通过测量相电流来估算。

基于foc矢量控制的无刷直流电机控制器设计

基于foc矢量控制的无刷直流电机控制器设计

知识专题:基于foc矢量控制的无刷直流电机控制器设计一、简介无刷直流电机(BLDC)是一种使用电子换向控制器而不是机械换向器来转动电机的电机类型。

它具有高效率、低噪音和长寿命等优点,因此在许多领域得到广泛应用。

而基于磁场定向控制的FOC矢量控制则是一种提高无刷直流电机性能的先进控制技术。

本文将就基于FOC矢量控制的无刷直流电机控制器设计进行深入探讨,包括其原理、设计要点以及应用场景等。

二、FOC矢量控制原理及优势FOC矢量控制是一种以矢量运算为基础的控制策略,通过对电机磁场和电流进行矢量控制,可以实现电机高效、精确的控制。

与传统的直接转矩控制(DTC)相比,FOC矢量控制具有转矩响应快、效率高、噪音小等优势,特别适用于对电机性能要求较高的场景。

三、基于FOC矢量控制的无刷直流电机控制器设计要点1. 电机参数识别:首先需准确识别电机的参数,包括电感、电阻、磁通极链系数等。

这些参数将直接影响控制器设计和性能表现。

2. 闭环控制策略:基于FOC矢量控制的无刷直流电机控制器通常采用闭环控制策略,例如PID控制。

通过精确的闭环控制,可以实现电机的精准转速和位置控制。

3. 硬件设计:控制器的硬件设计非常重要,包括功率电子器件选型、电路板布线、散热设计等。

合理的硬件设计可以提高控制器的稳定性和效率。

4. 软件算法:控制器的软件算法是FOC矢量控制的核心,其中包括空间矢量调制、换向算法、速度闭环控制等。

优秀的软件算法可以提高电机的控制精度和动态性能。

四、基于FOC矢量控制的无刷直流电机控制器应用场景1. 电动汽车:FOC矢量控制的无刷直流电机控制器在电动汽车领域有着广泛的应用。

其高效、精准的控制特性可以提高汽车的动力性能和续航里程。

2. 工业机器人:在工业机器人领域,FOC矢量控制的无刷直流电机控制器可以实现机器人的高速精度运动,提高生产效率和产品质量。

个人观点基于FOC矢量控制的无刷直流电机控制器设计是现代电机控制领域的重要研究方向,其在提高电机性能和应用领域拓展方面具有巨大潜力。

PMSM无传感器FOC的单分流三相电流重构算法

PMSM无传感器FOC的单分流三相电流重构算法

PMSM无传感器FOC的单分流三相电流重构算法PMSM(永磁同步电机)是一种非常常见的电机类型,它在许多应用领域中都广泛使用。

传统的PMSM控制通常使用传感器来测量电机转子的位置和速度,从而实现闭环控制。

然而,传感器的使用会增加系统成本和复杂性,并且容易受到外部干扰。

为了解决这个问题,无传感器FOC(磁场定向控制)算法被开发出来。

这种算法通过测量电机的三相电流和母线电压来估计转子的位置和速度,从而实现对电机的控制。

单分流三相电流重构算法是一种常见的无传感器FOC算法,下面我将详细介绍该算法的原理和实现方法。

首先,让我们来了解一下磁场定向控制的基本原理。

磁场定向控制是通过控制电机的磁场方向和大小来实现对电机的控制。

在PMSM中,磁场的方向取决于电流的方向。

因此,通过控制电流的大小和相位可以实现对电机的控制。

在传统的PMSM控制中,电流通过传感器来测量。

然而,无传感器FOC算法使用电流测量数据来估计电机转子的位置和速度。

这就需要通过一定的算法来将电流数据转换为转子位置和速度信息。

单分流三相电流重构算法是一种常用的无传感器FOC算法。

该算法使用了电流空间矢量投影技术来重构电流矢量。

具体来说,该算法通过测量的三相电流和电压数据来计算转子位置和速度的估计值。

算法的主要步骤如下:1.测量三相电流和电压:首先,需要测量电机的三相电流和电压。

可以使用传感器或者其他方法来获取这些数据。

2.电流矢量转换:将三相电流转换为d轴和q轴的电流矢量。

这可以通过三相到两相的变换公式来实现。

3.电流空间矢量投影:使用通过电流矢量转换得到的d轴和q轴电流矢量,结合电压数据,进行电流空间矢量投影计算。

这个计算过程可以使用PMSM的数学模型来实现,通过计算得到转子位置和速度的估计值。

4.控制器设计:根据转子位置和速度的估计值,设计闭环控制器来控制电机的转矩和转速。

这可以使用PID控制器或者其他控制算法来实现。

5.输出电压控制:根据控制器的输出,使用PWM(脉宽调制)技术来控制逆变器的输出电压,从而驱动电机。

PMSM电机控制

PMSM电机控制

PWM2H
PWM3H PMSM
PWM2L
PWM3L
故障
<
Ia 电流 限制
Ib
2010 Microchip Technology Inc.
DS01078B_CN 第 5 页
AN1078
磁场定向控制
从不同的角度理解磁场定向控制
理解 FOC (有时称为矢量控制)如何工作的一种方法 是在头脑中设想参考坐标变换过程。如果从定子的角度 来设想交流电机的运行过程,则会看到在定子上施加了 一个正弦输入电流。该时变信号产生了旋转的磁通。转 子的速度是旋转磁通矢量的函数。 从静止的角度来看, 定子电流和旋转磁通矢量看似交流量。 现在,设想在电机内部,转子随着定子电流所产生的旋 转磁通矢量以相同的速度同步旋转。如果从这个角度观 察稳态条件下的电机,那么定子电流看似常量,且旋转 磁通矢量是静止的。 最终,希望控制定子电流来获得期望的转子电流(不可 直接测量得到)。 通过参考坐标变换,可使用标准控制 环,如同控制直流量一样实现对定子电流的控制。
已发表了一些基于 dsPIC DSC 电机控制系列的应用笔 记 (见 “参考文献”)。 这些应用笔记可从 Microchip 网站 ()获取。 本应用笔记说明了 dsPIC DSC 如何利用特别适合电机 控制的外设 (电机控制 PWM 和高速 ADC)来执行 PMSM 的无传感器磁场定向控制。 dsPIC DSC 的 DSP 引擎支持必要且快速的数学运算。
ห้องสมุดไป่ตู้
图 4:
系统概述
PWM1H PWM1L PWM2H PWM2L 3相 PMSM 3 相逆变器
dSPIC33FJ32MC204
PWM3H PWM3L
AN0 AN1 RB8

永磁同步电机无位置传感器控制技术研究综述

永磁同步电机无位置传感器控制技术研究综述

永磁同步电机无位置传感器控制技术研究综述永磁同步电机(PMSM)是一种应用广泛的电机类型,其具有高效率、高功率密度、高性能和低噪音等优点,因此被广泛应用于电动汽车、风力发电、工业驱动等领域。

PMSM在控制过程中需要准确地获取转子位置信息,以实现精确的控制。

传统的PMSM控制需要使用位置传感器来获取转子位置信息,位置传感器的使用会增加系统复杂性和成本。

无位置传感器控制技术成为了研究的热点之一。

本文将对永磁同步电机无位置传感器控制技术进行综述,介绍其发展历程、控制方法和应用前景。

传统的PMSM控制技术需要使用位置传感器(如编码器、霍尔传感器)来获取转子位置信号,以实现闭环控制。

位置传感器的使用会增加系统的复杂性和成本,并且可能存在故障导致系统性能下降的风险。

为了克服这些问题,研究人员提出了无位置传感器的PMSM控制技术,以减少系统复杂性和成本。

最早的无位置传感器控制技术是基于反电动势观测的方法,即通过测量电机绕组的反电动势来估计转子位置。

这种方法在低速和低转矩区域的性能较差,且容易受到参数变化的影响。

随着研究的深入,基于模型的预测控制(Model Predictive Control, MPC)成为了无位置传感器控制技术的研究热点。

MPC通过建立电机的数学模型,预测未来一段时间内的电流、转矩和转子位置,然后根据预测结果实施控制。

MPC能够克服传统闭环控制的调参困难和性能受到参数变化影响的问题,具有较好的控制性能和鲁棒性。

除了MPC,基于观测器的无位置传感器控制技术也得到了广泛的研究和应用。

目前,永磁同步电机无位置传感器控制技术已经取得了较大的进展,成为了PMSM控制技术的重要分支之一,并且在电动汽车、风力发电、工业驱动等领域得到了广泛的应用。

1. 基于反电动势观测的方法基于反电动势观测的无位置传感器控制方法是最早的研究成果之一,其原理是通过测量电机绕组的反电动势来估计转子位置。

这种方法简单易实现,但在低速和低转矩区域的性能较差,且容易受到参数变化的影响。

一种PMSM无位置传感器FOC控制的滑模观测器设计

一种PMSM无位置传感器FOC控制的滑模观测器设计
尤其适用于 电器产品 。 此外, 其 定子 磁场是 由正 弦分布 的绕 组产生 的, 与感 应电机相 比, P MS M 在其尺 寸上具有无可比拟的优势。 由于使用 了无 刷技术这种 电机的电噪音也 比直流电机小。 作 为无位置传感器 F O C 控制算法 的核心,
T ech nol ogy
技术

种P MS M无位 置传感器F O C 控 制 的滑模 观测器设 计
杨宇澄 徐 庆
( 合肥 荣事达三 洋 电器股份 有限责任 公 司 安 徽合肥
2 5 0 0 8 8 )
摘要 : 永磁 同步 电机 无传 感 器 控 制技 术不 但 能 够 降 低 系 统 成本 , 而 且 能 够增 加 系 统 的可 靠 性 。 为实 现 永 磁 同 步 电机 无 位 置传 感 器 运 行, 提 出
Y a n g Y u c h e n g X U Q i n g
( H e f e i g o n g s h i d a S a n y o E l e c t r i c C o .L i d . ,2 3 0 o 8 8 )
Ab s t r a c t : S e n s o r 1 e s s c o n t r o l o f PM SM ha s b e e n a ho t r e s e a r c h t o p i c o f mo t o r c o n t r o l t e c hn o l o gy w hi c h ha s t h e
比较大 , 不太适 用于对成本敏感的实时控制 系统
等。 各大家 电制造商均在研究和优化变频控制方 案, 而合肥 三洋作为国内最早推 出变频洗 衣机的
企 业, 对变 频电机在洗衣机上 的应用有着深入的

电机控制中的FOC

电机控制中的FOC

电机控制中的FOCFOC(Field-Oriented Control),即磁场定向控制,也称矢量变频,是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最佳选择。

FOC 精确地控制磁场大小与方向,使得电机转矩平稳、噪声小、效率高,并且具有高速的动态响应。

由于FOC的优势明显,目前已在很多应用上逐步替代传统的控制方式,在运动控制行业中备受瞩目。

FOC典型控制框图如下。

为了得到电机转子的位置、电机转速、电流大小等信息作为反馈,首先需要采集电机相电流,对其进行一系列的数学变换和估算算法后得到解耦了的易用控制的反馈量。

然后,根据反馈量与目标值的误差进行动态调节,最终输出3相正弦波驱动电机转动。

FOC按照电机有无传感器来区分可以分为有传感器FOC和无传感器FOC。

对于有传感器FOC,由于电机的传感器(一般为编码器)能反馈电机转子的位置信息,因此在控制中可以不使用位置估算算法,控制起来相对无传感器FOC 简单,但是对带传感器的电机应用来说,往往对控制性能要求较高。

对于无传感器FOC,由于电机不带任何传感器,因此不能通过简单读取传感器的测量值来得到电机转子的位置信息,所以在控制中需要通过采集电机相电流,使用位置估算算法来计算转子位置。

虽然无感FOC的控制难度较大,但是它可以避免传感器故障的风险,并且省去了传感器的成本,同时简化了电机与驱动板间的布线。

目前,无感FOC多应用在风机类的场合中。

除了以上提到的纯粹的有传感器FOC和无传感器FOC,在一些场合中,也常常结合无传感器和有传感器控制的优点进一步提高控制性能。

在FOC电机控制中,应用到的算法除了上文提到的无传感器位置估算算法外,还有转子定位算法、最大转矩、最大电压提速算法、顺风启动算法、逆风启动算法、恒功率算法、缺相检测算法等。

轻动科技拥有完善的FOC技术,在业内处于领先水平。

变频伺服步进工控产品研发生产技术方案提供商深圳市伊瑞软件技术有限公司Shenzhen Erik Software Technology Co.,Ltd。

一种PMSM无位置传感器FOC控制的滑模观测器设计

一种PMSM无位置传感器FOC控制的滑模观测器设计

一种PMSM无位置传感器FOC控制的滑模观测器设计杨宇澄;徐庆【摘要】永磁同步电机无传感器控制技术不但能够降低系统成本,而且能够增加系统的可靠性.为实现永磁同步电机无位置传感器运行,提出了一种基于自适应滑模观测器的非线性速度/角度估算方法.基于永磁同步电机的数学模型,根据实测电流与估算电流之间的误差构成滑模面,将反电动势估算值反馈引入到电机电流观测中.为简化调速系统的硬件结构,设计了一个截止频率可随转速变化的低通滤波器.【期刊名称】《家电科技》【年(卷),期】2013(000)005【总页数】3页(P89-91)【关键词】永磁同步电机;滑模观测器;无传感器;矢量控制【作者】杨宇澄;徐庆【作者单位】合肥荣事达三洋电器股份有限责任公司安徽合肥230088;合肥荣事达三洋电器股份有限责任公司安徽合肥230088【正文语种】中文1 引言随着电子技术的发展以及国家对家电节能要求越来越严格,变频技术在家电上的应用越来越广泛,如变频洗衣机、变频空调、变频冰箱等。

各大家电制造商均在研究和优化变频控制方案,而合肥三洋作为国内最早推出变频洗衣机的企业,对变频电机在洗衣机上的应用有着深入的研究。

洗衣机在洗涤过程中的负载始终处于动态变化中,并随着实际的洗涤量和选定的洗涤模式的不同而变化,尤其对于前开式滚筒洗衣机,当负载位于滚筒的顶部时,必须克服重力对电机负载做功。

在这种情况下,能够迅速处理动态负载变化的磁场定向控制(Field Oriented Control,FOC)脱颖而出,成为满足这些环境需求的主要方法。

基于无传感器FOC的PMSM控制,在家用电器上的应用有着无可比拟的成本优势。

无传感器FOC 技术也克服了在某些应用上的限制,即由于电机被淹或其线束放置位置的限制等问题,而无法部署位置或速度传感器。

由于PMSM使用了由转子上的永磁体所产生的恒定转子磁场,因此它尤其适用于电器产品。

此外,其定子磁场是由正弦分布的绕组产生的,与感应电机相比,PMSM在其尺寸上具有无可比拟的优势。

foc 电机矢量控制

foc 电机矢量控制

foc 电机矢量控制FOC电机矢量控制是一种高级的电机控制技术,它通过对电机的电流和电压进行精确控制,实现对电机的高效运行。

本文将对FOC电机矢量控制的原理、优势和应用进行介绍。

一、FOC电机矢量控制的原理FOC电机矢量控制的核心思想是将电机拆分成磁场定向控制和电流控制两个子系统。

首先,通过磁场定向控制,将电机的磁场与转子磁场的磁轴对齐,使电机旋转产生转矩。

然后,通过电流控制,控制电机的电流大小和相位,实现对电机的转速和转矩的精确控制。

具体来说,FOC电机矢量控制使用了两个坐标系:静态坐标系和旋转坐标系。

静态坐标系是以电机的定子为基准,旋转坐标系是以转子为基准。

在磁场定向控制中,通过变换静态坐标系到旋转坐标系,可以将电机的磁场与转子磁场的磁轴对齐。

在电流控制中,通过变换旋转坐标系到静态坐标系,可以将电机的电流转换为静态坐标系下的电流,从而实现对电流的精确控制。

二、FOC电机矢量控制的优势FOC电机矢量控制相比传统的电机控制技术具有如下优势:1. 高效运行:FOC电机矢量控制可以减少电机的功率损耗,提高电机的效率。

通过精确控制电机的电流和电压,可以使电机在不同负载下都能以最佳效率运行。

2. 高精度控制:FOC电机矢量控制可以实现对电机转速和转矩的精确控制。

通过精确控制电机的电流大小和相位,可以实现对电机的精确控制,从而满足不同应用场景的需求。

3. 高动态响应:FOC电机矢量控制可以实现对电机的快速响应。

通过精确控制电机的电流和电压,可以实现电机的快速加速和减速,提高电机的动态响应性能。

4. 低噪音和低振动:FOC电机矢量控制可以减少电机的噪音和振动。

通过精确控制电机的电流和电压,可以减少电机的震荡和共振现象,从而降低电机的噪音和振动。

三、FOC电机矢量控制的应用FOC电机矢量控制广泛应用于各种领域的电机控制中,包括工业控制、家用电器、交通运输等。

在工业控制领域,FOC电机矢量控制可以用于驱动各种类型的电机,如交流电机、直流电机和步进电机。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

说明:下面程序取自IFX 8位机无传感器PMSM电机矢量控制程序。

整个程序是连续的矢量控制计算函数,其中有图片说明打断,便于更好的理解。

其中包括坐标系变换,磁链角估算,PI速度环电流环调节。

(单片机XC886,Keil编译器Cavin整理)坐标系变换说明:双电阻采样得到两相电流(ia, ib),由abc120°静止坐标系Clarke变换到直角坐标系(iα, iβ),由(iα, iβ)静止直角坐标系Park变换到直角旋转坐标系(iq, id)。

直流id不变,通过PI速度环电流环得到期望直流iq,进行限幅控制。

由旋转坐标系(vq, vd)经过Park逆变换到静止坐标系(vα, vβ),然后再经过矢量调制成PWM控制电机。

无传感器角度估算:由Clarke变换得到(iα, iβ)和由Park逆变换得到的(vα, vβ),经过低通滤波器PT1,再由直角坐标系变极坐标系得到磁链估算角无传感器开环启动策略:在定子中加入幅值及频率都受控的电流,若PLL收敛,切换到FOC闭环控制。

软件流程图:void FOC_Calculation (void) using 1{#pragma asm;**************************************;* FOC_Calculation;**************************************;*;* this function contains all calculations;* necessary for the field oriented control.;*;* register bank 1 is used;*;**************************************;* push registers;**************************************push ACCpush bpush dphpush dplpush PSWpush SYSCON0; use register bank 0x01mov PSW,#0x08;;anl SYSCON0,#0xFE ; use standard SFRsmov CCU6_PAGE,#0xA0 ; select CCU6-page 0 SST2;**************************************;* ResultRegister3 Control;**************************************;* Multiplex RESR3 for ADC channel;* ch0, ch1 and ch6 in sequential queue;* Add ADC channel ch3 in triggered mode;*;* input ADC_RESR3;* guc_adc_ch;* gui_adc_ch_val;*;* output ADC_QINR0 = {ch0 -> ch1 -> ch6};* gui_adc_ch_val[guc_adc_ch++] = ADC_RESR3;*mov ADC_PAGE,#0x86 ; switch to ADC_page 6 save ST0mov ADC_QINR0,#0x83 ; channel 3, no refill, external trigger//mov ADC_QINR0,#0x07 ; add channel7 to queue (I_pfc) mov ADC_QINR0,#0x00mov r0,#gui_adc_ch_valmov ADC_PAGE,#0x03 ; switch to ADC_page 3 save no ST0mov @r0,ADC_RESRA3H ; gui_adc_ch_val[guc_adc_ch] = RESRA3 (H)inc r0mov a,ADC_RESRA3Lanl a,#0xe0 ; mask ADC status informationmov @r0,a ; gui_adc_ch_val[guc_adc_ch] = RESRA3 (L)//mov gi_I_pfc,ADC_RESRA2H//mov a,ADC_RESRA2L//anl a,#0xe0 ; mask ADC status information//mov gi_I_pfc+1,a;************************************** ;* current_calculation;************************************** ;* Take ADC values from ADC result;* registers and multiply by 8;*;* input ADC_RESR0, ADC_RESR1;*;* output R2 = [ -I2_shunt * 8 ]H;* R3 = [ -I2_shunt * 8 ]L;* A = [ (I2_shunt - I1_shunt) * 8 ]H;* R5 = [ (I2_shunt - I1_shunt) * 8 ]L;* R6 = [ I1_shunt * 8 ]H;* R7 = [ I1_shunt * 8 ]L;*mov r5,ADC_RESRA1Hmov a,ADC_RESRA1Lanl a,#0xE0 ; mask ADC status informationmov r4,amov r7,ADC_RESRA0Hmov a,ADC_RESRA0Lanl a,#0xE0 ; mask ADC status informationmov r6,amov ADC_PAGE,#0xC2 ; switch to old page restore ST0orl SYSCON0,#1 ; switch to mapped SFRsmov MDU_MD0,r6 ; MD3 = ADCR2_H [ RES9 | RES8 | RES7 | RES6 | RES5 | RES4 | RES3 | RES2 ] mov MDU_MD1,r7 ; MD2 = ADCR2_L [ RES1 | RES0 | 0 | VF | DRC | CHNR2 | CHNR1 | CHNR0 ] mov MDU_MD2,r4 ; MD1 = ADCR3_H [ RES9 | RES8 | RES7 | RES6 | RES5 | RES4 | RES3 | RES2 ] mov MDU_MD3,r5 ; MD0 = ADCR3_L [ RES1 | RES0 | 0 | VF | DRC | CHNR2 | CHNR1 | CHNR0 ] mov MDU_MD4,#0x22 ; shift right ADCR2/ADCR3 by 2 bitsmov MDU_MDUCON,#0x13; ; start bit-shiftnop ; 4 MDU readyclr cmov a, MDU_MR0subb a, offsetLmov a, MDU_MR1subb a, offsetHmov r6, ajnc okclr amov R7, amov R6, aok:clr cmov a, MDU_MR2subb a, offsetLmov r5, amov a, MDU_MR3subb a, offsetHmov r4, ajnc ok1clr amov R5, amov R4, aok1://mov r7,MDU_MR0//mov r6,MDU_MR1//mov r5,MDU_MR2//mov r4,MDU_MR3 ;-----------clr csubb a,r5mov r3,aclr asubb a,r4mov r2,a ; R2/R3 = -I2_shuntclr cmov a,r5 ; A = I2_shunt_Lsubb a,r7mov r5,a ; R5 = I2_shunt_L - I1_shunt_L mov a,r4 ; A = I2_shunt_Hsubb a,r6 ; A/R5 = I2_shunt - I1_shunt;**************************************;* phase current;**************************************;* Calculate currents I_phaseA and I_phaseB;* according the sector of space vector;*;* input R2 = [ -I2_shunt * 8 ]H;* R3 = [ -I2_shunt * 8 ]L;* A = [ (I2_shunt - I1_shunt) * 8 ]H;* R5 = [ (I2_shunt - I1_shunt) * 8 ]L;* R6 = [ I1_shunt * 8 ]H;* R7 = [ I1_shunt * 8 ]L;*;* output R4 = [ gi_I_phaseB ]H;* R5 = [ gi_I_phaseB ]L;* R6 = [ gi_I_phaseA ]H;* R7 = [ gi_I_phaseA ]L;*djnz guc_sector_s,SV_sectorB ; Sector A I1_shunt = Iu , I2_shunt = -Iwmov gi_I_phaseA+1,r7mov gi_I_phaseA,r6 ; I_phaseA = I1_shuntmov gi_I_phaseB+1,r5mov gi_I_phaseB,a ; I_phaseB = -(Iw + Iu) = I2_shunt - I1_shunt sjmp phase_current_endSV_sectorB:djnz guc_sector_s,SV_sectorC ; Sector B I1_shunt = Iv , I2_shunt = -Iwmov gi_I_phaseB+1,r7mov gi_I_phaseB,r6 ; I_phaseB = I1_shuntmov gi_I_phaseA+1,r5mov gi_I_phaseA,a ; I_phaseA = -(Iv + Iw) = I2_shunt - I1_shunt sjmp phase_current_endSV_sectorC:djnz guc_sector_s,SV_sectorD ; Sector C I1_shunt = Iv , I2_shunt = -Iumov gi_I_phaseB+1,r7mov gi_I_phaseB,r6 ; I_phaseB = I1_shuntmov gi_I_phaseA+1,r3mov gi_I_phaseA,r2 ; I_phaseA = -I2_shuntsjmp phase_current_endSV_sectorD:djnz guc_sector_s,SV_sectorE ; Sector D I1_shunt = Iw , I2_shunt = -Iu mov gi_I_phaseA+1,r3mov gi_I_phaseA,r2 ; I_phaseA = -I2_shuntmov gi_I_phaseB+1,r5mov gi_I_phaseB,a ; I_phaseB = -(Iu + Iw) = I2_shunt - I1_shunt sjmp phase_current_endSV_sectorE:djnz guc_sector_s,SV_sectorF ; Sector E I1_shunt = Iw , I2_shunt = -Iv mov gi_I_phaseB+1,r3mov gi_I_phaseB,r2 ; I_phaseB = -I2_shuntmov gi_I_phaseA+1,r5mov gi_I_phaseA,a ; I_phaseA = -(Iv + Iw) = I2_shunt - I1_shunt sjmp phase_current_endSV_sectorF:mov gi_I_phaseA+1,r7 ; Sector F I1_shunt = Iu , I2_shunt = -Iv mov gi_I_phaseA,r6 ; I_phaseA = I1_shuntmov gi_I_phaseB+1,r3mov gi_I_phaseB,r2 ; I_phaseB = -I2_shuntphase_current_end:;**************************************;* clark transform;**************************************;* transform from three phase system;* to two phase system;* I_beta = [(I_phaseB*2 + I_phaseA)/(sqr(3)*2)]*2;*;* input gi_I_phaseB;* gi_I_phaseA;*;* output gi_I_alpha;* gi_I_beta;*;I_phaseB*2 + I_phaseAmov a,gi_I_phaseB+1add a,ACCxch a,gi_I_phaseBaddc a,ACCxch a,gi_I_phaseB ; I_phaseB = I_phaseB*2add a,gi_I_phaseA+1mov MDU_MD0,a ; MD0 = [I_phaseB*2 + I_phaseA]_L mov a,gi_I_phaseBaddc a,gi_I_phaseAmov MDU_MD1,a ; MD1 = [I_phaseB*2 + I_phaseA]_H;(I_phaseB*2 + I_phaseA)/(sqrt(3)*2)mov MDU_MD4,#0xE6 ; MD4 = [0.57735 * 2^15]_Lmov MDU_MD5,#0x49 ; MD5 = [0.57735 * 2^15]_Hmov MDU_MDUCON,#0x14; ;->MDU start;I_phaseA*2mov a, gi_I_phaseA+1add a, ACCxch a, gi_I_phaseAaddc a, ACCmov b, axch a, gi_I_phaseA+1mov gi_I_alpha+1, a ;oscilloscopemov gi_I_alpha, b;(I_phaseB*2 + I_phaseA)/(sqrt(3)*2) * 2mov MDU_MD2,MDU_MR2mov MDU_MD3,MDU_MR3mov MDU_MD4,#0x02 ; shift right ADCR2/ADCR3 by 2 bitsmov MDU_MDUCON,#0x13; ; start bit-shiftnopnopmov gi_I_beta+1,MDU_MR2 ; I_beta = (I_phaseB*2 + I_phaseA)/sqr(3) , I_alpha = I_phaseA*2 mov gi_I_beta,MDU_MR3;**************************************;* flux estimation;**************************************;*;* Calculate the flux and angle;* PSI_alpha = integral( V_alpha + I_alpha * STATOR_R ) dt + I_alpha * STATOR_L;* PSI_beta = integral( V_beta + I_beta * STATOR_R ) dt + I_beta * STATOR_L ;* phi = atan( PSI_alpha / PSI_beta );*;* input gi_V_alpha;* gi_I_alpha;* gi_V_beta;* gi_I_beta;* gi_angle;* gi2_Integrator_alpha[0,1,2,3] ; stored values from integration via PT1 ;* gi2_Integrator_beta[0,1,2,3] ; stored values from integration via PT1 ;*;* output gi2_Integrator_alpha[0,1,2,3];* gi2_Integrator_beta[0,1,2,3];* gi_Flux_alpha;* gi_Angle_mem;* gi_angle;*;**************************************;*clr amov CD_STATC,a ; clear keep bits - interrupt disabledmov CD_CON,#0x48 ; Linear rotation mode - auto start MPS = 1 mov CD_CORDYH,gi_V_alpha ; Y = Imov CD_CORDYL,gi_V_alpha+1 ;mov CD_CORDZH,gi_I_alpha ; Z = R I_max = +4096/-4096mov CD_CORDZL,gi_I_alpha+1 ;mov CD_CORDXH,#STATOR_R_H ; X = Vmov CD_CORDXL,#STATOR_R_L ; CORDIC starts automatically; Y = Y + X*Z*16;**************************************;* Calculation ( (I_alpha * 2^STATOR_L_SCALE)* STATOR_L );*mov MDU_MD0,gi_I_alpha+1 ;4mov MDU_MD1,gi_I_alpha ;8#if STATOR_L_SCALE > 0mov MDU_MD4,#STATOR_L_SCALE ;12 leftshiftmov MDU_MDUCON,#0x13; ;16 bitshift#endifmov MDU_MD4,#STATOR_L_L ;12/4mov MDU_MD5,#STATOR_L_H ;16/8 MDU ready (bitshift)#if STATOR_L_SCALE > 0mov MDU_MD0,MDU_MR0 ;20mov MDU_MD1,MDU_MR1 ;24#endifmov MDU_MDUCON,#0x14; ;28 MR = I * Lmov r0,#gi2_Integrator_alpha ;32/2mov MDU_MD4,#FLUX_PT1_Z1_L ;34/6mov MDU_MD5,#FLUX_PT1_Z1_H ;36/10clr F0 ;40/12 F0 = 0 for PT1 scalermov CD_CORDYL,gi_V_beta+1 ;42/16 MDU readymov r5,MDU_MR3 ;40 R5 = [I_alpha * STATOR_L]_Hmov r4,MDU_MR2 ;44 R4 = [I_alpha * STATOR_L]_L CORDIC readymov r7,CD_CORDYH ; R7 = [V_alpha + I_alpha * STATOR_R]_Hmov r6,CD_CORDYL ; R6 = [V_alpha + I_alpha * STATOR_R]_L;**************************************;* Calculation (V_beta + I_beta * STATOR_R);*mov CD_STATC,a ; clear keep bits - interrupt disabledmov CD_CORDYH,gi_V_beta ;mov CD_CORDZH,gi_I_beta ; Z = Imov CD_CORDZL,gi_I_beta+1 ; X = Rmov CD_CON,#0x59 ; Linear rotation mode , start / MPS = 1;**************************************;* integration by PT1 integral(r6,r7)dt;*mov r3,#FLUX_PT1_Z2_Hmov r2,#FLUX_PT1_Z2_Llcall PT1_MDU ; PT1-return value L = *R1 , H = *R0;**************************************;* Calculation (I_beta * STATOR_L);*mov MDU_MD0,gi_I_beta+1mov MDU_MD1,gi_I_beta#if STATOR_L_SCALE > 0mov MDU_MDUCON,#0x13; ; bitshift#endifmov MDU_MD4,#STATOR_L_L ;4mov MDU_MD5,#STATOR_L_H ;8 MDU ready (bitshift)#if STATOR_L_SCALE > 0mov MDU_MD0,MDU_MR0mov MDU_MD1,MDU_MR1#endifmov MDU_MDUCON,#0x14; ; MR = I * L;**************************************;* _gi3_Flux_alpha[4,5] = [R5 + *R0, R4 + *R1];*mov a,r4 ;2 R4 = [ I_alpha * STATOR_L ]_Ladd a,@r0 ;4 *R1 = [ integral(V_alpha + I_alpha * STATOR_R)dt ]_L mov gi_Flux_alpha+1,a ;6mov a,r5 ;8 R5 = [ I_alpha * STATOR_L]_Hdec r0addc a,@r0 ;10 *R0 = [ integral(V_alpha + I_alpha * STATOR_R)dt ]_H mov gi_Flux_alpha,a ;12mov r0,#gi2_Integrator_beta ;14mov MDU_MD4,#FLUX_PT1_Z1_L ;18 MDU readymov MDU_MD5,#FLUX_PT1_Z1_H ;mov r7,CD_CORDYH ; R7 = [V_beta + I_beta * STATOR_R]_Hmov r6,CD_CORDYL ; R6 = [V_beta + I_beta * STATOR_R]_Lmov r5,MDU_MR3 ; R5 = [I_beta * STATOR_L]_Hmov r4,MDU_MR2 ; R4 = [I_beta * STATOR_L]_L;**************************************;* integration by PT1 integral(r6,r7)dt;*clr F0 ; F0 = 0 for PT1 scalermov r3,#FLUX_PT1_Z2_Hmov r2,#FLUX_PT1_Z2_Llcall PT1_MDU ; PT1-return value L = *R1 , H = *R0;**************************************;* CD_CORDY = [R5 + *R0, R4 + *R1];*mov a,r4 ; R4 = [ I_beta * STATOR_L ]_Ladd a,@r0 ; *R1 = [ integral(V_beta + I_beta * STATOR_R)dt ]_L mov CD_CORDYL,a ;mov a,r5 ; R5 = [ I_beta * STATOR_L]_Hdec r0addc a,@r0 ; *R0 = [ integral(V_beta + I_beta * STATOR_R)dt ]_H mov CD_CORDYH,a;**************************************;* calculation angle = atan( Flux_beta / Flux_alpha );*clr amov CD_STATC,a ; clear keep bits - interrupt disabledmov CD_CON,#0x02 ; Circular vectoring mode - auto start MPS = 1 mov CD_CORDZH,a ; Z = 0mov CD_CORDZL,a ;mov CD_CORDXH,gi_Flux_alpha ; X = Flux_alphamov CD_CORDXL,gi_Flux_alpha+1 ; CORDIC starts automaticallymov r7,guc_SpeedControlCounter ;4cjne r7,#0,_fb_CD0 ;6mov gi_Angle_mem,gi_angle ;10 store previous angle in angle_memmov gi_Angle_mem+1,gi_angle+1 ;14;**************************************;* inverse vector rotation;**************************************_fb_CD0:mov CD_CORDYL,gi_I_alpha+1 ;18 Y = Alphamov CD_CORDYH,gi_I_alpha ;22mov CD_CORDXH,gi_I_beta ;26 X = Beta;**************************************;* flux estimation continued;**************************************_fb_CD1:jb CD_BSY,_fb_CD1 ; wait for CORDIC result of angle calculationjnb gb_closed_loop,_fb_CD2a ; if( gb_closed_loop == 1 )mov gi_angle+1,CD_CORDZL ; {mov gi_angle,CD_CORDZH ; angle = atan( Flux_alpha / Flux_beta )sjmp _fb_CD2 ; }_fb_CD2a: ; during startup turn motor in open loop mov gi_Flux_angle+1,CD_CORDZL ; elsemov gi_Flux_angle,CD_CORDZH ; angle1 = atan( Flux_alpha / Flux_beta )mov MDU_MD0,gi_delta_angle+1 ; gi_delta_angle * gi_V_q_vf_slewmov MDU_MD1,gi_delta_anglemov MDU_MD4,gi_V_q_vf_slew+1mov MDU_MD5,gi_V_q_vf_slewmov MDU_MDUCON,#0x14; ; start Multiplikationmov R0,#gi_delta_angle+1 ; gi_angle += gi_delta_anglemov a,gi_angle+1 ; add delta angle at start-upadd a,@R0mov gi_angle+1,amov a,gi_angledec R0addc a,@R0mov gi_angle,amov r1,#gt_Iq_control+2clr amov @r1,adec r1mov R0,#gi_V_q_vf_offset+1 ; gi_V_q = gi_V_q_vf_offset + gi_delta_angle * gi_V_q_vf_slew * 256 mov a,MDU_MD1add a,@R0mov gi_V_q+1,amov @r1,amov a,MDU_MD2dec R0dec R1addc a,@R0mov gi_V_q,amov @r1,a;**************************************;* inverse vector rotation continued;**************************************;*;* rotate I_alpha and I_beta by angle;*;* input gi_I_alpha;* gi_I_beta;* gi_angle;*;* output gi_Id;* gi_Iq;*_fb_CD2:mov CD_STATC,a ; clear keep bits - interrupt disabledmov CD_CON,#0x4A ; Circular rotation mode - auto start MPS = 2 mov CD_CORDZH,gi_angle ; Z = gi_anglemov CD_CORDZL,gi_angle+1mov CD_CORDXL,gi_I_beta+1 ; CORDIC starts autmatically_vdm_CD0:jb CD_BSY,_vdm_CD0 ; wait for CORDIC result of inverse vector rotationmov gi_I_q+1,CD_CORDXL ; _gi_Iqmov gi_I_q,CD_CORDXH ;mov gi_I_d+1,CD_CORDYL ; _gi_Idmov gi_I_d,CD_CORDYH ;// uncomment this if scaling of gi_I_q to fullscale (8000 ... 7fff) is required// mov MDU_MD0,gi_I_q+1 ; MD0 = gi_I_q_L// mov MDU_MD1,gi_I_q ; MD1 = gi_I_q_H// mov MDU_MD4,#0xB8 ; MD4 = 16/K / 256 *2 _L // mov MDU_MD5,#0x09 ; MD5 = 16/K / 256 *2 _H // mov MDU_MDUCON,#13H; ; Start multiplication// nop// nop// nop// nop// nop// mov gi_I_q+1,MDU_MR1// mov gi_I_q,MDU_MR2 ; gi_I_q = gi_I_q * 16/K;**************************************;* Speed Calculation;**************************************;*;* calculation of speed = (angle_mem - angle) / T12PERIODE_HALF;*;* speed calculation is executed every;* (SPEED_CONTROL_RATE/CURRENT_CONTROL_RATE) of control loop;*;* input gi_angle;* gi_Angle_mem;* gi_Speed;*;* output *R0 = gi_Speed_H;* *R1 = gi_Speed_L;inc guc_SpeedControlCountermov a,guc_SpeedControlCounter ; if( ++_guc_SpeedControlCounter != (SPEED_CONTROL_RATE/CURRENT_CONTROL_RATE) ) jmp _node3_int1 cjne a,#(SPEED_CONTROL_RATE/CURRENT_CONTROL_RATE),_node3_int1mov guc_SpeedControlCounter,#0x00 ; else _guc_SpeedControlCounter = 0;clr c ; C = 0mov a,gi_angle+1 ; A = angle_Lsubb a,gi_Angle_mem+1 ; A = angle_L - angle_mem_Lmov r6,a ; R6 = (angle - angle_mem)_L = angle_L - angle_mem_Lmov a,gi_angle ; A = angle_Hsubb a,gi_Angle_mem ; A = angle_H - angle_mem_Hmov r7,a ; R7 = angle_H - angle_mem_Hmov r0,#gi_Speed+2mov a,#SPEED_PT1_Z;**************************************;* PT1 with 24bit memory;**************************************;*;* calculation of Y_(k) = Y_(k-1) + 2^(-Z) * { X_(k) - Y_(k-1) };*;* input Y [HLh] *R0 = Y_h;* X R6 = L, R7 = H;* Z a [1..15];*;* output *R0 = Y_H;*;* remark no limitation of subtract and add;* => X must be smaller than 0x3fff;*setb acc.5 ; select right shiftmov MDU_MD4,a ; MD4 = number of bits to shiftclr cclr asubb a,@r0 ; A = e_h = 0 - Y_hmov MDU_MD1,a ; MD1 = e_hdec r0mov a,r6 ; A = X_Lsubb a,@r0 ; A = e_L = X_L - Y_Lmov MDU_MD2,a ; MD2 = e_Ldec r0mov a,r7 ; A = X_Hsubb a,@r0 ; A = e_H = X_H - Y_Hmov MDU_MD3,a ; MD3 = e_Hmov MDU_MDUCON,#0x17; ; Start right-shift (X - Y)_HLh >> Z //wait for XC88x - no ws no double clknopnopnopnop//...inc r0 ;4inc r0 ;8nop ;12mov a,@r0 ;16 a = Y_hadd a,MDU_MR1 ; A = Y_h(k-1) + MR1mov @r0,a ; Y_h(k) = Y_h(k-1) + MR1dec r0mov a,@r0 ; a = Y_Laddc a,MDU_MR2 ; A = Y_L(k-1) + MR2mov @r0,a ; Y_L(k) = Y_L(k-1) + MR2mov r4,adec r0mov a,@r0addc a,MDU_MR3 ; A = Y_H(k-1) + MR3 + Cmov @r0,a ; Y_H(k) = Y_H(k-1) + MR3 + Cmov r5,a;* end of PT1 with 24bit memory;**************************************;**************************************;* Speed and Current Control;**************************************jb gb_closed_loop,_node3_int0 ; if( _gb_closed_loop == 1 ) jmp _node3_int0 ajmp _node3_int2 ; else jmp _node3_int2_node3_int0: ;;**************************************;* Speed Control;**************************************;*;* Load parameters for speed control;* call PI_controller;* use output as Iq_reference;*mov r7,gi_Speed_referencemov r6,gi_Speed_reference+1mov r0,#gt_Speed_control+1+5#ifdef SPEED_PI_KP_GAIN_128setb F0 ;Kp gain = 128#elseclr F0 ;Kp gain = 8#endiflcall PI_controller;* Limitation of IQ to positive (do not active brake) ; mov a,r6; jnb acc.7,_limit_end; mov r6, #0h; mov r7, #0h_limit_end:#ifdef LIMIT_IQ;* Limitation of speed control outputmov a,r6jnb acc.7,_limit_positivemov a, #LIMIT_IQ_Ladd a,r7mov a, #LIMIT_IQ_Haddc a,r6jc _limit_endmov r6, #~LIMIT_IQ_Hmov r7, #~LIMIT_IQ_Lsjmp _limit_end_limit_positive:mov a, #LIMIT_IQ_Lclr csubb a,r7mov a, #LIMIT_IQ_Hsubb a,r6jnc _limit_endmov r6, #LIMIT_IQ_Hmov r7, #LIMIT_IQ_L_limit_end:#endifmov gi_Iq_reference,r6mov gi_Iq_reference+1,r7_node3_int1:;************************************** ;* Current Control Id;************************************** ;*;* Load parameters for Id control;* call PI_controller and;* store result in Vd;*;* input;* gi_Id_reference;* gi_Id;*;* output;* gi_V_d;*mov r7,gi_Id_referencemov r6,gi_Id_reference+1mov r5,gi_I_dmov r4,gi_I_d+1mov r0,#gt_Id_control+1+5clr F0 ;Kp gain = 8lcall PI_controllermov gi_V_d,r6mov gi_V_d+1,r7;************************************** ;* Current Control Iq;************************************** ;*;* Load parameters for Iq control;* call PI_controller;* store result in Vq;*;* input;* gi_Iq_reference;* gi_Iq;*;* output;* gi_V_q;*mov r7,gi_Iq_referencemov r6,gi_Iq_reference+1mov r5,gi_I_qmov r4,gi_I_q+1mov r0,#gt_Iq_control+1+5clr F0 ;Kp gain = 8lcall PI_controllermov gi_V_q,r6mov gi_V_q+1,r7_node3_int2:;**************************************;* vector rotation;**************************************;*;* rotate gi_V_q and gi_V_d by angle;*;* input gi_V_q;* gi_V_d;* gi_angle;*;* output gi_V_alpha;* gi_V_beta;*clr amov CD_STATC,a ; clear keep bits - interrupt disabledmov CD_CON,#0x8A ; Circular rotation mode - auto start MPS = 4 mov CD_CORDZH,gi_angle ; Z = gi_anglemov CD_CORDZL,gi_angle+1mov CD_CORDYL,gi_V_q+1 ; Y = Q_kompmov CD_CORDYH,gi_V_q ;mov CD_CORDXH,gi_V_d ; X = D_kompmov CD_CORDXL,gi_V_d+1 ; CORDIC starts autmaticallymov CD_CORDZH,a ; Z = 0mov CD_CORDZL,a_MD_0:jb CD_BSY,_MD_0 ; wait for CORDIC with vector rotationmov r7,CD_CORDXL ; R7 <- V_alpha_Lmov r6,CD_CORDXH ; R6 <- V_alpha_Hmov r5,CD_CORDYL ; R5 <- V_beta_Lmov r4,CD_CORDYH ; R4 <- V_beta;**************************************;* catresian to polar transform;**************************************;*;* calculate space vector amplitude (norm);*;* input gi_V_alpha;* gi_V_beta;* R7 <- V_alpha_L;* R6 <- V_alpha_H;* R5 <- V_beta_L;* R4 <- V_beta;*;* output gi_V_alpha_L;* gi_V_alpha_H;* gi_V_beta_L;* gi_V_beta;* R7 = gi_Amplitude_L;* R6 = gi_Amplitude_H;* CORDZ = Anglemov CD_STATC,a ; clear keep bits - interrupt disabledmov CD_CON,#0x82 ; Circular vectoring mode - auto start MPS = 4mov CD_CORDYL,r5 ; Y = gi_V_betamov CD_CORDYH,r4 ;mov CD_CORDXH,r6 ; X = gi_V_alphamov CD_CORDXL,r7 ; CORDIC starts autmaticallymov MDU_MD0,#0x06 ; MD0 = 6mov MDU_MD1,a ; MD1 = 0mov gi_V_alpha+1,r7 ; gi_V_alpha_L = R7mov gi_V_alpha,r6 ; gi_V_alpha_H = R6mov gi_V_beta+1,r5 ; gi_V_beta_L = R5mov gi_V_beta,r4 ; gi_V_beta = R4_MD_02:jb CD_BSY,_MD_02 ; wait for CORDIC result of amplitude and angle calculationmov r7,CD_CORDXLmov r6,CD_CORDXH;* limitation of Amplitudeclr c ; if ( MAX_AMPLITUDE - gi_Amplitude ) < 0mov a,#MAX_AMPLITUDE_L ;subb a,r7 ;mov a,#MAX_AMPLITUDE_H ;subb a,r6 ;jnc _MD_002 ;mov r7,#MAX_AMPLITUDE_L ; gi_Amplitude = MAX_AMPLITUDEmov r6,#MAX_AMPLITUDE_H_MD_002: ; elsemov gi_Amplitude+1,r7 ; R7 = gi_Amplitude_L mov gi_Amplitude,r6 ; R6 = gi_Amplitude_H;**************************************;* sv modulation;**************************************;*;* space vector modulation;*;* input guc_sector;* R7 = gi_Amplitude_L;* R6 = gi_Amplitude_H;* CORDZ = Angle;*;* output;* R0 = V_TA_H;* R1 = V_TA_L;* R2 = V_TB_H;* R3 = V_TB_L;* R4 = V_TC_H;* a = V_TC_L;* R5 = T1/2_L;* B = T1/2_H;* R6 = T2_H/2;* R7 = T2_L/2;*mov MDU_MD4,CD_CORDZL ; MD4 = Z = Anglemov MDU_MD5,CD_CORDZH ; MD5 = Z = Anglemov MDU_MDUCON,#0x10; ; start Multiplikation (gi_angle * 6) -> Sektor,gammamov MDU_MD4,r7 ;4 MD4 = amp_Lmov MDU_MD5,r6 ;8 MD5 = amp_H_MD_01:clr a ;10mov CD_STATC,a ;12 clear keep bits - interrupt disabledmov CD_CORDZL,a ;14 Z = 0mov dptr,#Sinus60_tab ; MDU ready / get pointer at Sinustablemov r2,MDU_MR1 ; R2 = gamma 8bitmov guc_sector,MDU_MR2 ; R3 = guc_sector 0 (5)mov a,r2 ; A = gamma 8bitadd a,ACC ; A = gamma 9bit 256 16Bits valuesmov r0,a ; R0 = gamma 9bit 256 16Bits valuesjnc _MD_1inc dph_MD_1:;*;* Calculate T2;*movc a,@a+dptr ; A = sinus_Hmov MDU_MD1,a ; MD1 = sinus_Hmov a,r0 ; A = gammainc amovc a,@a+dptr ; A = sinus_Lmov MDU_MD0,a ; MD0 = sinus_Lmov MDU_MDUCON,#0x14; ; start Multiplikation amp * sinus(gamma);*;* Calculate T1;*mov dptr,#Sinus60_tabmov a,r2cpl aadd a,ACCmov r2,ajnc _MD_2inc dph_MD_2:movc a,@a+dptr ; A = sinus_H , MDU fertigmov MDU_MD1,a ; MD1 = sinus_Hmov r5,MDU_MR2 ; R5 = T2_Lmov r4,MDU_MR3 ; R4 = T2_Hmov a,r2 ; A = gamma 8bitinc amovc a,@a+dptr ; A = sinus_Lmov MDU_MD0,a ; MD0 = sinus_Lmov MDU_MDUCON,#0x14; ; start Multiplikation amp * sinus(60 - gamma)mov CD_CON,#0x48 ;4 Linear rotation mode - auto start MPS = 2 mov CD_CORDZH,#0x08 ;8 Z = 1mov CD_CORDYH,r4 ;12 Y = T2jnb gb_closed_loop,_MD_3 ; ignore TMIN during start-upcjne r4,#0,_MD_3 ;16 , MDU readymov a,#T_MINsubb a,r5jc _MD_3mov r5,#T_MIN_MD_3:mov r2,MDU_MR3 ; R2 = T1_Hmov r1,MDU_MR2 ; R1 = T1_Ljnb gb_closed_loop,_MD_4 ; ignore TMIN during start-upcjne r2,#0,_MD_4mov a,#T_MINsubb a,r1jc _MD_4mov r1,#T_MIN_MD_4:mov CD_CORDYL,r5 ; Y = T2mov CD_CORDXH,r2 ; X = T1mov CD_CORDXL,r1 ; CORDIC starts autmaticallyclr c ;2 Berechnung T2 /2mov a,r4 ;4 A = T2_Hrrc a ;6 A = T2_H/2mov r6,a ;8 R6 = T2_H/2mov a,r5 ;10 A = T2_Lrrc a ;12 A = T2_L/2mov r7,a ;14 R7 = T2_L/2mov a,guc_sector ;16jb ACC.0,_MD_5 ;20mov a,r1mov r5,a ; R5 = T1_L/T2_Lmov a,r2mov r4,a ; R4 = T1_L/T2_L_MD_5:mov r2,#T12PERIODE_HALF_H ;22mov r1,#T12PERIODE_HALF_H ;24mov a,#T12PERIODE_HALF_L ;26mov r0,a ;28inc guc_sector ;30 preparation for djnz instruction mov guc_sector_s,guc_sector ;34_MD_6:jb CD_BSY,_MD_6 ;CORDIC readyadd a,CD_CORDYLxch a,r1 ; R1 = TT3_L A = 1addc a,CD_CORDYHxch a,r0 ; R0 = TT3_H A = 144;*;* Calculate TT1;*clr csubb a,CD_CORDYLmov r3,a ; R3 = TT1_Lxch a,r2 ; R2 = TT1_L A = 1subb a,CD_CORDYH ; A = TT1_Hxch a,r2 ; R2 = TT1_H / A = T1_Ladd a,r5 ; A = TT1_L + T1,2_Lxch a,r4 ; R4 = TT1_L + T1,2_Laddc a,r2 ; A = TT1_H + T1,2_Hxch a,r4 ; R4 = TT1_H + T1,2_Hmov r5,CD_CORDXL ; R5 = T1/2_Lmov b,CD_CORDXH ; B = T1/2_H;**************************************;* update compare values;**************************************;*;* Calculation and setup of compare;* values of PWM Unit CCU6;*;* input guc_sector;* R0 = V_TA_H;* R1 = V_TA_L;* R2 = V_TB_H;* R3 = V_TB_L;* R4 = V_TC_H;* a = V_TC_L;* R5 = T1/2_L;* B = T1/2_H;* R6 = T2_H/2;* R7 = T2_L/2;*;* output;* setup of CCU6 registers;*;*;* clr RMAP for normal operation;*anl SYSCON0,#0xFE ; switch to standard SFRsmov CCU6_PAGE,#0x00CV_SectorA:djnz guc_sector,CV_SectorBmov CCU6_CC60RH,r2mov CCU6_CC60RL,r3 ; CC60CR = V_TBmov CCU6_CC61RL,amov CCU6_CC61RH,r4 ; CC61CR = V_TCmov CCU6_CC62RH,r0mov CCU6_CC62RL,r1 ; CC60CR = V_TAmov CCU6_PAGE,#0x00mov a,#AD_TRIGGER_CM_L ; A = AD_TRIGGER_CM_Ladd a,r7 ; A = AD_TRIGGER_CM_L + T2/2_L mov CCU6_CC63RL,amov a,#AD_TRIGGER_CM_H ; A = AD_TRIGGER_CM_Haddc a,r6 ; A = AD_TRIGGER_CM_H + T2/2_Hmov CCU6_PAGE,#0x01mov a,#AD_TRIGGER_PM_L ; A = AD_TRIGGER_PM_Ladd a,r5 ; A = AD_TRIGGER_PM_L + T1/2_L mov CCU6_T13PRL,amov a,#AD_TRIGGER_PM_H ; A = AD_TRIGGER_PM_Haddc a,b ; A = AD_TRIGGER_PM_H + T1/2_H mov CCU6_T13PRH,aljmp compare_values_endCV_SectorB:djnz guc_sector,CV_SectorCmov CCU6_CC60RL,amov CCU6_CC60RH,r4 ; CC60CR = V_TCmov CCU6_CC61RH,r2mov CCU6_CC61RL,r3 ; CC61CR = V_TBmov CCU6_CC62RH,r0mov CCU6_CC62RL,r1 ; CC60CR = V_TAmov CCU6_PAGE,#0x00mov a,#AD_TRIGGER_CM_L ; A = AD_TRIGGER_CM_Ladd a,r5 ; A = AD_TRIGGER_CM_L + T1/2_L mov CCU6_CC63RL,amov a,#AD_TRIGGER_CM_H ; A = AD_TRIGGER_CM_Haddc a,b ; A = AD_TRIGGER_CM_H + T1/2_H mov CCU6_CC63RH,amov CCU6_PAGE,#0x01mov a,#AD_TRIGGER_PM_L ; A = AD_TRIGGER_PM_Ladd a,r7 ; A = AD_TRIGGER_PM_L + T2/2_Lmov a,#AD_TRIGGER_PM_H ; A = AD_TRIGGER_PM_Haddc a,r6 ; A = AD_TRIGGER_PM_H + T2/2_H mov CCU6_T13PRH,aljmp compare_values_endCV_SectorC:djnz guc_sector,CV_SectorDmov CCU6_CC60RH,r0mov CCU6_CC60RL,r1 ; CC60CR = V_TAmov CCU6_CC61RH,r2mov CCU6_CC61RL,r3 ; CC60CR = V_TBmov CCU6_CC62RL,amov CCU6_CC62RH,r4 ; CC61CR = V_TCmov CCU6_PAGE,#0x00mov a,#AD_TRIGGER_CM_L ; A = AD_TRIGGER_CM_Ladd a,r7 ; A = AD_TRIGGER_CM_L + T2/2_L mov CCU6_CC63RL,amov a,#AD_TRIGGER_CM_H ; A = AD_TRIGGER_CM_Haddc a,r6 ; A = AD_TRIGGER_CM_H + T2/2_H mov CCU6_CC63RH,amov CCU6_PAGE,#0x01mov a,#AD_TRIGGER_PM_L ; A = AD_TRIGGER_PM_Ladd a,r5 ; A = AD_TRIGGER_PM_L + T1/2_L mov CCU6_T13PRL,amov a,#AD_TRIGGER_PM_H ; A = AD_TRIGGER_PM_Haddc a,b ; A = AD_TRIGGER_PM_H + T1/2_H mov CCU6_T13PRH,a。

相关文档
最新文档