网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C2000 >> 文章正文
  无刷直流电动机调速控制程序         ★★★ 【字体:
无刷直流电动机调速控制程序
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-17    

 

            .include "240x.h"

            .global _c_int0

;--------------------------------------以下定义变量和常数----------------------------------------------------

          .data

KP       .set 015                 ;速度调节比例系数

KI       .set 004                  ;速度调节积分系数

         .bss CAPT,1               ;换相控制字

         .bss COMP,1              ;比较值

         .bss IDC,1                ;线电流

         .bss IDC_REF,1            ;电流参考值

         .bss SPEED_REF,1         ;速度参考值

         .bss SPEED_COUNT,1      ;速度调节循环计数器

         .bss STACK,6              ;软堆栈初始地址

;--------------------------------------定义主向量-------------------------------------------------------------

         .sect "vectors"

RSVECT   B         _c_int0           ;复位

INT1      B         PHANTOM         ;INT1

INT2      B         PHANTOM         ;INT2

INT3      B         PHANTOM         ;INT3

INT4      B         CAPINT            ;捕捉中断

INT5      B         PHANTOM         ;INT5

INT6      B         ADCINT           ;ADC中断

            …             ;

;--------------------------------------以下是程序-------------------------------------------------------------

         .text

;--------------------------------------初始化程序--------------------------------------------------------------

_C_INT0

         SETC      CNF   

         CLRC      OVM                

         SETC      SXM                ;符号扩展

         SETC      INTM                ;关中断

         MAR      *,AR2                ;速度调节变量区指针

         LAR       AR2,#0300H          ;速度调节变量区初始化

         SPLK      #0,*+  

         SPLK      #0,*+

         SPLK      #0FFFFH,*+

         SPLK      #029H,*+

         SPLK      #029H,*+

         SPLK      #0,*

         LAR       AR2,#0300H          

         LAR       AR1,#STACK          ;软堆栈指针

         LDP       #0E0H

         SPLK      #68H, WDCR          ;不用看门狗

         SPLK      #0284H,SCSR1        ;10MCLKIN,20MCLKOUT

         LDP       #0E8H

         SPLK      #0FFFFH,T2PR        ;最大周期

         SPLK      #00000H,T2CNT

         SPLK      #17C0H,T2CON       ;连续增计数,128分频,T1启动

         SPLK      #500,T1PR           ;PWM设置,周期50微秒

         SPLK      #0000H,T1CNT

         SPLK      #0FFFH,ACTRA      ;PWM16全部高电平输出

         SPLK      #01F4H,DBTCONA    ;死区1.6微秒

         SPLK      #250,CMPR1         ;占空比为50%

         SPLK      #250,CMPR2

         SPLK      #250,CMPR3

         SPLK      #8200H,COMCONA   ;允许比较,T1下溢重载

         SPLK      #0840H,T1CON       ;连续增减计数,内部时钟,不分频

         SPLK      #0100H,GPTCONA    ;T1周期中断标志启动AD转换

         SPLK      #0B0FCH,CAPCONA  ;捕捉设置.使用捕捉1,2,3,双沿触发

         SPLK      #00FFH,CAPFIFOA    ;清空捕捉堆栈

         LDP       #0E1H

         SPLK      #0FF80H, MCRA     ;引脚设置为PWM和捕捉功能

         LDP       #0

         LACC     #028H

         SACL     IMR                  ;允许INT4INT6中断

         LACC     IFR                   ;清标志

         SACL     IFR

         LDP       #0E8H

         LACC      EVAIFRA             ;清标志

         SACL      EVAIFRA

         LACC      EVAIFRB

         SACL      EVAIFRB

         LACC      EVAIFRC

         SACL      EVAIFRC

         SPLK      #0,EVAIMRA

         SPLK      #0,EVAIMRB

         SPLK      #7,EVAIMRC          ;允许捕捉1,2,3中断,其它关闭

         LDP       #0E1H                ;AD设置

         SPLK      #0500H,ADCTRL2     ;允许EVA启动AD转换

         SPLK      #0900H,ADCTRL1     ;10分频

         SPLK      #0000H,MAXCONV    ;一个转换通道

         SPLK      #0000H,CHSELSEQ1   ;ADCIN00通道

         CLRC      INTM                ;开总中断

         LDP       #0                    ;变量初始化

         SPLK      #001FH,IDC_REF

         SPLK      #0040H,SPEED_REF

         SPLK      #0500,COMP

         SPLK      #0000H,SPEED_COUNT

         SPLK      #0000H,CAPT

;--------------------------------------检测转子初始位置-----------------------------------------------------

         LDP       #0E8H

         SPLK      #8000H,CAPCONA    ;关闭捕捉功能

         SPLK      #00FFH,CAPFIFOA    ;清空捕捉堆栈

         LDP       #00E1H

         SPLK      #0FC00H, MCRA     ;CAP1CAP3设为I/O

         SPLK      #0000H, PADATDIR  ;设为输入

         LACC      PADATDIR         ;IOPA3IOPA5

         AND       #038H              ;屏蔽其它位

         LDP       #0

         SACL     CAPT

         LACC     CAPT,13            ;相当于右移3

         SACH     CAPT               ;保存并初始化CAPT

         LDP       #0E1H

         SPLK      #0FF80H, MCRA     ;恢复捕捉功能

         LDP       #0E8H

         SPLK      #0B0FCH,CAPCONA  ;允许捕捉

         SPLK      #00FFH,CAPFIFOA    ;清空捕捉堆栈

;--------------------------------------以下可添加应用程序------------------------------------------------------

LOOP    NOP

         B          LOOP              ;循环

;--------------------------------------假中断处理------------------------------------------------------------------

PHANTOM  

         CLRC     INTM

         RET

;--------------------------------------A/D中断处理子程序--------------------------------------------------------

ADCINT

         MAR      *,AR1               ;保存现场

         MAR      *+   

         SST       #1, *+               ;保存ST1

         SST       #0, *                ;保存ST0

         LDP       #0

         LACC     SPEED_COUNT      ;检查是否应该速度调节

         SUB       #1250

         BCND     NO_SPEED_REG,NEQ  ;不该调节,跳转

         CALL     SPEED_REG          ;否则调用速度调节子程序

NO_SPEED_REG

         LACC     SPEED_COUNT

         ADD      #1

         SACL     SPEED_COUNT       ;计数器加1

         LDP      #0E0H

         LACC     PIVR                ;ADC中断标志

         LDP      #0E8H

         LACC     EVAIFRA            ;T1周期中断标志

         SACL     EVAIFRA

         LDP      #0E1H

         LACC     ADCTRL2

         OR       #0202H

         SACL     ADCTRL2

;--------------------------------------电流调节---------------------------------------------------------------------

         CLRC     SXM

         LACC     RESULT0,10         ;ADC转换结果

         LDP       #0

         SUB       IDC_REF,16         ;减电流参考值,计算电流偏差

         SETC      SXM

         ADD      COMP,16            ;电流比例调节,K=1

         SACH     COMP

         LACC     COMP 

         BCND     SUP_LIM,GT        ;检查COMP是否小于0

         SPLK      #0,COMP           ;小于0则令COMP=0

         B         COMP_OK

SUP_LIM

         SUB       #0500

         BCND     COMP_OK,LT       ;检查是否超过最大值500

         SPLK      #0500,COMP         ;超过则COMP=500

;--------------------------------------改变占空比-------------------------------------------------------------

COMP_OK

         CALL      SEQUENCE         ;改变占空比

         MAR       *, AR1              ;恢复现场

         LST       #0, *-                ;恢复ST0

         LST       #1, *-                ;恢复ST1

         CLRC     INTM

         RET

;--------------------------------------捕捉中断处理子程序-------------------------------------------------

CAPINT

         MAR      *,AR1                ;保存现场

         MAR      *+

         SST       #1, *+                ;保存ST1

         SST       #0, *                 ;保存ST0

         LDP       #0E0H

         LACC     PIVR                 ;清中断标志

         LDP       #0E8H

         SPLK      #0FH,EVAIFRC

;--------------------------------------速度参数计算-----------------------------------------------------------------

         MAR      *,AR2

         LACL     T2CNT               ;T2的值

         SACL     *+                   ;保存为第K次捕捉时间

         SUB       *+                   ;减去第K-1次捕捉时间

         SACL     *-                    ;保存时间增量

         ADD      *

         SACL     *-                    ;更新第K-1次捕捉时间

;--------------------------------------获取换相控制字--------------------------------------------------------

         LDP       #0E8H

         SPLK      #8000H,CAPCONA    ;关闭捕捉功能

         SPLK      #00FFH,CAPFIFOA    ;清空捕捉堆栈

         LDP       #00E1H

         SPLK      #0FC00H, MCRA     ;CAP1CAP3设为I/O

         SPLK      #0000H, PADATDIR  ;设为输入

         LACC      PADATDIR         ;IOPA3IOPA5

         AND       #038H              ;屏蔽其它位

         LDP       #0

         SACL     CAPT

         LACC     CAPT,13            ;相当于右移3

         SACH     CAPT               ;保存并初始化CAPT

;--------------------------------------换相------------------------------------------------------------------------

         CALL     SEQUENCE          ;换相

         LDP       #0E1H

         SPLK      #0FF80H, MCRA     ;恢复捕捉功能

         LDP       #0E8H

         SPLK      #0B0FCH,CAPCONA  ;允许捕捉

         SPLK      #00FFH,CAPFIFOA    ;清空捕捉堆栈

         MAR      *, AR1               ;恢复现场

         LST       #0, *-                ;恢复ST0

         LST       #1, *-                ;恢复ST1

         CLRC     INTM

         RET

;--------------------------------------换相或修改占空比子程序-----------------------------------------------

SEQUENCE

         LDP       #0

         LACC     CAPT

         SUB       #1

         SFL                           ;2

         ADD      #CAPT_DETER       ;

         BACC

CAPT_DETER

         B         FALLING3           ;H3下降沿

         B         FALLING1           ;H1下降沿

         B         RISING2             ;H2上升沿

         B         FALLING2           ;H2下降沿

         B         RISING1             ;H1上升沿

RISING3                                ;H3上升沿

         LACC    COMP                ;比较值,控制占空比

         LDP      #0E8H

         SPLK     #0DF7H,ACTRA       ;PWM2,5低有效,其它输出高电平

         SACL    CMPR3               ;修改PWM2,5的占空比

         SACL    CMPR1

         SPLK     #0,CMPR2

         B        ENDD

FALLING3

         LACC    COMP

         LDP      #0E8H

         SPLK     #07FDH,ACTRA       ;PWM1,6低有效,其它输出高电平

         SACL    CMPR1               ;修改PWM1,6的占空比

         SACL    CMPR3

         SPLK     #0,CMPR2

         B        ENDD

RISING2

         LACC    COMP

         LDP      #0E8H

         SPLK     #07DFH,ACTRA       ;PWM3,6低有效,其它输出高电平

         SACL    CMPR2               ;修改PWM3,6的占空比

         SACL    CMPR3

         SPLK     #0,CMPR1

         B         ENDD

FALLING2

         LACC    COMP

         LDP      #0E8H

         SPLK     #0D7FH,ACTRA       ;PWM4,5低有效,其它输出高电平

         SACL     CMPR3              ;修改PWM4,5的占空比

         SACL     CMPR2

         SPLK     #0,CMPR1

         B         ENDD

RISING1

         LACC     COMP

         LDP       #0E8H

         SPLK      #0F7DH,ACTRA      ;PWM1,4低有效,其它输出高电平

         SACL      CMPR1             ;修改PWM1,4的占空比

         SACL      CMPR2

         SPLK       #0,CMPR3

         B         ENDD

FALLING1

         LACC      COMP

         LDP        #0E8H

         SPLK       #0FD7H,ACTRA     ;PWM2,3低有效,其它输出高电平

         SACL      CMPR2             ;修改PWM2,3的占空比

         SACL      CMPR1

         SPLK       #0,CMPR3

ENDD

         RET

;--------------------------------------速度调节子程序----------------------------------------------------------

SPEED_REG

         MAR       *,AR2

         LAR       AR2,#0302H          ;捕捉时间增量

         LDP       #0

         SPLK      #0,SPEED_COUNT    ;计数器清0