西莫电机圈

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 2337|回复: 4

[求助] 永磁同步电机FOC控制求助

[复制链接]

该用户从未签到

发表于 2010-8-2 10:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
计算1.jpg 分配.jpg 计算2.jpg 在永磁同步电机FOC控制中,计算得到的电压Valfa和Vbeta经过极坐标变换得到|V|和sita,然后在第一扇区(0-60°)里面计算得到VT1和VT2(见计算1),再得到VTA,VTB,VTC(计算2),分配给定时器(决定中占空比)寄存器的比较值。请问下在其他象限中,这个VT1和VT2还需要计算吗?看分配图3中就是根据象限A~F直接分配即可?迷惑中。。。。由于是汇编语言,比较难看。我把汇编程序发上来吧,大家分析下:
CV_SectorA:
djnz guc_sector,CV_SectorB
mov  CCU6_CC60RH,r2
mov  CCU6_CC60RL,r3                ; CC60CR = V_TB
mov  CCU6_CC61RL,a
mov  CCU6_CC61RH,r4                ; CC61CR = V_TC
mov  CCU6_CC62RH,r0
mov  CCU6_CC62RL,r1                ; CC60CR = V_TA
mov  CCU6_PAGE,#0x00
mov  a,#AD_TRIGGER_CM_L             ; A  = AD_TRIGGER_CM_L
add  a,r7                           ; A  = AD_TRIGGER_CM_L + T2/2_L
mov  CCU6_CC63RL,a
mov  a,#AD_TRIGGER_CM_H             ; A  = AD_TRIGGER_CM_H
addc a,r6                           ; A  = AD_TRIGGER_CM_H + T2/2_H
mov  CCU6_CC63RH,a
mov  CCU6_PAGE,#0x01
mov  a,#AD_TRIGGER_PM_L             ; A  = AD_TRIGGER_PM_L
add  a,r5                           ; A  = AD_TRIGGER_PM_L + T1/2_L
mov  CCU6_T13PRL,a
mov  a,#AD_TRIGGER_PM_H             ; A  = AD_TRIGGER_PM_H
addc a,b                            ; A  = AD_TRIGGER_PM_H + T1/2_H
mov  CCU6_T13PRH,a
ljmp compare_values_end

CV_SectorB:
djnz guc_sector,CV_SectorC
mov  CCU6_CC60RL,a
mov  CCU6_CC60RH,r4                ; CC60CR = V_TC
mov  CCU6_CC61RH,r2
mov  CCU6_CC61RL,r3                ; CC61CR = V_TB
mov  CCU6_CC62RH,r0
mov  CCU6_CC62RL,r1                ; CC60CR = V_TA
mov  CCU6_PAGE,#0x00
mov  a,#AD_TRIGGER_CM_L             ; A  = AD_TRIGGER_CM_L
add  a,r5                           ; A  = AD_TRIGGER_CM_L + T1/2_L
mov  CCU6_CC63RL,a
mov  a,#AD_TRIGGER_CM_H             ; A  = AD_TRIGGER_CM_H
addc a,b                            ; A  = AD_TRIGGER_CM_H + T1/2_H
mov  CCU6_CC63RH,a
mov  CCU6_PAGE,#0x01
mov  a,#AD_TRIGGER_PM_L             ; A  = AD_TRIGGER_PM_L
add  a,r7                           ; A  = AD_TRIGGER_PM_L + T2/2_L
mov  CCU6_T13PRL,a
mov  a,#AD_TRIGGER_PM_H             ; A  = AD_TRIGGER_PM_H
addc a,r6                           ; A  = AD_TRIGGER_PM_H + T2/2_H
mov  CCU6_T13PRH,a
ljmp compare_values_end

CV_SectorC:
djnz guc_sector,CV_SectorD
mov  CCU6_CC60RH,r0
mov  CCU6_CC60RL,r1                ; CC60CR = V_TA
mov  CCU6_CC61RH,r2
mov  CCU6_CC61RL,r3                ; CC60CR = V_TB
mov  CCU6_CC62RL,a
mov  CCU6_CC62RH,r4                ; CC61CR = V_TC
mov  CCU6_PAGE,#0x00
mov  a,#AD_TRIGGER_CM_L             ; A  = AD_TRIGGER_CM_L
add  a,r7                           ; A  = AD_TRIGGER_CM_L + T2/2_L
mov  CCU6_CC63RL,a
mov  a,#AD_TRIGGER_CM_H             ; A  = AD_TRIGGER_CM_H
addc a,r6                           ; A  = AD_TRIGGER_CM_H + T2/2_H
mov  CCU6_CC63RH,a
mov  CCU6_PAGE,#0x01
mov  a,#AD_TRIGGER_PM_L             ; A  = AD_TRIGGER_PM_L
add  a,r5                           ; A  = AD_TRIGGER_PM_L + T1/2_L
mov  CCU6_T13PRL,a
mov  a,#AD_TRIGGER_PM_H             ; A  = AD_TRIGGER_PM_H
addc a,b                            ; A  = AD_TRIGGER_PM_H + T1/2_H
mov  CCU6_T13PRH,a
ljmp compare_values_end

CV_SectorD:
djnz guc_sector,CV_SectorE
mov  CCU6_CC60RH,r0
mov  CCU6_CC60RL,r1                ; CC60CR = V_TA
mov  CCU6_CC61RL,a
mov  CCU6_CC61RH,r4                ; CC61CR = V_TC
mov  CCU6_CC62RH,r2
mov  CCU6_CC62RL,r3                ; CC60CR = V_TB
mov  CCU6_PAGE,#0x00
mov  a,#AD_TRIGGER_CM_L             ; A  = AD_TRIGGER_CM_L
add  a,r5                           ; A  = AD_TRIGGER_CM_L + T1/2_L
mov  CCU6_CC63RL,a
mov  a,#AD_TRIGGER_CM_H             ; A  = AD_TRIGGER_CM_H
addc a,b                            ; A  = AD_TRIGGER_CM_H + T1/2_H
mov  CCU6_CC63RH,a
mov  CCU6_PAGE,#0x01
mov  a,#AD_TRIGGER_PM_L             ; A  = AD_TRIGGER_PM_L
add  a,r7                           ; A  = AD_TRIGGER_PM_L + T2/2_L
mov  CCU6_T13PRL,a
mov  a,#AD_TRIGGER_PM_H             ; A  = AD_TRIGGER_PM_H
addc a,r6                           ; A  = AD_TRIGGER_PM_H + T2/2_H
mov  CCU6_T13PRH,a
ljmp compare_values_end

CV_SectorE:
djnz guc_sector,CV_SectorF
mov  CCU6_CC60RL,a
mov  CCU6_CC60RH,r4                ; CC61CR = V_TC
mov  CCU6_CC61RH,r0
mov  CCU6_CC61RL,r1                ; CC60CR = V_TA
mov  CCU6_CC62RH,r2
mov  CCU6_CC62RL,r3                ; CC60CR = V_TB
mov  CCU6_PAGE,#0x00
mov  a,#AD_TRIGGER_CM_L             ; A  = AD_TRIGGER_CM_L
add  a,r7                           ; A  = AD_TRIGGER_CM_L + T2/2_L
mov  CCU6_CC63RL,a
mov  a,#AD_TRIGGER_CM_H             ; A  = AD_TRIGGER_CM_H
addc a,r6                           ; A  = AD_TRIGGER_CM_H + T2/2_H
mov  CCU6_CC63RH,a
mov  CCU6_PAGE,#0x01
mov  a,#AD_TRIGGER_PM_L             ; A  = AD_TRIGGER_PM_L
add  a,r5                           ; A  = AD_TRIGGER_PM_L + T1/2_L
mov  CCU6_T13PRL,a
mov  a,#AD_TRIGGER_PM_H             ; A  = AD_TRIGGER_PM_H
addc a,b                            ; A  = AD_TRIGGER_PM_H + T1/2_H
mov  CCU6_T13PRH,a
ljmp compare_values_end

CV_SectorF:
mov CCU6_CC60RH,r2
mov CCU6_CC60RL,r3                 ; CC61CR = V_TB
mov CCU6_CC61RH,r0
mov CCU6_CC61RL,r1                 ; CC60CR = V_TA
mov CCU6_CC62RL,a
mov CCU6_CC62RH,r4                 ; CC60CR = V_TC
mov  CCU6_PAGE,#0x00
mov  a,#AD_TRIGGER_CM_L             ; A  = AD_TRIGGER_CM_L
add  a,r5                           ; A  = AD_TRIGGER_CM_L + T1/2_L
mov  CCU6_CC63RL,a
mov  a,#AD_TRIGGER_CM_H             ; A  = AD_TRIGGER_CM_H
addc a,b                            ; A  = AD_TRIGGER_CM_H + T1/2_H
mov  CCU6_CC63RH,a
mov  CCU6_PAGE,#0x01
mov  a,#AD_TRIGGER_PM_L             ; A  = AD_TRIGGER_PM_L
add  a,r7                           ; A  = AD_TRIGGER_PM_L + T2/2_L
mov  CCU6_T13PRL,a
mov  a,#AD_TRIGGER_PM_H             ; A  = AD_TRIGGER_PM_H
addc a,r6                           ; A  = AD_TRIGGER_PM_H + T2/2_H
mov  CCU6_T13PRH,a

compare_values_end:
另外,扇区判断怎么在程序里面实现,难道按照simulink仿真里面的方法?请指点。
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过

该用户从未签到

发表于 2010-8-2 16:42 | 显示全部楼层
算一次就好了,其他扇区里计算公式也是一样的,所以可以直接用,顶多符合不同.
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2010-8-2 20:08 | 显示全部楼层
感谢archdevil 回答。另外扇区判断在程序中是怎么实现的?是不是也要和simulink模型那样跟据电压符号判断扇区?如果FOC是从第一扇区开始执行的,是不是在接下来就不需要判断扇区了,直接在上个扇区基础上加1就行了?另外上面的汇编语言中:CV_SectorA:~CV_SectorF: 是什么东西?我对汇编不了解,看程序都很费劲。请大侠们指点小弟了。
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

发表于 2010-8-2 20:22 | 显示全部楼层
随便着个2407或者2812的dsp的书,书后面都有附带的svpwm的例程的。一般扇区是每次计算判断的,因为你不知道什么时候该加1。
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2010-8-4 15:48 | 显示全部楼层
电机所处扇区是不是可以通过转子位置角得到呢?看下面一段程序:
mov  MDU_MD4,CD_CORDZL              ; MD4 = Z = Angle
mov  MDU_MD5,CD_CORDZH              ; MD5 = Z = Angle
mov  MDU_MDUCON,#0x10;               ; start Multiplikation (gi_angle * 6) -> Sector,gamma

mov  MDU_MD4,r7                     ;4 MD4 = amp_L
mov  MDU_MD5,r6                     ;8 MD5 = amp_H
_MD_01:
clr  a                              ;10
mov  CD_STATC,a                     ;12 clear keep bits  - interrupt disabled
mov  CD_CORDZL,a                    ;14 Z = 0
mov  dptr,#Sinus60_tab              ; MDU ready / get pointer at Sinustable

mov  r2,MDU_MR1                     ; R2 = gamma 8bit
mov  guc_sector,MDU_MR2                 ; R3 = guc_sector  0 ... 5
通过(gi_angle * 6) -> Sector,gamma,在其他的地方根本没看到有扇区判断程序。。。。好迷惑
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|西莫电机圈 ( 浙ICP备10025899号-3 浙公网安备:33028202000436号

GMT+8, 2024-5-27 05:42 , Processed in 0.096378 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表