![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 直流电动机双极性可逆双闭环PWM控制程序 | |||||
作者:61IC 文章来源:本站原创 点击数: 更新时间:2007-1-17 ![]() |
|||||
|
.include "240x.h" .global _c_int0 ;--------------------------------------以下定义变量和常数---------------------------------------------------- .data .bss N_KP,1 ;速度调节比例系数 .bss N_KI,1 ;速度调节积分系数 .bss N_KC,1 ;速度调节积分饱和修正系数 .bss I_KP,1 ;电流调节比例系数 .bss I_KI,1 ;电流调节积分系数 .bss I_KC,1 ;电流调节积分饱和修正系数 .bss I_REF,1 ;电流参考值 .bss N_REF,1 ;速度参考值 .bss DIRECTION,1 ;速度方向标志 .bss STACK,6 ;软堆栈初始地址 .bss I_EK,1 ;电流偏差 .bss I_RK,1 ;电流第K次积分调节累计 .bss I_U,1 ;电流调节输出 .bss I_ELPI,1 ;电流极限偏差 .bss TMP,1 ;临时变量 .bss ENCODEROLD,1 ;前一次编码器读数 .bss ENCINCR,1 ;编码增量 .bss SPEEDTMP,1 ;编码脉冲累计 .bss SPEEDSTEP,1 ;速度调节计数器 .bss KSPEED,1 ;编码脉冲-速度转换系数 .bss N,1 ;速度反馈量 .bss N_EK,1 ;速度偏差 .bss N_RK,1 ;速度第K次积分调节累计 .bss N_U,1 ;速度调节输出 .bss N_ELPI,1 ;速度极限偏差 .bss I_MIN,1 ;电流最小值 .bss I_MAX,1 ;电流最大值 ;--------------------------------------定义主向量------------------------------------------------------------- .sect "vectors" RSVECT B _c_int0 ;复位 INT1 B PHANTOM ;INT1 INT2 B PHANTOM ;INT2 INT3 B PHANTOM ;INT3 INT4 B PHANTOM ;INT4 INT5 B PHANTOM ;INT5 INT6 B ADCINT ;ADC中断 RESERVED B PHANTOM ;地址000EH,测试,优先级10 SW_INT8 B PHANTOM ;地址0010H,自定义软中断 SW_INT9 B PHANTOM ;地址0012H,自定义软中断 SW_INT10 B PHANTOM ;地址0014H,自定义软中断 SW_INT11 B PHANTOM ;地址0016H,自定义软中断 SW_INT12 B PHANTOM ;地址0018H,自定义软中断 SW_INT13 B PHANTOM ;地址001AH,自定义软中断 SW_INT14 B PHANTOM ;地址001CH,自定义软中断 SW_INT15 B PHANTOM ;地址001EH,自定义软中断 SW_INT16 B PHANTOM ;地址0020H,自定义软中断 TRAP B PHANTOM ;地址0022H,TRAP矢量 NMI B PHANTOM ;地址0024H,NMI,优先级3 EMU_TRAP B PHANTOM ;地址0026H,仿真Trap,优先级2 SW_INT20 B PHANTOM ;地址0028H,自定义软中断 SW_INT21 B PHANTOM ;地址002AH,自定义软中断 SW_INT22 B PHANTOM ;地址002CH,自定义软中断 SW_INT23 B PHANTOM ;地址002EH,自定义软中断 SW_INT24 B PHANTOM ;地址0030H,自定义软中断 SW_INT25 B PHANTOM ;地址0032H,自定义软中断 SW_INT26 B PHANTOM ;地址0034H,自定义软中断 SW_INT27 B PHANTOM ;地址0036H,自定义软中断 SW_INT28 B PHANTOM ;地址0038H,自定义软中断 SW_INT29 B PHANTOM ;地址003AH,自定义软中断 SW_INT30 B PHANTOM ;地址003CH,自定义软中断 SW_INT31 B PHANTOM ;地址003EH,自定义软中断 ;--------------------------------------以下是主程序------------------------------------------------------ .text ;--------------------------------------初始化程序-------------------------------------------------------------- _c_int0 SETC CNF CLRC OVM SETC SXM ;符号扩展 SETC INTM ;关中断 LAR AR1,#STACK ;软堆栈指针 LDP #0E0H SPLK #68H, WDCR ;不用看门狗 SPLK #0284H,SCSR1 ;10MCLKIN,20MCLKOUT LDP #0E8H SPLK #0FFFFH,T2PR ;最大周期 SPLK #0000H,T2CNT SPLK #9870H,T2CON ;定向增减,允许编码接口 SPLK #500,T1PR ;PWM设置,周期50微秒 SPLK #0000H,T1CNT SPLK #0096H,ACTRA ;PWM1,4高有效,2,3低有效 SPLK # SPLK #250,CMPR1 ;占空比为50% SPLK #250,CMPR2 SPLK #8200H,COMCONA ;允许比较,T1下溢重载 SPLK #0840H,T1CON ;连续增减计数,内部时钟,不分频 SPLK #0100H,GPTCONA ;T1周期中断标志启动AD转换 LDP #0E1H SPLK #03D8H, MCRA ;引脚设置为PWM1-4,QEP1-2 LDP #0 LACC #020H SACL IMR ;允许INT6中断 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 #0,EVAIMRC LDP #0E0H ;AD设置 SPLK #0500H,ADCTRL2 ;允许EVA启动AD转换 SPLK #0900H,ADCTRL1 ;10分频 SPLK #0000H,MAXCONV ;一个转换通道 SPLK #0000H,CHSELSEQ1 ;ADCIN00通道 CLRC INTM ;开总中断 LDP #0 ;变量初始化 SPLK #0,I_REF SPLK #0,N_REF SPLK #I_KP,I_KP ;给电流比例系数赋值,Q12格式 SPLK #I_KI,I_KI ;给电流积分系数赋值,Q12格式 SPLK #I_KC,I_KC ;给电流积分饱和修正系数赋值,Q12格式 SPLK #N_KP,N_KP ;给速度比例系数赋值,Q12格式 SPLK #N_KI,N_KI ;给速度积分系数赋值,Q12格式 SPLK #N_KC,N_KC ;给速度积分饱和系数赋值,Q12格式 SPLK #1, DIRECTION ;正转 SPLK #0, I_RK SPLK #0, I_ELPI SPLK #0, ENCODEROLD SPLK #0, SPEEDTMP SPLK #100, SPEEDSTEP ; 100个PWM周期 SPLK #1000H, KSPEED ;编码脉冲-速度转换系数,Q22格式 SPLK #0, N_RK SPLK #I_MIN,I_MIN ;给电流最小值赋值 SPLK # I_MAX,I_MAX ;给电流最大值赋值 ;--------------------------------------以下可添加应用程序--------------------------------------------------- LOOP LDP #0 NOP NOP B LOOP ;循环 ;--------------------------------------假中断处理---------------------------------------------------------------- PHANTOM CLRC INTM RET ;--------------------------------------A/D中断处理子程序---------------------------------------------------- ADCINT MAR *,AR1 ;保存现场 MAR *+ SST #1, *+ ;保存ST1 SST #0, * ;保存ST0 LDP #0E0H LACC PIVR ;清ADC中断标志 LDP #0E8H LACC EVAIFRA ;清T1周期中断标志 SACL EVAIFRA LDP #0E1H LACC ADCTRL2 OR #0202H SACL ADCTRL2 ;--------------------------------------电流PI调节----------------------------------------------------------------- LACC RESULT0,10 ;读ADC转换结果 LDP #0 SUB I_REF,16 ;减电流参考值,计算电流偏差 NEG SACL I_EK ;保存偏差 LACC I_RK,12 ;左移12位 LT I_EK MPY I_KP ;Q12格式 APAC SACH I_U,4 ;相当于右移12位 BIT I_U,0 ;检测调节器输出的正负 BCND UP,NTC ;如果正,跳转 LACC #0 ;否则是负 B LIMITERS UP BIT DIRECTION,15 ;检测转向 BCND CW,TC ;正转,跳转 LACC #500 ;否则反转.检测是否超过上限 SUB I_U BCND TOP,LT ;超过上限进入饱和区则跳转 LACC #250 ;否则检测下限 SUB I_U BCND LOW,GT ;超过下限跳转 LACC I_U ;否则正常调整 B LIMITERS TOP LACC #500 ;ACC =上限值 B LIMITERS LOW LACC #250 B LIMITERS CW LACC #250 ;检测是否超过上限 SUB I_U BCND CWTOP,LT ;超过上限跳转 LACC I_U ;否则正常调整 B LIMITERS CWTOP LACC #250 ;ACC=上限值 LIMITERS LDP #0E8H SACL CMPR2 ;输出,更新占空比 SACL CMPR1 ;更新占空比 LDP #0 SUB I_U SACL I_ELPI ;求极限偏差 LT I_ELPI MPY I_KC ;Q12格式 PAC LT I_EK MPY I_KI ;Q12格式 APAC ADD I_RK,12 SACH I_RK,4 ;更新 ;-----------------------读编码器脉冲数,计算转角增量和转速----------------------------------------- LDP #0E8H LACC T2CNT ;读编码脉冲 LDP #0 SACL TMP SUB ENCODEROLD ;减去前一个周期测的脉冲数 SACL ENCINCR ;得到编码增量 ADD SPEEDTMP SACL SPEEDTMP ;编码脉冲累计 LACC TMP SACL ENCODEROLD ;更新ENCODEROLD LACC SPEEDSTEP ;检测是否该速度调节 SUB #1 SACL SPEEDSTEP BCND GO,GT ;没到,退出 LT SPEEDTMP ;否则计算转速 MPY KSPEED ;Q22格式 PAC SACH N,6 ;相当于右移10位,Q12格式 LT N MPY #3000 PAC SACH N,4 ;速度反馈值,Q0格式 LACC #0 SACL SPEEDTMP ;SPEEDTMP清零 SPLK #100, SPEEDSTEP ; SPEEDSTEP重新赋初值 ;--------------------------------------速度PI调节----------------------------------------------------------- LACC N_REF ;速度给定值,由外部输入 SUB N ;减反馈值 SACL N_EK ;保存偏差 LACC N_RK,12 ;左移12位 LT N_EK MPY N_KP ;比例系数,Q12格式 APAC SACH N_U,4 ;相当于右移12位 LACC N_U ;检测调节器输出是否超限 SUB I_MIN ;与下限比较 BCND POS1,GT ;如果大于则跳转 LACC I_MIN ;否则超过下限 B LIM ;ACC =下限值 POS1 LACC N_U SUB I_MAX ;与上限比较 BCND POS2,GT ;超过上限则跳转 LACC N_U ;否则正常调整 B LIM POS2 LACC I_MAX ; ACC =上限值 | |||||