MICROCHIP AN1078 PMSM电机FOC控制中文

合集下载

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

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

AN1299 结论本应用笔记阐述了单分流算法的优点、局限性和限制条件。

通过使用单分流电阻来检测流经直流母线的电流,单分流算法能够重构流经电机各相的电流。

为了获取蕴含在直流母线电流中的信息,使用了空间矢量调制方法。

SVM 产生一组采样时间窗口,在时间窗口中可以观察流经电机各相的电流。

在分流电阻真值表(表 1)中对这些时间窗口进行了划分和分组。

此真值表表明了分流电阻提供的信息与电子开关状态之间的关系。

但是,在某些 SVM 区域,要从直流母线电流获取期望信息是不可能的。

通过修改 SVM 开关模式可以克服这一局限性。

对这些模式进行修改,使得在每个 SVM 工作状态中从单分流电阻提取期望信息成为可能。

这些实际结果表明:单分流电阻方法提供了足够精确的信息,能够满足磁场定向控制的需求。

对提取的流经直流母线的电流进行重构,根据重构的信息,还可能获取诸如位置、转矩这样的电机信息。

参考文献本应用笔记参考了下列应用笔记,它们可从 Microchip 网站()下载:•AN908 《使用 dsPIC30F 实现交流感应电机的矢量控制》(DS00908A_CN)• AN955 “VF Control of 3-Phase Induction Motor (DS00955) Using Space Vector Modulation” • AN1017 《使用 dsPIC30F DSC 实现 PMSM 电机的正弦驱动》(DS01017A_CN)• AN1078 《PMSM 电机的无传感器磁场定向控制》(DS01078A_CN) 2009 Microchip Technology Inc. DS01299A_CN 第 21 页AN1299 注: DS01299A_CN 第 22 页 2009 Microchip Technology Inc.请注意以下有关 Microchip 器件代码保护功能的要点:• • • Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。

PFC基础知识及FOC工作原理

PFC基础知识及FOC工作原理
无传感器磁场定向控制
无传感器 FOC 法采用相电流 Ia 和 Ib 作为反馈信号。而 第三相电流 Ic 是通过进行数字化计算得到的。这三相电 流在用 Park 变换转化为转子系下两相电流之前,先用 Clarke 变换转化为定子系下的两相电流。这种转换得到 了两个计算电流分量:Id 和 Iq。磁链是电流 Id 的函数, 而转子转矩是电流 Iq 的函数。 位置估计器用于估计转子位置和速度信息。电机模型使 用电压和电流来估算位置。电机模型主要使用位置观测 器来间接获得转子位置信息。PMSM 模型是基于直流电 机模型。
2Φ 转子系统
Θ
Iq

α−β
Id
至 d-q

2Φ 定子系统
无传感器磁场定向控制(FOC)系统
Ia
a, b, c

Ib
α−β
3Φ 定子系统
本页已使用福昕阅读器进行编辑。
AN1208 福昕软件(C)2005-2010,版权所有,
仅供试用。
DS01208A_CN 第 3 页
AN1208
数字化的功率因数校正
本集成应用是在以下两种 dsPIC® DSC 器件上实现的:
• dsPIC30F
• dsPIC33F
低成本、高性能的 DSC,与模数转换器 (ADC)和脉 冲宽度调制器 (PWM)等各类电力电子外设的结合使 用,使得这样一个复杂应用的数字化设计和实现变得更 加简单方便。
数字化的 PFC 与电机控制
大多数电机控制系统通常将 PFC 作为系统的第一级。由 于逆变器中开关器件的存在,若没有 PFC 输入级,那么 所产生的电流中将会含有显著的谐波分量。此外,由于 电机负载的高度感性,输入电流将会给输入系统引入大 量无功功率,从而降低整个系统的效率。PFC 级作为电 机控制应用中的一个前端转换器,能够较好地调节输出 电压以及降低输入电流中的谐波含量。在这些应用中, 按照平均电流模式控制的标准升压转换器拓扑是实现数 字化 PFC 的首选方法。

电助力自行车的FOC控制技术

电助力自行车的FOC控制技术

电助力自行车的FOC控制技术
随着人们生活水平的提高和环保意识的增强,电助力自行车的市场需求不断扩大,越
来越多的人选择使用电动自行车来代替传统的车辆出行。

而FOC(Field-Oriented Control)控制技术,则是电助力自行车上的一种常用控制技术。

本文将介绍FOC控制技术的原理和
应用。

FOC控制技术是一种闭环控制技术,它主要通过电机控制器来控制电机的电流、速度、位置等参数。

FOC控制技术最初是应用于交流电机控制领域,之后逐渐应用于直流电机控
制领域。

通过FOC控制技术,可以实现对电机控制的高精度和高效率控制。

FOC控制技术的原理是将电机控制分为两个部分,即定子电流控制和转子电流控制。

定子电流控制主要控制电机的磁场强度和方向,保证电机的输出扭矩的稳定性和可靠性。

转子电流控制则可以控制电机的速度和位置,使电机输出的转矩符合要求。

FOC控制技术的优点是可以减少电机的噪音和能耗,提高电机的能量利用率。

另外,FOC控制技术还可以实现对电机输出扭矩的高精度控制,从而提高电机的输出效率和稳定性。

在电助力自行车上,FOC控制技术主要应用于电动机控制器中。

通过FOC控制器的控制,可以实现电动车的正、反转、制动等功能。

同时,FOC控制技术还可以控制电动车的
电源电压和输出功率,从而实现对电动车的高效控制。

总之,FOC控制技术是电助力自行车控制系统中非常重要的技术,可以实现对电机控
制的高精度和高效率控制,从而提高电助力自行车的性能和使用体验。

随着技术的不断进
步和发展,相信这种控制技术会越来越得到广泛的应用。

AN1078电机的无传感器磁场定向控制

AN1078电机的无传感器磁场定向控制

为什么使用 FOC 算法?
BLDC 电机的传统控制方法是以一个六步的控制过程来 驱动定子,而这种控制过程会使生成的转矩产生振荡。 在六步控制过程中,给一对绕组通电直到转子达到下一 位置,然后电机换相到下一步。 霍尔传感器用于确定转 子的位置,以采用电子方式给电机换相。 高级的无传感 器算法使用在定子绕组中产生的反电动势来确定转子位 置。 六步控制(也称为梯形控制)的动态响应并不适用于洗 衣机,这是因为在洗涤过程中负载始终处于动态变化 中,并随实际洗涤量和选定的洗涤模式不同而变化。 而 且,对于前开式洗衣机,当负载位于滚筒的顶部时,必 须克服重力对电机负载作功。 只有使用高级的算法如 FOC 才可处理这些动态负载变化。
PWM2H
PWM3H PMSM
PWM2L
PWM3L
故障
<
Ia 电流 限制
Ib
2010 Microchip Technology Inc.
DS01078B_CN 第 5 页
AN1078
磁场定向控制
从不同的角度理解磁场定向控制
理解 FOC (有时称为矢量控制)如何工作的一种方法 是在头脑中设想参考坐标变换过程。如果从定子的角度 来设想交流电机的运行过程,则会看到在定子上施加了 一个正弦输入电流。该时变信号产生了旋转的磁通。转 子的速度是旋转磁通矢量的函数。 从静止的角度来看, 定子电流和旋转磁通矢量看似交流量。 现在,设想在电机内部,转子随着定子电流所产生的旋 转磁通矢量以相同的速度同步旋转。如果从这个角度观 察稳态条件下的电机,那么定子电流看似常量,且旋转 磁通矢量是静止的。 最终,希望控制定子电流来获得期望的转子电流(不可 直接测量得到)。 通过参考坐标变换,可使用标准控制 环,如同控制直流量一样实现对定子电流的控制。

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电机无传感器FOC矢量控制_图文.

PMSM电机无传感器FOC矢量控制_图文.

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

程序架构是C语言嵌套汇编。

其中坐标系变换是汇编编写。

有插图说明,便于更好的理解。

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

(单片机XC2236N,Tasking 编译器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闭环控制。

/******************************************************************* ********************************************************************************* ****//*********************************************************************** ************************************************************************* ********///****************************************************************** ********** // @Function int clarke_trans(int Phase_s, int Phase_t, int *ia;////----------------------------------------------------------------------------// @Description ia = is// ib = 1/sqrt(3*( (2 * it + is////----------------------------------------------------------------------------// @Returnvalue (ib * 16 , "(ia * 16"////----------------------------------------------------------------------------// @Parameters////----------------------------------------------------------------------------// @Date09.01.2005// Condition optimization off / one//****************************************************************** ********** inline int clarke_trans(int Phase_s, int Phase_t, int *ia{int retvalue;__asm(" mov r12,MCW \n"" mov MCW,#0200h ; set saturation \n"" shl %2,#1 ; ( 2*Phase_t \n"" add %2,%1 ; + Phase_s \n"" mov r13,#37837 \n"" CoMULsu %2,r13 ;* 1/sqrt(3 \n"" CoSHL #4 ; default 2 * 4 \n"" CoSTORE %0,MAS ; ib = result \n"" shl %1,#2 \n"" mov [%3],%1 ; ia = Phase_s * 4 \n"" mov MCW,r12 \n": "=&w"(retvalue /* output registers */: "w"(Phase_s,"w"(Phase_t,"w"(ia /* input registers */ : "r13","r12"/*scratch registers */;return retvalue;}******************************************************************** ********///****************************************************************** ********** // @Function int park_trans(int e_a,int e_b,int phi,int *a_b////----------------------------------------------------------------------------// @Description park transformation////----------------------------------------------------------------------------// @ReturnvalueId_comp , Iq_comp////----------------------------------------------------------------------------// @Parameters////----------------------------------------------------------------------------// @Date 09.01.2005// Condition optimization off / oneinline int park_trans(int i_a,int i_b,int phi,int *o_q{int retvalue;__asm( "\n"" mov r13,MCW \n"" mov MCW,#0600h \n"" shr %3,#6 \n"" shl %3,#1 \n"" EXTS #SEG (_sincostab,#2 \n"" mov r11,[%3 + #SOF(_sincostab+512] \n"" mov r12,[%3 + #SOF(_sincostab] \n"" CoMUL %2,r12 \n"" CoMAC %1,r11 \n"" CoSTORE %0,MAS \n"" CoMUL %2,r11 \n"" CoMAC- %1,r12 \n"" CoSTORE [%4],MAS \n"" mov MCW,r13 \n""\n": "=&w"(retvalue /* output registers */: "w"(i_a,"w"(i_b,"w"(phi,"w"(o_q /* input registers */: "r13","r12","r11"/*scratch registers */;return retvalue;}/******************************************************************* ***************************************************************************** ********///********************************************************************** ****** // @Function int inv_park_trans(int e_a,int e_b,int phi,int *a_b////----------------------------------------------------------------------------// @Description inverse park transformation////----------------------------------------------------------------------------// @ReturnvalueI_alpha , I_beta////----------------------------------------------------------------------------// @Parameters////----------------------------------------------------------------------------// @Date09.01.2005// Condition optimization off / one//****************************************************************** ********** inline int inv_park_trans(int i_d,int i_q,int phi,int *o_b{int retvalue;__asm( "\n"" mov r13,MCW \n"" mov MCW,#0600h \n"" shr %3,#6 \n"" shl %3,#1 \n"" EXTS #SEG (_sincostab,#2 \n"" mov r12,[%3 + #SOF(_sincostab+512] \n"" mov r11,[%3 + #SOF(_sincostab] \n"" CoMUL %1,r12 \n"" CoMAC- %2,r11 \n"" CoASHR #2 \n"" CoSTORE %0,MAS \n"" CoMUL %1,r11 \n"" CoMAC %2,r12 \n"" CoASHR #2 \n"" CoSTORE [%4],MAS \n"" mov MCW,r13 \n""\n": "=&w"(retvalue /* output registers */: "w"(i_d,"w"(i_q,"w"(phi,"w"(o_b /* input registers */ : "r13","r12","r11"/*scratch registers */;return retvalue;}//****************************************************************** ********** // @Function int cart_polar_conv(int x,int y, int *angle;////----------------------------------------------------------------------------// @Description////----------------------------------------------------------------------------// @Returnvalue////----------------------------------------------------------------------------// @Parameters////----------------------------------------------------------------------------// @Date09.01.2005// Condition optimization off / one//****************************************************************** ********** unsigned int cart_polar_conv(int x,int y, int *angle{unsigned int retvalue;__asm( "\n"" mov MCW,#0200h ; enable saturation to +/-0x7fff \n"" mov r13,%1 ; r13 = x \n"" jmpr cc_nn,kpw1co ; if (x >= 0 goto kpw1co \n"" neg r13 ; else r13 = -r13 \n""kpw1co: ; r13 = |x| \n"" mov r12,%2 ; r12 = y \n"" jmpr cc_nn,kpw2co ; if (y >= 0 goto kpw2co \n"" neg r12 ; r12 = -r12 \n""kpw2co: ; r12 = |y| \n"" mov r9,#1024 \n"" cmp r13,r12 \n"" jmpr cc_c,kpw3co ; if( x < y goto kpw3co \n"" mulu r12,r9 ; MD = y * 1024 \n"" divlu r13 ; MDL = MD / x \n"" mov r9,MDL ; r9 = MDL = (y/x * 1024 \n"" shl r9,#1 ; prepare for word address \n"" EXTS #SEG (_betab,#1 \n"" mov r10,[r9+#SOF(_betab] ; r10 = sqrt( 1 + (r9^2 \n" " CoMULu r13,r10 ; CoACC = x * sqrt( 1 + (y/x^2 \n" " CoSHL #1 ; unsigned -> signed \n"" CoSTORE %0,MAS ; %0 = CoACC \n" "\n"" EXTS #SEG (_phitab,#1 \n"" mov r10,[r9+#SOF(_phitab] ; r10 = arctan( y/x \n" " cmp %1,#0 ; \n"" jmpr cc_n,kpw4co ; if ( x < 0 goto kpw4co \n" " cmp %2,#0 \n"" jmpr cc_n,kpw5co ; if ( y < 0 goto kpw5co \n" " mov [%3],r10 ; angle = arctan( y/x \n" " jmpr cc_uc, endco \n""\n""kpw5co: ; x > 0 and y < 0 \n"" neg r10 \n"" mov [%3],r10 ; angle = -arctan( y/x \n"" jmpr cc_uc, endco \n""\n""kpw4co: ; x < 0 \n"" cmp %2,#0 ; \n"" jmpr cc_n,kpw6co ; if ( y < 0 goto kpw6co \n" " mov r9,#8000h \n" " sub r9,r10 \n"" mov [%3],r9 ; angle = 180�- arctan( y/x \n" " jmpr cc_uc, endco \n" "\n""kpw6co: ; x < 0 and y < 0 \n"" add r10,#8000h \n"" mov [%3],r10 ; angle = -180�+ arctan( y/x \n" " jmpr cc_uc, endco \n" "\n""kpw3co: ; |x| < |y| \n"" mulu r13,r9 ; MD = |x| * 1024 \n"" divlu r12 ; MDL = MD / |y| \n"" mov r9,MDL ; r9 = MDL = (y/x * 1024 \n"" shl r9,#1 ; prepare for word address \n"" \n"" EXTS #SEG (_betab,#1 \n"" mov r10,[r9+#SOF(_betab] ; r10 = sqrt( 1 + (r9^2 \n"" CoMULu r12,r10 ; CoACC = x * sqrt( 1 + (y/x^2 \n"" CoSHL #1 ; unsigned -> signed \n"" CoSTORE %0,MAS ; %0 = CoACC \n"" \n"" EXTS #SEG (_phitab,#1 \n"" mov r10,[r9+#SOF(_phitab] ; r10 = arctan( y/x \n"" cmp %1,#0 \n"" jmpr cc_n,kpw7co ; if ( x < 0 goto kpw7co \n"" cmp %2,#0 \n"" jmpr cc_n,kpw8co ; if ( y < 0 goto kpw8co \n"" mov r9,#4000h \n"" sub r9,r10 \n"" mov [%3],r9 ; angle = 90�- arctan( x/y = 90�- arccot( y/x = arctan( y/x \n" " jmpr cc_uc, endco \n""\n""kpw8co: ; x > 0 and y < 0 \n"" add r10,#0C000h \n"" mov [%3],r10 ; angle = -90�+ arctan( x/y = -(90�- arccot( y/x = -arctan( y/x \n"" jmpr cc_uc, endco \n""\n""kpw7co: \n"" cmp %2,#0 ; x < 0 \n"" jmpr cc_n,kpw9co ; if ( y < 0 goto kpw9co \n"" add r10,#4000h \n"" mov [%3],r10 ; angle = 90�+ arctan( x/y = 180�- (90�- arccot( y/x = 180�- arctan( y/x \n" " jmpr cc_uc, endco \n"" \n""kpw9co: ; x < 0 and y < 0 \n"" mov r9,#0C000h \n"" sub r9,r10 ; angle = -90�- arctan( x/y = -180�+ (90�- arccot( y/x = -180�+ arctan( y/x \n"" mov [%3],r9 \n""\n""endco: \n": "=&w"(retvalue /* output registers */: "w"(x,"w"(y,"w"(angle /* input registers */: "r13","r12","r11","r10","r9"/*scratch registers */ ;return retvalue;}//****************************************************************** ********** // @Function: a low pass filter 2012-9-13 17:58:43// C calling format://// int inline int pt1_controller32( int *pt1_parameter, int X////----------------------------------------------------------------------------// @Description//// PT1-Controller// derived from transfer function//// Y_(k = Y_(k-1 + Z1_(k * X_(k - Z2_(k * Y_(k-1//----------------------------------------------------------------------------// Computing time 42 CPU-cycle////----------------------------------------------------------------------------// @Returnvalue//// int "@3" Output of pt1_controller//----------------------------------------------------------------------------// @Parameters//----------------------------------------------------------------------------// Condition optimization off / one//****************************************************************** **********inline int pt1_controller32( PT1_array *pt1_parameter, int X//inline int pt1_controller32( int *pt1_parameter, int X{int retvalue;__asm( "\n"" mov r10,MCW ;Save MCW register \n"" mov MCW,#0400h ;Set shift left \n"" mov %0,[%1+] \n"" CoLOAD %0,[%1] ;Load Y(k-1 in accumulator \n"" mov r13,%1 ;Save parameters addres in %1 \n"" add r13,#2 \n"" mov r12,[r13+] ;Load Z1 in R5 \n"" mov r11,[r13+] ;Load Z2 in R6 \n"" CoMAC r12,%2 ;CoACC = Y(k-1 + Z1 * X \n"" CoMAC- r11,[%1] ;CoACC = Y(k-1 + Z1 * X - Z2 * Y(k-1 \n" "\n""\n"" mov r11,[r13+] ;Load ynmax (limit value max \n"" mov r12,[r13+] ;Load ynmin (limit value min \n"" mov %0,ZEROS ;Load zero in %0 \n"" CoMIN %0,r11 ;Limit max yn \n"" CoMAX %0,r12 ;Limit min yn \n"" CoSTORE %0,MAS ;Store Y(k-high in R4 \n"" CoSTORE r13,MAL ;Store Y(k-low in R3 \n"" mov [%1],%0 ;Store in Y buffer(High \n"" mov [-%1],r13 ;Store in Y buffer(Low \n""\n"" mov MCW,r10 ;Restore MCW register \n""\n": "=&w"(retvalue /* output registers */: "w"(pt1_parameter,"w"(X /* input registers */: "r13","r12","r11","r10"/*scratch registers */;return retvalue;}//****************************************************************** **********// @Function void ADC0_vStartSeq0ReqChNum(ubyte ubExtTrg, ubyte// ubEnIntr, ubyte ubRFill, ubyte ubChannelNum////----------------------------------------------------------------------------// @Description This function starts the conversion of the requested// channel.// NOTE -// Before passing ubEnIntr argument as 1,make sure that Seq 0// source interrupt is enabled.// External Trigger -> 0,Indicates software trigger// (Conversion starts once this function is executed////---------------------------------------------------------------------------- // @Returnvalue None////---------------------------------------------------------------------------- // @Parameters ubExtTrg:// External Trigger : defines external trigger.// @Parameters ubEnIntr:// Enable Source Interrupt : defines source interrupt// @Parameters ubRFill:// Refill : defines the refill// @Parameters ubChannelNum:// Channel number : Name of the Request Channel Number (0 - // 15- see macros defined in the header file////----------------------------------------------------------------------------// @Date 14.05.2010////****************************************************************** **********void ADC0_vStartSeq0ReqChNum(ubyte ubExtTrg, ubyte ubEnIntr, ubyte ubRFill, ubyte ubChannelNum {uword uwVal = 0;if (ubExtTrg == 1{uwVal = 0x0080;}if (ubEnIntr == 1{uwVal = uwVal + 0x0040;}if (ubRFill == 1{uwVal = uwVal + 0x0020;}uwVal = uwVal + (ubChannelNum & 0x001f;ADC0_QINR0 = uwVal; // requested channel} // End of function ADC0_vStartSeq0ReqChNum//****************************************************************** ********** // @Function void ADC0_viSRN0(void////----------------------------------------------------------------------------// @Description This is the interrupt service routine for the Service// Request Node 0 of the ADC0 module.////----------------------------------------------------------------------------// @Returnvalue None////----------------------------------------------------------------------------// @Parameters None////----------------------------------------------------------------------------// @Date14.05.2010////****************************************************************** ********** // USER CODE BEGIN (ADC0_viSRN0,0// USER CODE END_interrupt(ADC0_SRN0INT void ADC0_viSRN0(void{if((ADC0_EVINFR & 0x0100 == 0x0100 //Result0 event interrupt{ADC0_EVINCR = 0x0100; // Clear Result0 event interrupt// USER CODE BEGIN (ADC0_viSRN0,20if( CCU60_TCTR0 & 0x0040 // check count direction of T12.ADC0_CHCTR8 |= 0x1000; // 1: T12 counts down -> assign ADC-CH8 to RESREG1 elseADC0_CHCTR8 &= 0xefff; // 0: T12 counts up -> assign ADC-CH8 to RESREG0if( !(svm0.Sector & 0x0001CCU60_T13PR = svm0.T2Store/2 + svm0.ADCDELAY; // set T13 Period valueelseCCU60_T13PR = svm0.T1Store/2 + svm0.ADCDELAY; // set T13 Period valueCCU60_vEnableShadowTransfer(CCU60_TIMER_13; // enable shadow transfer// USER CODE END}} // End of function ADC0_viSRN0//****************************************************************** ********** // @Function void ADC0_viSRN1(void////----------------------------------------------------------------------------// @Description This is the interrupt service routine for the Service// Request Node 1 of the ADC0 module.////----------------------------------------------------------------------------// @Returnvalue None////----------------------------------------------------------------------------// @Parameters None////----------------------------------------------------------------------------// @Date 14.05.2010////****************************************************************** **********// USER CODE BEGIN (ADC0_viSRN1,0// USER CODE END_interrupt(ADC0_SRN1INT void ADC0_viSRN1(void{if((ADC0_EVINFR & 0x0200 == 0x0200 //Result1 event interrupt{ADC0_EVINCR = 0x0200; // Clear Result1 event interrupt// USER CODE BEGIN (ADC0_viSRN1,21ADC0_CHCTR8 &= 0xefff; // assign ADC-CH8 to RESREG0 if( !(svm0.Sector & 0x0001CCU60_T13PR = svm0.T1Store/2 + svm0.ADCDELAY; // set T13 Period value elseCCU60_T13PR = svm0.T2Store/2 + svm0.ADCDELAY; // set T13 Period value CCU60_vEnableShadowTransfer(CCU60_TIMER_13; // enable shadow transfer// calculate Ialpha and Ibeta from single shunt measurementswitch( svm0.SectorStore{case 0:svm0.IphaseA = (ADC0_RESR0 & 0x0fff - svm0.ADCOFFSET;svm0.IphaseB = (ADC0_RESR1 & 0x0fff - (ADC0_RESR0 & 0x0fff;break;case 1:svm0.IphaseA = (ADC0_RESR1 & 0x0fff - (ADC0_RESR0 & 0x0fff;svm0.IphaseB = (ADC0_RESR0 & 0x0fff - svm0.ADCOFFSET;break;case 2:svm0.IphaseA = -(ADC0_RESR1 & 0x0fff + svm0.ADCOFFSET;svm0.IphaseB = (ADC0_RESR0 & 0x0fff - svm0.ADCOFFSET;break;case 3:svm0.IphaseA = -(ADC0_RESR1 & 0x0fff + svm0.ADCOFFSET;svm0.IphaseB = (ADC0_RESR1 & 0x0fff - (ADC0_RESR0 & 0x0fff; break;case 4:svm0.IphaseA = (ADC0_RESR1 & 0x0fff - (ADC0_RESR0 & 0x0fff; svm0.IphaseB = -(ADC0_RESR1 & 0x0fff + svm0.ADCOFFSET; break;case 5:svm0.IphaseA = (ADC0_RESR0 & 0x0fff - svm0.ADCOFFSET;svm0.IphaseB = -(ADC0_RESR1 & 0x0fff + svm0.ADCOFFSET; break;default:break;}// Calculate currents Id and Iqfoc0.Id = park_trans( foc0.Ialpha, foc0.Ibeta, foc0.AngleStore, &foc0.Iq ; // USER CODE END}} // End of function ADC0_viSRN1//****************************************************************** ********** // @Function void CCU60_viNodeI0(void////----------------------------------------------------------------------------// @Description This is the interrupt service routine for the CCU60 node// I0. If the content of the corresponding compare timer// (configurable equals the content of the capture/compare// register or if a capture event occurs at the associated// port pin, the interrupt request flag is set and an// interrupt is triggered (only if enabled.// Please note that you have to add application specific code// to this function.////----------------------------------------------------------------------------// @Returnvalue None////----------------------------------------------------------------------------// @Parameters None////----------------------------------------------------------------------------// @Date14.05.2010////****************************************************************** ********** // USER CODE BEGIN (NodeI0,1// USER CODE END_interrupt(CCU60_NodeI0_INT void CCU60_viNodeI0(void{// USER CODE BEGIN (NodeI0,2// USER CODE ENDif(CCU60_IS & 0x0040 // if CCU60_IS_T12OM{// Timer T12 one match detection// USER CODE BEGIN (NodeI0,20CCU60_vEnableShadowTransfer(CCU60_TIMER_12;// USER CODE ENDCCU60_ISR |= 0x0040; // clear flag CCU60_IS_T12OM}if(CCU60_IS & 0x0080 // if CCU60_IS_T12PM{// Timer T12 period match detection// USER CODE BEGIN (NodeI0,19CCU60_TCTR2 = t13_trigger[svm0.Sector];svm0.SectorStore = svm0.Sector;svm0.T1Store = svm0.T1;svm0.T2Store = svm0.T2;foc0.AngleStore = foc0.Angle;// Flux Estimator//****************************************************************** **********************DSP_MAC(foc0.Ialpha, foc0.STATOR_R, foc0.Valpha;DSP_MAC(foc0.Ibeta, foc0.STATOR_R, foc0.Vbeta;foc0.FluxAmplitude = cart_polar_conv(foc0.Fluxalpha, foc0.Fluxbeta,&foc0.FluxAngle;//****************************************************************** **********************if( status0.control == 0{foc0.Vd = 0;if( foc0.AngleSpeed > 0foc0.Vq = vf_control(foc0.Vf_offset, foc0.Vf_slew, foc0.AngleSpeed;elsefoc0.Vq = vf_control(-foc0.Vf_offset, foc0.Vf_slew, foc0.AngleSpeed;}else{control0.ReferenceIq = pi_controller32(&control0.Speed, control0.ReferenceSpeed, control0.ActualSpeed;foc0.Vd = pi_controller32(&control0.Id, control0.ReferenceId, foc0.Id;foc0.Vq = pi_controller32(&control0.Iq, control0.ReferenceIq, foc0.Iq;}foc0.Valpha = inv_park_trans( foc0.Vd, foc0.Vq, foc0.Angle, &foc0.Vbeta ;// Modulatorsvm( &svm0 ;// USER CODE ENDCCU60_ISR |= 0x0080; // clear flag CCU60_IS_T12PM }} // End of function CCU60_viNodeI0//****************************************************************** ********** // @Prototypes Of Local Functions//****************************************************************** ********** unsigned int V_TA, V_TB;void svm( tSVM *svm{unsigned char gamma;unsigned int tmp, T1_2;tmp = (((unsigned intsvm->Angle >> 4 * 6;gamma = (unsigned char (tmp>>4;svm->Sector = tmp >> 12;svm->T1 = DSP_minMUL( svm->Amplitude, Sinus60_tab[(unsigned char~gamma], svm->SVMTMIN ; svm->T2 = DSP_minMUL( svm->Amplitude,Sinus60_tab[(unsigned char gamma], svm->SVMTMIN ;T1_2 = (svm->T1 + svm->T2/2;V_TA = svm->T12PERIODE/2 + T1_2;V_TB = svm->T12PERIODE/2 - T1_2;switch( svm->Sector{case 0:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TB;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TB + svm->T1; // V_TC;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TA;break;case 1:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TB + svm->T2; // V_TC;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TB;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TA;break;case 2:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TA;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TB;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TB + svm->T1; // V_TC;break;case 3:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TA;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TB + svm->T2; // V_TC;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TB;break;case 4:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TB + svm->T1; // V_TC;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TA;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TB;break;case 5:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TB;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TA;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TB + svm->T2; // V_TC;break;default:break;}}。

西子孚信永磁同步pm変频门机中文调试文件

西子孚信永磁同步pm変频门机中文调试文件

文件编号 M07-17SM 部分编号 页 码: 第 3 / 26 页
日 期: 2007-06-12 版 本: 第 A 版 修 改: 第 0 次
DC24V 0V
SGS2
SGS1
光眼
SP3
图 3-2 接线图
b) 与 LCB2 控制系统配合使用时,接线方式见图 3-3。
SGS1
SGS2
SP3
光眼
编码器转一周 的脉冲数 运行模式
参数设置值 (以 FORWARD 电机
为例)
1
00(开到位和关到位 都为常开)
01(开到位常闭,关 到位常开)
02(开到位常开,关 到位常闭)
03(开到位和关到位 都为常闭)
512
0(定位、自学习时此 参数都要设置为 0)
备注
手动时电机正反转的 设置(0 或 1)
用于输入信号常开常 闭的选择(出厂时磁开 关信号是固定的,但初 调时最好再用万用表
4.3.1 自学习之前,进入菜单 3311 中修改 run comd source 为 0,进入菜单 3312,修改“man speed” (一般为 2.0Hz 保证手动时门速不至于过快)。
4.3.2 把门拉到中间位置,进入菜单 311,按 Enter,手动运行一下电机,再按 CLEAR 键,确认 电机是否向开门方向运行,如果方向相反,则进入菜单 3311,改变
永磁同步门机
调试文件
文件编号 M07-17SM 部分编号 页 码: 第 6 / 26 页
日 期: 2007-06-12 版 本: 第 A 版 修 改: 第 0 次
编码器
图 3-8 永磁变频器配 LCB2 时的后门接线图
4 调试说明
永磁同步门机

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

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

表 1:
IH ON OFF OFF OFF ON ON
分流电阻真值表
2H OFF ON OFF ON OFF ON 3H OFF OFF ON ON ON OFF 1L OFF ON ON ON OFF OFF 2L ON OFF ON OFF ON OFF 3L ON ON OFF OFF OFF ON IBUS +IA +IB +IC –IA –IB –IC
电流测量流经电机线圈的电流中所蕴含的信息使得电机控制算法能够把电机控制在产生最大转矩的区间或者控制电机使之呈现某种性能甚至能够近似或估计诸如位置这样的内部电机变量
AN1299
PMSM 无传感器 FOC 的单分流三相电流重构算法
作者:
Daniel Torres and Jorge Zambada Microchip Technology Inc. 这些应用是无传感器方法的完美目标应用,在无传感器 方法中,可以使用流经电机线圈的电流提供的信息,对 电机位置进行估计。实现该传感技术可采用以下两种途 径:双分流电阻和单分流电阻。 为了估计电机位置,双分流电阻技术利用的是流过两个 电机线圈的电流所蕴含的信息。单分流电阻技术仅利用 流经直流母线的电流所蕴含的信息,进而重构三相电 流,然后估计电机位置。 本应用笔记将讨论单分流方法。至于双分流电阻方法的 信息,请参阅应用笔记 AN1078, 《PMSM 电机的无传 感器磁场定向控制》 。
图 15: 相似占空比的采样时间窗口
PWM1L PWM2L PWM3L T0 T1 T3 T2 = 0 T1 T0
2009 Microchip Technology Inc.
DS01299A_CN 第 7 页
AN1299
低调制指数期间占空比的相似性
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2010 Microchip Technology Inc.
DS01078B_CN 第 1 页
AN1078
使用数字信号控制器进行电机控制
dsPIC DSC 电机控制系列是针对最常用的电机而设计 的,包括: • • • • 交流感应电机 (AC Induction Motor, ACIM) 直流有刷电机 (Brushed DC Motor, BDC) 直流无刷电机 (Brushless DC Motor, BLDC) 永磁同步电机 (Permanent Magnet Synchronous Motor, PMSM)
2.
3.
4.
5.
6.
7.
本应用笔记的以下部分将详细描述这些步骤。
DS01078B_CN 第 6 页
2010 Microchip Technology Inc.
AN1078
图 6:
ω REF
矢量控制框图
IQREF Vq Vα SVM Vd PI 3 相电桥

PI

PI
d,q

IDREF
α ,β Park 逆变换
数据监视和控制界面
数据 监 视 和 控 制 界 面 (Data Monitor and Control Interface, DMCI) 能够与 MPLAB® IDE 快速动态集成, 可通过这一个界面对 IDE 项目中的范围值、开 / 关状态 或离散值进行变量控制以对应用的运行加以限制。如果 需要,应用反馈可以图形方式来表示。提供电机控制和 音频处理方面的应用示例。 DMCI 可提供: • 9 个滑块和 9 个布尔量 (开 / 关)控制 (见图 1) • 35 路输入控制 (见图 2) • 4 个图 (见图 3) 该界面提供了可识别项目的程序符号 (变量)导航,这 些符号可被动态地分配给滑块控制、直接输入控制或布 尔量控制的任意组合。随后这些控制可交互地用来更改 MPLAB IDE 中的程序变量值。 这些图也可动态地进行 配置以查看程序所生成的数据。 注: DMCI 工具的特性可能会有所变化。 关于 DMCI 工具的说明,以其发布日期为准。
DS01078B_CN 第 4 页
2010 Microchip Technology Inc.
AN1078
系统概述
如图 4 所示,在电机轴上没有安装位置传感器。而使用 低自感系数的分流电阻(逆变器的一部分)来测量电机 上的电流。 三相逆变器被用作功率级来驱动电机绕组。 电源逆变器内置的电流检测和故障生成电路可防止整个 系统受到过电流的损坏。 图 5 说明了如何实现 3 相拓扑以及电流检测和故障生成 电路。 逆变器左边的第一个晶体管用于功率因数校正 (Power Factor Correction, PFC),本应用笔记中不作具体介 绍。 本应用笔记中所涉及的硬件是 dsPICDEM™ MCLV 开发 , 板 (DM330021) (用于电压最高为 50 VDC 的场合) 以及 dsPICDEM™ MCHV 开发板 (DM330023) (用 , 两者均可从 Microchip 于电压最高为 400 VDC 的场合) 网站 ()订购。
图 4:
系统概述
PWM1H PWM1L PWM2H PWM2L 3相 PMSM 3 相逆变器
dSPIC33FJ32MC204
PWM3H PWM3L
AN0 AN1 RB8
Ia Ib 过流
VR1 AN8 RA8 速度给定 启动 / 停止 S2 用户接口
图 5:
3 相拓扑
可选功率因素校正
PWM1H 115/230 VAC PWM1L
AN1078
PMSM 的无传感器磁场定向控制
作者:
Jorge Zambada 和 Debraj Deb Microchip Technology Inc. 本应用笔记着重于适用于电器的基于PMSM的无传感器 FOC 控制, 这是因为该控制技术在电器的电机控制方面 有着无可比拟的成本优势。 无传感器 FOC 技术也克服 了在某些应用上的限制,即由于电机被淹或其线束放置 位置的限制等问题,而无法部署位置或速度传感器。由 于PMSM使用了由转子上的永磁体所产生的恒定转子磁 场,因此它尤其适用于电器产品。此外,其定子磁场是 由正弦分布的绕组产生的。与感应电机相比, PMSM 在 其尺寸上具有无可比拟的优势。 由于使用了无刷技术, 这种电机的电噪音也比直流电机小。
已发表了一些基于 dsPIC DSC 电机控制系列的应用笔 记 (见 “参考文献”)。 这些应用笔记可从 Microchip 网站 ()获取。 本应用笔记说明了 dsPIC DSC 如何利用特别适合电机 控制的外设 (电机控制 PWM 和高速 ADC)来执行 PMSM 的无传感器磁场定向控制。 dsPIC DSC 的 DSP 引擎支持必要且快速的数学运算。
应用重点
本应用笔记的目的在于说明使用 Microchip 数字信号控 制器, 以软件的方式实现 PMSM 的无传感器磁场定向控 制。 该控制软件具有如下特征: • • • • 实现 PMSM 的矢量控制。 位置和速度估算算法可避免使用位置传感器。 测试得到速度范围从 500 到 17000 RPM。 当控制环周期为 50 µs 时,软件需要约 21 个 MIPS 的 CPU 开销 (占 CPU 总体开销的 2/3) 。 • 应用程序需要 450 字节的数据存储空间。包含用 户界面在内一共需要大约 6K 字节的程序存储空 间。根据对存储空间的需求,应用程序应可在 dsPIC33FJ12MC202 上运行,目前为止,此器件 是体积最小且最具成本效益的 dsPIC33F 器件。 • 启用可选的诊断模式以在示波器上对内部程序变量 进行实时观察。该功能可便于对控制环进行调整。
PWM2H
PWM3H PMSM
PWM2L
PWM3L
故障
<
Ia 电流 限制
Ib
2010 Microchip Technology Inc.
DS01078B_CN 第 5 页
Aபைடு நூலகம்1078
磁场定向控制
从不同的角度理解磁场定向控制
理解 FOC (有时称为矢量控制)如何工作的一种方法 是在头脑中设想参考坐标变换过程。如果从定子的角度 来设想交流电机的运行过程,则会看到在定子上施加了 一个正弦输入电流。该时变信号产生了旋转的磁通。转 子的速度是旋转磁通矢量的函数。 从静止的角度来看, 定子电流和旋转磁通矢量看似交流量。 现在,设想在电机内部,转子随着定子电流所产生的旋 转磁通矢量以相同的速度同步旋转。如果从这个角度观 察稳态条件下的电机,那么定子电流看似常量,且旋转 磁通矢量是静止的。 最终,希望控制定子电流来获得期望的转子电流(不可 直接测量得到)。 通过参考坐标变换,可使用标准控制 环,如同控制直流量一样实现对定子电流的控制。
矢量控制综述
间接矢量控制的过程总结如下: 1. 测量 3 相定子电流。 这些测量可得到 ia 和 ib 的 值。 可通过以下公式计算出 Ic : ia + ib + ic = 0。 将 3 相电流变换至 2 轴系统。该变换将得到变量 它们是由测得的 ia 和 ib 以及计算出的 ic 值 iα 和 iβ, 变换而来。从定子角度来看,iα 和 iβ 是相互正交 的时变电流值。 按照控制环上一次迭代计算出的变换角,来旋转 2 轴系统使之与转子磁通对齐。 iα 和 iβ 变量经过 该变换可得到 Id 和 Iq。Id 和 Iq 为变换到旋转坐标 系下的正交电流。在稳态条件下, Id 和 Iq是常量。 误差信号由 Id、 Iq 的实际值和各自的参考值进行 比较而获得。 • Id 的参考值控制转子磁通 • Iq 的参考值控制电机的转矩输出 • 误差信号是到 PI 控制器的输入 • 控制器的输出为 Vd 和 Vq,即要施加到电机 上的电压矢量 估算出新的变换角,其中 vα、 vβ、 iα 和 iβ 是输 入参数。 新的角度可告知 FOC 算法下一个电压 矢量在何处。 通过使用新的角度,可将 PI 控制器的 Vd 和 Vq 输出值逆变到静止参考坐标系。该计算将产生下 一个正交电压值 vα 和 vβ。 vα 和 vβ 值经过逆变换得到 3 相值 va、vb 和 vc。 该 3 相电压值可用来计算新的 PWM 占空比值, 以生成所期望的电压矢量。图 6 显示了变换、PI 迭代、逆变换以及产生 PWM 的整个过程。
Vβ Clarke 逆变换
θ
Iq Id
d,q
iα iβ
α,β
ia ib
α,β Park 变换 位置 速度 (ω )
a,b,c Clarke 变换
位置和速度 估算器
Vα Vβ
电机
2010 Microchip Technology Inc.
DS01078B_CN 第 7 页
AN1078
坐标变换
通过一系列坐标变换,可间接确定不随时间变化的转矩 和磁通值, 并可采用经典的 PI 控制环对其进行控制。控 制过程起始于 3 相电机电流的测量。实际应用中,三个 电流值的瞬时和为零。这样仅测量其中两个电流即可得 到第三个电流值。 因此,可通过去除第三个电流传感器 来降低硬件成本。 使用 dsPIC DSC 也可通过单分流的方式实现 3 相电流 的测量。 更多信息,请与 Microchip 联系。 欲 获 取 单 分 流 算 法的 详 细 说 明,请 参 见 AN1299, 《PMSM 无传感器 FOC 的单分流三相电流重构算法》 (DS01299A_CN)。
为什么使用 FOC 算法?
BLDC 电机的传统控制方法是以一个六步的控制过程来 驱动定子,而这种控制过程会使生成的转矩产生振荡。 在六步控制过程中,给一对绕组通电直到转子达到下一 位置,然后电机换相到下一步。 霍尔传感器用于确定转 子的位置,以采用电子方式给电机换相。 高级的无传感 器算法使用在定子绕组中产生的反电动势来确定转子位 置。 六步控制(也称为梯形控制)的动态响应并不适用于洗 衣机,这是因为在洗涤过程中负载始终处于动态变化 中,并随实际洗涤量和选定的洗涤模式不同而变化。 而 且,对于前开式洗衣机,当负载位于滚筒的顶部时,必 须克服重力对电机负载作功。 只有使用高级的算法如 FOC 才可处理这些动态负载变化。
相关文档
最新文档