📄 zl_adc_isr.c
字号:
#include "DSP28_Device.h"
#include "zl_var.h"
interrupt void adc_isr(void)
//电流,位置双闭环PI调节AD中断处理函数
{
ADCInterruptCount++; //中断计数器;
GpioDataRegs.GPBDAT.bit.GPIOB1=GpioDataRegs.GPBDAT.bit.GPIOB1^1; //产生方波
GpioDataRegs.GPBDAT.bit.GPIOB3=GpioDataRegs.GPBDAT.bit.GPIOB3^1; //产生方波
//电流PI调节
I_EK = ((AdcRegs.ADCRESULT0>>4)-2048)*9990/2047 - I_REF;
I_U = I_KP*I_EK + I_RK;
if(I_U&0x1000){
if(DIRECTION){
if(I_U>=250)EvaRegs.CMPR1 = 250;
else EvaRegs.CMPR1 = I_U;}
else {
if(I_U>=500)EvaRegs.CMPR1 = 500;
else if(I_U<=250) EvaRegs.CMPR1 = 250;
else EvaRegs.CMPR1 = I_U; } }
EvaRegs.CMPR2 = EvaRegs.CMPR1;
I_ELPI = EvaRegs.CMPR1-I_U; //U(k)-U
I_RK = I_KC*I_ELPI + I_EK*I_KI + I_RK; //R(k)=R(k-1)+ Ki*Ek + Kc*(Uk-U)
//读编码器脉冲数,计算转角增量和转子绝对位置
ENCINCR = EvaRegs.T2CNT;
SPEEDTMP += ENCINCR; //转子绝对位置
if((SPEEDSTEP)==0){
N = SPEEDTMP*KSPEED;
SPEEDTMP = 0;
SPEEDSTEP = 100;
//转速PI调节
N_EK = N - N_REF;
N_U = N_RK + N_EK*N_KP;
if(N_U<=I_MIN) I_REF = I_MIN;
else if(N_U>=I_MAX) I_REF = I_MAX;
else I_REF = N_U;
N_ELPI = I_REF-N_U;
N_RK = N_ELPI*N_KC + N_EK*N_KI + N_RK;}
// 重新初始化下一次ADC转换
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 复位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // 清 INT SEQ1位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清中断应答信号,准备接收下一次中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -