📄 ygm00.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 + -