📄 ad_drive.c
字号:
#include "hardware_intc.h"
#include "hardware_reg.h"
#include "AD_Drive.h"
#include "Fix_Dsp.h"
#include "nucleus.h"
#include "Mototype.h"
#include "modbusdef.h"
#define Pa_parameter IA_linerAdjust*UA_linerAdjust_I
extern NU_TASK _Modbus_Task;
extern void modebus_framdiv(void);
extern NU_TASK GUI_TASK;
extern NU_HISR _Errwav_Write2Flash;
extern float yxjtest2[100];
extern int yxjtestcal;
#define size1 0.00122100122
//外部函数
extern void Timer_init(unsigned char index, unsigned long time);
extern void init_SPI(void);
extern unsigned short SPI_Transfer(unsigned short command);
VOID WatchDog_Timer_Expire(void);
//外部数据
extern Data_In datalist[DATA_CALCULATE_SIZE];
extern int readIndex;
extern int writeIndex;
extern NU_HISR PROTECT_TASK;
extern char Task_Suspended;
extern int Break_flag;
extern TJDTimingNode noAlarmT;
NU_SEMAPHORE Semaphore;
//自定义数据
unsigned int ii,i1;
float data[100];
Data_In data_in;
struct _AD_data
{
unsigned long IA,
IB,
IC,
I0,
Ua,
Ub,
Uc,
VREF;
}AD_data;
unsigned int readTime = 0;
void init_ReadAD(void)
{
SPI_Transfer(AD_START);
}
void readAD_Init(void)
{
init_SPI();
Timer_init(2, 75000);
SPI_Transfer(AD_START);
}
void cleanTimerInt()
{
volatile unsigned long clear_int;
while(*(RP)(T2_IMSR) & 0x01){
clear_int = *(RP)(T2_ISCR);
clear_int = *(RP)(T_ISCR);
WatchDog_Timer_Expire();
}
}
void enableTimer()
{
*(RP)(T2_CR) &= 0x06;
*(RP)(T2_CR) |= 0x01;
}
int AfterBrake_count;
int ErrRecWave_flag;
int AD_OK = 0;
void read_AD(void)
{
U32 AD_sample;
int i;
AD_OK = 0;
init_SPI();
//Timer_init(2, 75000);
NOP();
SPI_Transfer(AD_START);
//*(volatile unsigned long *)PORTA_DATA |= 0x10;
cleanTimerInt();
//read process
for (i = 0; i < 8; i++)
{
AD_sample = (SPI_Transfer(AD_READ) & 0xFFFF);
switch ((AD_sample&0xF000) >> 12)
{
case 0:
AD_data.IA = (AD_sample & 0xFFF);
break;
case 1:
AD_data.IB = (AD_sample & 0xFFF);
break;
case 2:
AD_data.IC = (AD_sample & 0xFFF);
break;
case 3:
AD_data.Ua = (AD_sample & 0xFFF);
break;
case 4:
AD_data.Ub = (AD_sample & 0xFFF);
break;
//data[i1 % 100] = AD_sample;
case 5:
AD_data.Uc = (AD_sample & 0xFFF);
break;
case 6:
AD_data.I0 = (AD_sample & 0xFFF);
break;
//i1++;
case 7:
AD_data.VREF = (AD_sample & 0xFFF);
break;
default :
break;
}
//data[i1 % 100] = AD_data.IB - AD_data.VREF;
}
AD_Convert();
/*********************************************************/
//memcpy(&datalist[writeIndex].IA, &AD_data.IA, sizeof(Data_In)); /* 采集16通道同步输出 */
writeIndex = (writeIndex + WRITE_INDEX_INCREASE) % DATA_CALCULATE_SIZE;
readTime++;
if(readTime == READ_INDEX_INCREASE)
{
if(Task_Suspended == 1)
{
NU_Activate_HISR(&PROTECT_TASK);
Task_Suspended = 0;
}
else
{
Task_Suspended = 1;
}
if (readIndex >= DATA_CALCULATE_SIZE)
{
readIndex = readIndex % DATA_CALCULATE_SIZE;
}
if ((readIndex - writeIndex - READ_INDEX_INCREASE < 0) && (writeIndex - readIndex <15))
{
ii++;
readIndex = (writeIndex + 1 + READ_INDEX_INCREASE) % DATA_CALCULATE_SIZE;
/* used for test */
if(ii>99)
{
ii = 0;
}
}
//i1++;
readTime = 0;
}
modebus_framdiv();
// *(volatile unsigned long *)PORTA_DATA &= ~0x10;
}
VOID WatchDog_Pulse(VOID)
{
INT dog = 0;
*(volatile unsigned long *)PORTA_DATA |= 0x10; //pull high
for(dog=1;dog<5;dog++);
*(volatile unsigned long *)PORTA_DATA &= ~0x10; //pull low
}
VOID WatchDog_Timer_Expire(void)
{
static unsigned long WDG_Tick = 0;
WDG_Tick++;
if (WDG_Tick >= 600)
{
WatchDog_Pulse();
WDG_Tick = 0;
}
//*(volatile unsigned long *)PORTH_DATA |= 0x20;
///watch dog
}
double IA_Channel = 0;
double IB_Channel = 0;
double IC_Channel = 0;
double UA_Channel = 0;
double UB_Channel = 0;
double UC_Channel = 0;
double I0_Channel = 0;
int testerrwave = 0;
float Pa = 0;
float Pb = 0;
float Pc = 0;
float Pa_temp = 0;
float Pb_temp = 0;
float Pc_temp = 0;
int Power_cal = 0;
int eeee = 0;
void AD_Convert(void)
{
IA_Channel = IA_AD_Channel;
IB_Channel = IB_AD_Channel;
IC_Channel = IC_AD_Channel;
UA_Channel = UA_AD_Channel;
UB_Channel = UB_AD_Channel;
UC_Channel = UC_AD_Channel;
I0_Channel = I0_AD_Channel;
data_in.IA = AD_data.IA * size1;
data_in.IB = AD_data.IB * size1;
data_in.IC = AD_data.IC * size1;
data_in.Ua = AD_data.Ua * size1;
data_in.Ub = AD_data.Ub * size1;
data_in.Uc = AD_data.Uc * size1;
data_in.I0 = AD_data.I0 * size1;
data_in.VREF = AD_data.VREF * size1;
//datalist[writeIndex].IA = (data_in.IA - data_in.VREF)*1.05;
//datalist[writeIndex].IB = (data_in.IB - data_in.VREF)*1.04;
//datalist[writeIndex].IC = (data_in.IC - data_in.VREF)*1.04;
/*
#ifdef wujiao
datalist[writeIndex].IA = (data_in.IA - data_in.VREF)*1.08;
datalist[writeIndex].IB = (data_in.IB - data_in.VREF)*1.07;
datalist[writeIndex].IC = (data_in.IC - data_in.VREF)*1.07;
#else
datalist[writeIndex].IA = (data_in.IA - data_in.VREF)*1.05;
datalist[writeIndex].IB = (data_in.IB - data_in.VREF)*1.04;
datalist[writeIndex].IC = (data_in.IC - data_in.VREF)*1.04;
#endif
datalist[writeIndex].Ua = data_in.Ua - data_in.VREF;
datalist[writeIndex].Ub = data_in.Ub - data_in.VREF;
datalist[writeIndex].Uc = data_in.Uc - data_in.VREF;
datalist[writeIndex].I0 = (data_in.I0 - data_in.VREF)*1.04;
datalist[writeIndex].VREF = data_in.VREF;
*/
/*
datalist[writeIndex].IA = (data_in.IA )*IA_Channel;
datalist[writeIndex].IB = (data_in.IB )*IB_Channel;
datalist[writeIndex].IC = (data_in.IC )*IC_Channel;
datalist[writeIndex].Ua = (data_in.Ua )*UA_Channel;
datalist[writeIndex].Ub = (data_in.Ub )*UB_Channel;
datalist[writeIndex].Uc = (data_in.Uc )*UC_Channel;
datalist[writeIndex].I0 = (data_in.I0 )*I0_Channel;
datalist[writeIndex].VREF = data_in.VREF;
*/
datalist[writeIndex].IA = data_in.IA ;
datalist[writeIndex].IB = data_in.IB ;
datalist[writeIndex].IC = data_in.IC ;
datalist[writeIndex].Ua = data_in.Ua ;
datalist[writeIndex].Ub = data_in.Ub ;
datalist[writeIndex].Uc = data_in.Uc ;
datalist[writeIndex].I0 = data_in.I0 ;
datalist[writeIndex].VREF = data_in.VREF;
/*
Pa_temp += (data_in.IA-data_in.VREF) *( data_in.Ua - data_in.VREF);
if(20==Power_cal)
{
//eeee = IA_linerAdjust*UA_linerAdjust_I;
Pa = Pa_temp*Pa_parameter*0.05;
Power_cal = 0;
Pa_temp = 0;
eeee++;
}
Power_cal++;
yxjtest2[eeee] = Pa;
NOP();
NOP();
eeee %= 100;
*/
/*************************故障录波用数据*******************/
/*
testerrwave++;
datalist[writeIndex].Ua = 0.01+testerrwave;
*/
/*
if( !ErrRecWave_flag) //ErrRecWave_flag在录波函数最后清零 在跳闸函数里置位
{
Data_BackUp_Process( datalist[writeIndex] );
}
else
{
//在录波函数最后清零
AfterBrake_count++; //在录波函数最后清零
if( AfterBrake_count < 40) //故障后再录两个周波 一共四个周波
{
Data_BackUp_Process( datalist[writeIndex] );
}
if( AfterBrake_count == 40)
{
NU_Activate_HISR(&_Errwav_Write2Flash);
}
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -