/*--------------------------------------------------------*/
/* 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;
- 1
- 2
- 3
前往页