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

📄 sciint.c

📁 在采样的基础上实现数码管显示和利用TI公司的FFT算法进行运算
💻 C
字号:
#include "spwm.h"
#include "sci.h"
#include "2407.h"
#include "System.h"
unsigned int SCI_Rev_Data[MaxDataLength];  //包括命令字和信息,及校验和
int RevState=0;
int RevCount=0;
int RevDataLength=0;  //信息祯长度
int ReFreshPrameter=0;                   
interrupt void sci_int(void)             //串口接受中断程序,INT5
{
   
 //*IFR=0x0010;
  // asm(" CLRC INTM");
  // *IFR=0x0010;
   switch(*PIVR)
   {
     case 6: SCI_Rev();
             break;
     default:
             break;
   }
  // *IFR=0xFF;
   asm(" CLRC INTM");
   
}

void  SCI_Rev()
{  
   int Revnum;
   Revnum=*SCIRXBUF; 
   switch(RevState)
   {
     case 0:
              if(Revnum==0x03)     //起始位
                    RevState=1;   //判断命令字状态
              break;
     case 1:
              if(Revnum==0x01)      //判断命令字
              {
                  SCI_Rev_Data[0]=Revnum;
                  RevState=2;   //判断命令字状态,处于接受参数设置信息状态
                  RevDataLength=SetPraLength  ;    //设置信息祯长度
              }
              break;
     case 2:
              SCI_Rev_Data[RevCount+1]=Revnum;
              RevCount++ ; 
              if(RevCount==1+RevDataLength)  
              {
                RevState=3;               //信息祯接受完毕
                RevCount=0;
              }  
              break;       
    case  3:
              if(Revnum==0x05)
              {
                  if(BCC_Check(SCI_Rev_Data,RevDataLength+2)==0) //校验正确
                  {
                     sci_dataProssing();
                     *SCITXBUF=0x80;       //回复上位机 
                   } 
                   else                    //校验错误
                     *SCITXBUF=0x8f;  
                  RevState=0;   //接受完毕信息处理
              }
              break;
    default:
              break;              
   }     
   
   return;
}

int   BCC_Check(int *RevArray,int Length)     //和校验
{
    int i,sum=0;
    for(i=0;i<Length-1;i++)
        sum|=RevArray[i];                     //求校验和
        
    if(sum==RevArray[Length-1]) 
        return  0;
    else
        return  -1;

}

void  sci_dataProssing(void)   //接受信息处理
{
   int i;
   
   spwm_moudle.ControlMode=SCI_Rev_Data[1]  ;   //控制模式
   
   OpenAmple[0]=(SCI_Rev_Data[2]<<8)+SCI_Rev_Data[3];  //3次
   OpenAngle[0]=(SCI_Rev_Data[4]<<8)+SCI_Rev_Data[5];
   
   OpenAmple[1]=(SCI_Rev_Data[6]<<8)+SCI_Rev_Data[7];  //5次
   OpenAngle[1]=(SCI_Rev_Data[8]<<8)+SCI_Rev_Data[9];
   
   OpenAmple[2]=(SCI_Rev_Data[10]<<8)+SCI_Rev_Data[11];
   OpenAngle[2]=(SCI_Rev_Data[12]<<8)+SCI_Rev_Data[13];
   
   spwm_moudle.Kp=(SCI_Rev_Data[14]<<8)+SCI_Rev_Data[15];
   spwm_moudle.Ki=(SCI_Rev_Data[16]<<8)+SCI_Rev_Data[17];
   spwm_moudle.Kd=(SCI_Rev_Data[18]<<8)+SCI_Rev_Data[19];
   spwm_moudle.VoutToMaudleK=(SCI_Rev_Data[20]<<8)+SCI_Rev_Data[21];
   
   
   if(spwm_moudle.ControlMode==0)  //开环模式
   {
     for(i=0;i<3;i++)
     {
       spwm_moudle.Ample[i]=OpenAmple[i];
       spwm_moudle.Angle[i]=OpenAngle[i];
     } 
     ReCacuPWM=1;                 //再次计算PWM脉宽信号;
   }   
   
   ReFreshPrameter=1;
   return ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -