📄 main.c
字号:
/**********************************************************************************************
main.c file
作者:lig
建立日期:2006-4-25
修改日期:2006-4-25
版本:V1.0
**********************************************************************************************/
#include <ADuC7020.H>
#include "my_type.h"
#include "LED.H"
#include "interrupt.h"
#include "Timer.h"
#include "UART.H"
#include "ADC.h"
#include "others.h"
#include "math.h"
#include "slave.h"
/*********************************************************************************************/
////////////////////////////////////////////////
extern uint8 pdata;
extern uint8 pmax;
extern uint8 pmin;
extern uint16 datas[6];
////////////////////////////
uint16 AD_value[3]; //最近的3次AD采样值
uint16 A_value[2];
uint16 A_S_value[2][32];
sint32 Z_w_value;
double Z_w_result; //固定坐标系下角度
uint8 temp1;
uint16 count1=0;//test
unsigned char Z_Hbit,Z_Lbit,Z_Sbit;//Z 的高位 低位 符号位
int ZERO_V=4523; //若度数向下飘,增大ZERO_V
unsigned char zus=0;
unsigned int x,z_time=0;
sint32 z_temp,z_temp1;
////////////////////////////////////////////////
void demarcate(unsigned char flag_demarcate)
{
unsigned char z_i = 4,z_j = 5;
// sint32 z_max_error[11],z_w_value_min,z_w_value_max;
if(!flag_demarcate)
{
x = 0;
}
else
{
x = 51;
}
z_temp = 0;
zus=0;
z_time=0;
count1=0;
temp1=0;
do
{
do
{
if(zus)
{
z_temp=z_temp+Z_w_value ;
z_time++;
zus = 0;
}
}while(z_time<z_i);
z_temp=z_temp/z_i;
if(x<50)
{
ZERO_V=ZERO_V-(int)((z_temp1-z_temp)/z_j);
}
else
{
if((z_temp-30)>z_temp1)
{
ZERO_V++;
}
if((z_temp+30)<z_temp1)
{
ZERO_V--;
}
}
z_temp1 = z_temp;
z_temp = 0;
z_time = 0;
x++;
// print_Z_w();
if(x>30)
{
z_i=7;
z_j=30;
}
if(x>50)
{
z_i=150;
}
}
while(x<(57+6*flag_demarcate)) ;
}
void SysClkInit(void)
{
PLLKEY1=0xAA;
PLLCON=0x01; //PLL配置
PLLKEY2=0x55;
POWKEY1=0x01;
POWCON=0x00; //CPU时钟配置为41.78MHz
POWKEY2=0xF4;
// while(!(PLLSTA & 0x01));
}
///////////////////////////////////////////////////////////////////////////////////////////////
/*********************************************************************************************/
void FIQ_Handler(void) __fiq //FIQ中断服务程序
{
int i=0;
WatchDog();
if(FIQSTA & TIMER0) //读取FIQ中断状态,判断FIQ中断源
{ //Timer0中断 1/128秒
T0CLRI=0; //清Timer0中断
AD_value[0]=AD_value[1];
AD_value[1]=AD_value[2];
AD_value[2]=read_ADC(2); //根据通道号读ADC的值
AD_value[2]=szlb(AD_value[2]); //滤波
WatchDog();
///////////////////////////////////////积分//////////////////////////////////////////////////////
if(count1==3)
{
Z_w_value=Z_w_value+(AD_value[2]+AD_value[0]-ZERO_V);//3310 //注意RS150 零点不一定是2.5V
// Z_w_result=(Z_w_value>>8)*0.122; //变换为度 2.5V*1000/(5mV*4096) RS300 clockwise 为正
// Z_w_result=Z_w_value*0.00095/2.0; //0.122/128 // RS300
Z_w_result=-Z_w_value*0.00152; //19-38 ->128Hz // 152->32Hz 2.5*1000/(128*2*12.5mv*4096) RS150 du
count1=0;
zus++;
}
else
{count1++;}
return;
}
if(FIQSTA & UART)
{
/* temp1=COMRX;
if(temp1=='o')
{
send_a_byte('o');
}
else{send_a_byte('a');}
*/
ON_LED42();
UART_R_ISR();
return;
}
if(FIQSTA & TIMER3) //读取IRQ中断状态,判断IRQ中断源
{ //Timer3中断
double temp;
temp=Z_w_result; // Watchdog interrupt allows saving...
//... data before reset if necessary
T3CLRI=0;
T3LD = 0x1000; // 0x1000/32768 = 125ms
RSTSTA = 0x4; // Software reset
Z_w_result=temp;
return;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
union
{
uint32 TimeData;
time_type Time;
}RealTime;
void main(void)
{
uint8 i,j;
///////////////数据初始化/////////////////////////
uint16 temp;
Z_COMMUNI_INIT();
// Z_COMMUNI_INIT
pdata=0;
pmax=0;
pmin=0;
for(i=0;i<6;i++)
{datas[i]=1927;}
for(i=0;i<3;i++)
{ AD_value[i]=1927; }
Z_w_value=-90/0.00152;
Z_w_result=0; //固定坐标系下位移
temp1=0;
z_temp= Z_w_value;
////////////////////
A_value[0]=A_value[1]= 2096;
for(i=0;i<2;i++)
for(j=0;j<30;j++)
{A_S_value[i][j]= 2096;}
////////////////////
////////////////////////////////////////////////////
SysClkInit();
EN_TXD();
EN_LED42();
OFF_TXD();
OFF_LED42();
cls();
ADC_init();
WatchDog();
Timer0Init();
Timer3Init();
UART_init();
// init();
WatchDog();
print_Z_w();
// send_a_byte('b');
// send_a_byte('c');
// send_a_byte('d');
ON_LED42();
zus=0;
//ON_TXD();
//while(1)
//{
//Z_TXD(0xdd);
//}
//自动标定
demarcate(0);
//Delay_X_ms(1000);
z_time = 0;
Z_w_value=-90/0.00152;
ON_LED42();
//自动标定完后闪烁
zus=0;
do{
ON_LED42();
for(z_time=0;z_time<65000;z_time++)
{
;
}
OFF_LED42();
for(z_time=0;z_time<65000;z_time++)
{
;
}
zus++;
}while(zus<30);
// ON_TXD();
// print_Z_w();
//***********************************
// Z_COMMUNI_INIT();
// while(1);
while(1)
{
// ON_TXD();
/* if (z_temp>Z_w_value)
{
ZERO_V--;
}
else
{
ZERO_V++;
}
z_temp=Z_w_value ;
*/
z_flag_newins = Z_GETYOU();
if(z_flag_newins) // //接收中断,处理
{
int z_tempangle=0;
// Z_TXD(flag_pri_tim);
// Z_TXD(bigp[flag_pri_tim].instruction);
switch(bigp[flag_pri_tim].instruction)
{
case 2:
{
// ON_TXD();
z_tempangle=bigp[flag_pri_tim].x[1]<<8;
z_tempangle=z_tempangle+bigp[flag_pri_tim].x[2];
Z_w_value=-z_tempangle/0.00152;
}
break;
case 3:
{
// print_Z_w();
ZERO_V++;
// OFF_TXD();
}
break;
case 4:
{
ZERO_V--;
// OFF_TXD();
}
break;
case 5:
{
demarcate(1);
}
break;
}
}
/*
if(z_flag_newins==1)
{
int z_tempangle=0;
switch(z_instruction)
{
case 2:
{
z_tempangle=z_global_receive_data.dat[0]<<8;
z_tempangle=z_tempangle+z_global_receive_data.dat[1];
Z_w_value=z_tempangle/0.00152;
OFF_TXD();
}
}
}
*/
temp=((int)(Z_w_result));
Z_Hbit=temp>>8;
Z_Lbit=temp & 0x00ff;
z_global_send_bufn[1].head=0x02;
z_global_send_bufn[1].dat[0]= Z_Lbit;
z_global_send_bufn[1].dat[1]= Z_Hbit;
// z_global_send_buf[1].dat[2]= Z_Sbit;
// z_global_send_buf[1].dat[3]= 0;
WatchDog();
print_Z_w(); //调试W值
// A_value[0]=read_ADC(0);
// A_value[1]=read_ADC(1);
// OFF_LED42();
Delay_X_ms(1000);//0.25S // 调试W时要调整倒1000
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -