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

📄 ygm00.c

📁 基于神经网络自动控制的电机调速DSP程序。能自动学习PID参数。
💻 C
字号:
/*--------------------------------------------------------*/
/*  WQ21ST SOFTWARE	STUDIO.			                  	  */
/*--------------------------------------------------------*/
/*  EVM Test Code Shell 				                  */
/*--------------------------------------------------------*/ 

#include "sci2407.h" 
#include "register1.h"  

#include <stdlib.h>



#include "math.h"
 
unsigned int error_code;     /* ms byte = main test #, ls byte = error code */
unsigned int halt_on_error;
unsigned int print_on_error;
unsigned int led_error_code;
unsigned int print_header; 

/*varies of uart*/
unsigned int getchar1; 
unsigned int configdata;
unsigned int count=0;
unsigned int pcdata[42];  
unsigned int stopflag=0;

float kp=0,ki=0,kd=0,outspeed=0;
float error[3]={0,0,0};
float error2=0;
float runspeed=0 ;
float forrunspeed=0;
int pidi,pidf;/*整数部分,小数部分*/  
float midspeed [10]={0,0,0,0,0,0,0,0,0,0};

/*varies of nni*/
float hidein[4]={0,0,0,0},hideout[4]={0,0,0,0},forhideout[4]={0,0,0,0};  /*隐层输入,输出,以及前一时刻隐层输出*/
float identy_out=0;                          /*辨识器输出*/
float drnn_12[4][4],fordrnn_12[4][4]={0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
      drnn_22[4],fordrnn_22[4]={0,0,0,0},
      drnn_23[4],fordrnn_23[4]={0,0,0,0};            /*三层权值*/
float midr[4]={0,0,0,0};                            /*隐层输出对隐层权值的微分*/
float midw[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  /*隐层输出对输入层权值的微分*/
float dividef=0;                             /*活化函数导数*/
float aceleration;                         /*惯性系数*/

/*varies of nnc*/
float x1,x2,x3;         /*middle variy of input*/
float studyspeed[3]={0,0,0};
float mul;              /*误差和返回电压的乘积*/
float mide1=0,mide2=0,mide3=0;  /*x1,x3的算式*/
float backspeed;  /*返回速度的电压值*/  

float addw;             /*权值和*/  
float yout[2]={0,0};
float yback[2]={0,0};
float divide_yu=0;       /*辨识器输出对输入电压的微分*/


#define   PS2	 0x0800
#define   PS1	 0x0400
#define   PS0 0x0200

#define  FREQIN4	(    0	    )
#define   FREQIN2	(		    ( PS0 ) )
#define   FREQIN1_33	(	  ( PS1 )	    )
#define   FREQIN1	(	  ( PS1 ) | ( PS0 ) )
#define   FREQIN_8	( ( PS2)		    )
#define   FREQIN_66	( ( PS2) |	    ( PS0)  )
#define   FREQIN_57	( ( PS2) | ( PS1)	    )
#define   FREQIN_50	( ( PS2) | ( PS1) | ( PS0)  )

#define SCSR1		0x7018
#define SCSR1_PTR      ((unsigned int*)SCSR1)




double ipart ;
double fpart ;
double ipart1 ;
double fpart1 ;
double ipart2 ;
double fpart2 ;
double ipart3 ;
double fpart3 ;
 
float midv ;
float midv1  ; 
float midv2  ;  
float midv3  ; 
float midv4  ; 
int   me1 ;   

/*设置振晶频率*/
void set_pll( void )
{
  unsigned int scsr1_val;
  unsigned int set_freq;
  scsr1_val = *SCSR1_PTR;
  scsr1_val &= (~(PS2 | PS1 | PS0 ));
  set_freq = FREQIN2;
  scsr1_val |= set_freq;	     /* For rev 1.1 devices 30 mhz */
  *SCSR1_PTR = scsr1_val;
  wait_ms(200);
}
  
#define MS_TIME_LOOP   0x500

unsigned int wait_ms( volatile unsigned int delay_val )
{
    unsigned int i;
/*    unsigned int ms_ctr;  */
    int ms_ctr;
   for ( i = 0; i < delay_val; i++ )
    {
	ms_ctr = MS_TIME_LOOP;

	while ( ms_ctr )
	{
	    ms_ctr--;
	} 
    }

    return( delay_val );
}
/*************************/
void bad_trap(void);
void bad_trap(void)
{
  return;               /* a place to hang if illegal trap*/
}

/**********************/
void set_wait(void);

/*设置io空间的状态寄存器*/
void set_wait(void)
{

  configdata =	IOWSB1+DSWSB1+PSWSB1; 	 /* 2 waits for off chip I/O */
  OUTMAC( _WSGR, configdata);
}


/*设置系统时钟*/
void set_system(void)
{
  unsigned int SCSR1_Data;

  SCSR1_Data = *(volatile unsigned int*)SCSR1;

  SCSR1_Data |= (ADC_CLKEN | SCI_CLKEN | SPI_CLKEN | CAN_CLKEN | EVB_CLKEN | EVA_CLKEN);

  *(volatile unsigned int*)SCSR1 = SCSR1_Data;

}
   

/*试验板设置,系统振晶设置*/
void test_init(void)
{ 
  error_code = 0;               /* show no error */
  halt_on_error = 1;            /* stop if error occurred */
  print_on_error = 0;           /* do not print error info to uart */
  led_error_code = 0;           /* don't put on leds */
  print_header = 0;             /* do not print header info to uart */

  set_wait();                   /* set up wait states for I/O */
  set_system();
  set_pll();
}
 
/****************************/
#define  TESTING_OUTPUT  0
#define  TEST_UART	 0


typedef volatile struct sci SCI_STRUCT;

unsigned int uart_send_char;
unsigned int uart_rec_char;

SCI_STRUCT *sciptr;             /* pointer to sci defined structure */

unsigned char uart1_test_msg[20]; 

/*串口初始化*/
void init_uart1(void)
{
   volatile unsigned int OCRAReg;

   sciptr = (SCI_STRUCT *)SCI;     /* overlay structure over the hardware */
 /* 0x7050 for C2407 */
 /* 1 stop, no parity, 8 data, async */
 /* 0x17 */

   /* Reset the uart */
   sciptr->ctl1 = 0;
   wait_ms( 1 );
   sciptr->ctl1 = SW_RESET;   
   /* reset low, clock internal,  */
   /* xmit enable, rec enable */
   /* 0x13 */                                 
   sciptr->ccr = (unsigned int) (  SCI_CHAR2 | SCI_CHAR1 | SCI_CHAR0);		            
   /* enable TX & RX ints */                                 
   sciptr->ctl2 = (unsigned int) 0x0000;   /* no interrupts */
   /* load the baud rate */
   sciptr->baud_hi = (unsigned int) (BAUD_9600 / 0x100);  
   sciptr->baud_lo = (unsigned int) (BAUD_9600 % 0x100);   
   /*定义io口引脚为串口用功能*/
  OCRAReg = *(volatile unsigned int *)OCRA;
  OCRAReg = (TXD_FUNCTION | RXD_FUNCTION);
  *(volatile unsigned int *)OCRA = OCRAReg;  
  /*优先级设置,程序无中断*/
   sciptr->pri = PRI_SOFT;
   /*串行通信控制寄存器*/       
   sciptr->ctl1 = (unsigned int) (SW_RESET | TX_ENA | RX_ENA); 
}


/*判断接受缓存是否有值*/
unsigned int chk_uart1_rec_full(void)
{
  unsigned int ctr, rec_full_status;

  rec_full_status = 0;
  ctr = 10000;

  while ((!rec_full_status) && (ctr--))
  {
    rec_full_status = sciptr->rxst;
    rec_full_status &= RXRDY;
  }
  if (!ctr)
  {
    rec_full_status = 0;
  }
  return(rec_full_status);
}
 
 
/*检测缓存是否为空*/
unsigned int chk_uart1_xmit_empty(void)
{
  unsigned int ctr, xmit_empty_status;

  xmit_empty_status = 0;
  /**************************************************/
  /*ctr = 10000;*/
   xmit_empty_status = 0;
    xmit_empty_status = sciptr->ctl2;  /* read xmit status */
    xmit_empty_status &=  TX_EMPTY;  
  return(xmit_empty_status);
}
 
/*读取字符后,转换实值*/ 
float get_value(int j)
     {    
     int i;
     int l;
     int n=1; 
     float value=0;
     
         for(l=0;l<4-pcdata[j];l++)
         {
          n=n*10; 
         }
         value=pcdata[j+2]*1000+pcdata[j+3]*100+pcdata[j+4]*10+pcdata[j+5];
         value=value/n;
             
     return(value);
     
     }
     
/*read the value of pid from group pcdata[]*/
void valuepid()
     {
      kp=get_value(0);
      ki=get_value(6);
      kd=get_value(12);
      outspeed=get_value(18);
      studyspeed[0]=get_value(24); 
      studyspeed[1]=get_value(30);
      studyspeed[2]=get_value(36);
            
     }  
     
/*读取字符*/
unsigned int uart1_get_char(void)
{
  unsigned int ctr, rec_full_status;
  unsigned int in_char;

  rec_full_status = chk_uart1_rec_full();
  if (rec_full_status)
  {     
    in_char = sciptr->rxbuf;            /* get data from rec buffer */
    in_char &= 0x00ff;
    if(in_char==67) 
    {   count=0 ; 
       return((unsigned int)0x8000); }
    if(count>=42){count=0;}
    pcdata[count]=in_char-48;
    if(in_char==65) 
         {
         count=-1;
         kp=0;
         ki=0;
         kd=0;
         runspeed=0; 
         stopflag=0;   
          }   
    if(in_char==66)
          {
           count=-1;
           stopflag=1;
          }
    if(count==23) valuepid(); 
    count=count+1;
    return (in_char);                   /* return data */
  }
  return((unsigned int)0x8000);
}

/*宋字符程序*/
unsigned int uart1_put_char(unsigned int out_char)
{
  unsigned int send_char_status;
  
  send_char_status = chk_uart1_xmit_empty();
  if (send_char_status)
  {
    sciptr->txbuf =  (0x00ff & out_char);  /* send data */
    return ((unsigned int) 0);             /* return no error */
  }
  return( (unsigned int) 0xffff);   /* return error */
                                       /* write out character here */
}

/***********************1****************/
unsigned  int me ;
/*unsigned  int me1;   */  

/*送字符*/
unsigned int uart1test(void)
{
  unsigned int uart_status;  
  unsigned int uart1_err;
     uart1_err = 0;                    /* show no error */
      /* send data */
     uart1_put_char(me); 
      wait_ms( 1 );
  return(uart1_err);
}
 
/****/ 
void uart(void)
{
	 uart1test();	 /* execute the test */  
}
/**********************************************************/

#define DAC0	  0	    /* 1st digital to analog converter	*/
#define DAC1	  1	    /* 2nd digital to analog converter	*/
#define DAC2	  2	    /* 3rd digital to analog converter	*/
#define DAC3	  3	    /* 4th digital to analog converter	*/
#define DAC_XFER  4	    /* transfer data */
#define DAC41      4 
#define DAC4      0ch
#define DAC8      0008h
/*
  Macro Expansion Declarations
*/
#define _DAC_BASE  0h

/*
  Write Only
*/
#define _DAC0     _DAC_BASE+0		    /* 1st digital to analog converter	*/
#define _DAC1     _DAC_BASE+1		    /* 2nd digital to analog converter	*/
#define _DAC2     _DAC_BASE+2		    /* 3rd digital to analog converter	*/
#define _DAC3     _DAC_BASE+3		    /* 4th digital to analog converter	*/
#define _DAC_XFER _DAC_BASE+4         /* transfer data */
#define _DAC4     0ch
#define _DAC8     0008h
/*
  Macro definitions
*/

#define ISRA          0x7094
#define ISRB          0x7096

#define PADATDIR      0x7098

#define PBDATDIR      0x709A

#define PCDATDIR      0x709C

/******************************************************************************/

int avera[10]={0,0,0,0,0,0,0,0,0,0};

volatile  unsigned int  * m ;

int        YI;
float q; 

unsigned int dac_vals[4];

   
 /******************************************************************************/  
   /* define varies inorder to get the average output speed , every six time */  

int average(int y) 
 {
 int average1;
 float tt=0;
 int i;
 int l=0;
 
 avera[0]=avera[1];
 avera[1]=avera[2]; 
 avera[2]=avera[3];
 avera[3]=avera[4];  //05.31
 avera[4]=avera[5];
 avera[5]=avera[6];
 avera[6]=avera[7];
 avera[7]=avera[8];
 avera[8]=avera[9];
 
 avera[9]=y;
 
if(avera[0]==0)
 {
 for(i=0;i<10;i++)
  {
   if(avera[i]>0) l=l+1;
  }
     average1=(float)(avera[0]+avera[1]+avera[2]+avera[3]+avera[4]+avera[5]+avera[6]+avera[7]+avera[8]+avera[9])/l; 
 }

 else  
 average1=(float)(avera[0]+avera[1]+avera[2]+avera[3]+avera[4]+avera[5]+avera[6]+avera[7]+avera[8]+avera[9])/10;

 
 
  
 avera[9]=average1; 

 
 return average1;
 }  
 
 
/*屏蔽中断子程序*/ 
void inline disable()
{
  asm(" setc INTM");
       
}   
  

/* 开总中断子程序*/
void inline enable()
{ 
	asm(" clrc INTM ") ;
	
} 
/*系统初始化子程序*/
void initial()
{
	asm(" setc SXM");    /* 符号位扩展有效 */
	asm(" clrc OVM");    /*累加器中结果正常溢出*/
	asm("  clrc CNF");   /*B0 被配置为数据存储空间*/ 
/*	* SCSR1=0x81FE  ;  */  /*CLKIN=6 M,CLKOUT=4 * CLKIN=24 M*/     
 *(volatile unsigned int*)SCSR1 = 0x81FE;
	* WDCR =0X0E8   ;    /* 不使能看门狗,因为SCSR2中的WDOVERRIDE*/
	                     /*即WD保护位复位后的缺省值为1,故可以用*/
                         /*软件禁止看门狗*/
    *IMR=0x0001  ;       /*容许INT1中断*/
	*IFR=0x0FFFF ;        /*清除全部中断标志,"写1清0"*/
}

 /* AD初始化程序 */
 void ADINIT()
 {     
     int i;
	 *T4CNT=0X0000;         /* T4计数器清0部件*/
     *T4CON=0X170C;         /* T4为连续增计数模式,128分频,且选用内部时钟源*/
	 *T4PER=0X75;           /* 设置T4的周期寄存器*/
	 *GPTCONB=0X400;         /* T4周期中断标志触发AD转换*/
	 *EVBIFRB=0XFFFF;       /* 清除EVB中断标志,"写1清0"*/
	 *ADCTRL1=0X10;          /* 采样时间窗口预定标位为ACQ PS3~ACQ PS0为0*/
	                         /*转换时间预定标位CPS为本0,AD为起动/停止模式*/
	                        /* 排序器为级联工作方式,且禁止特殊的两种工作模式*/
	 *ADCTRL2=0X8404;         /* 可以用EVB的一个事件信号触发AD转换*/
		                      /* 且用中断模式1*/
     *MAXCONV=0X00;           /* 16通道*/
	  *CHSELSEQ1=0X0000;
     *CHSELSEQ2=0X0000;
     *CHSELSEQ3=0X0000;
	 *CHSELSEQ4=0X0000; 
	 
	 /*CHSELSEQ1=0X3210;
     *CHSELSEQ2=0X7654;
     *CHSELSEQ3=0X0ba98;
	 *CHSELSEQ4=0X0fedc;      /* 转换通道是0~15*/
	 for(i=0;i<42;i++)
	    {pcdata[i]=0;}
 }  
 
 /* 启动AD转换子程序(通过启动定时器4的方式间接启动)*/
 void ADSOC()
 {
 *T4CON=*T4CON|0x40 ;         /*启动定时器4*/
 }   


/************************************/ 
void  get_hidein()       /*得到隐层输入*/
       {  
        int i;
        for(i=0;i<4;i++)
           {
           //06.05.28gai
            hidein[i]=drnn_12[0][i]*yout[1]+drnn_12[1][i]*yout[0]+drnn_12[2][i]*yback[1]+drnn_12[3][i]*yback[0];
           
           } 
       }
         
/*************arithmetic of nni*******************/
void  initial_w()        /*初始化

⌨️ 快捷键说明

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