![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 无刷直流电动机调速控制程序 | |||||
作者: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 # SPLK #500,T1PR ;PWM设置,周期50微秒 SPLK #0000H,T1CNT SPLK #0FFFH,ACTRA ;PWM1~6全部高电平输出 SPLK # 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 ;允许INT4和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 #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 ;CAP1~CAP3设为I/O口 SPLK #0000H, PADATDIR ;设为输入 LACC PADATDIR ;读IOPA3~IOPA5 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 ;CAP1~CAP3设为I/O口 SPLK #0000H, PADATDIR ;设为输入 LACC PADATDIR ;读IOPA3~IOPA5 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 # 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 | |||||