?? purpid.c
字號(hào):
/*--------------------------------------------------------*/
/* WQ21ST SOFTWARE STUDIO. */
/*--------------------------------------------------------*/
/* EVM Test Code Shell */
/*--------------------------------------------------------*/
#include "sci2407.h"
#include "register1.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 getchar;
unsigned int configdata;
unsigned int count=0;
unsigned int pcdata[30];
unsigned int stopflag=0;
float kp=0,ki=0,kd=0,outspeed=0;
float error[6]={0,0,0,0,0,0};
float runspeed=0 ;
int pidi,pidf;/*整數(shù)部分,小數(shù)部分*/
float x1,x2,x3; /*middle variy of input*/
float mul; /*誤差和返回電壓的乘積*/
float mide1=0,mide2=0,mide3=0; /*x1,x3的算式*/
float backspeed; /*返回速度的電壓值*/
float addw; /*權(quán)值和*/
#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)
char tell[20];
/*double ipart ;
double fpart ;
double midv ;
double midv1 ; */
float ipart ;
float fpart ;
float ipart1 ;
float fpart1 ;
float ipart2 ;
float fpart2 ;
float ipart3 ;
float fpart3 ;
float midv ;
float midv1 ;
float midv2 ;
float midv3 ;
float midv4 ;
int me1 ;
/*設(shè)置振晶頻率*/
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 set_wait(void);
/*設(shè)置io空間的狀態(tài)寄存器*/
void set_wait(void)
{
configdata = IOWSB1+DSWSB1+PSWSB1; /* 2 waits for off chip I/O */
OUTMAC( _WSGR, configdata);
}
/*設(shè)置系統(tǒng)時(shí)鐘*/
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;
}
/*試驗(yàn)板設(shè)置,系統(tǒng)振晶設(shè)置*/
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;
/*優(yōu)先級(jí)設(shè)置,程序無中斷*/
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);
}
/*檢測(cè)緩存是否為空*/
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);
}
/*讀取字符后,轉(zhuǎn)換實(shí)值*/
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=get_value(24);
/* stopflag=0; */
}
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>=24){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 */
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -