⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zl_adc_isr.c

📁 2812设计源码 ADC 模块编程必须首先设置时钟
💻 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 + -