153 lines
2.7 KiB
C
153 lines
2.7 KiB
C
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
|
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
|
#include "filter_bat2.h"
|
|
#include "measure.h"
|
|
|
|
#include "RS485.h"
|
|
#include "message.h"
|
|
#include "DAC.h"
|
|
#include "package.h"
|
|
#include "tools.h"
|
|
|
|
#include "peripher.h"
|
|
#include "log_to_mem.h"
|
|
|
|
#define dCLK_1() GpioDataRegs.GPBSET.bit.GPIO63=1
|
|
#define dCLK_0() GpioDataRegs.GPBCLEAR.bit.GPIO63=1
|
|
#define dCS_1() GpioDataRegs.GPBSET.bit.GPIO59=1
|
|
#define dCS_0() GpioDataRegs.GPBCLEAR.bit.GPIO59=1
|
|
|
|
unsigned long WAKEpowse;
|
|
unsigned long IMPowse;
|
|
unsigned int period_dac, time_dac;
|
|
|
|
void Setup_DAC_time(void)
|
|
{
|
|
WAKEpowse = 3L * DAC_FREQ +1;
|
|
|
|
period_dac = READY_FREQ / DAC_FREQ;
|
|
time_dac = LOAD_TIME * DAC_FREQ;
|
|
}
|
|
|
|
void dOUT(int x)
|
|
{
|
|
if(x) GpioDataRegs.GPBSET.bit.GPIO60=1;
|
|
else GpioDataRegs.GPBCLEAR.bit.GPIO60=1;
|
|
}
|
|
|
|
void wast()
|
|
{
|
|
int i;
|
|
|
|
for(i=0;i<25;i++);
|
|
}
|
|
|
|
void dSEND(unsigned int word)
|
|
{
|
|
int i;
|
|
|
|
dCS_0(); DSP28x_usDelay(1L);
|
|
|
|
for(i=0;i<16;i++)
|
|
{
|
|
dCLK_1();
|
|
dOUT((word & 0x8000)?1:0); word = word<<1; DSP28x_usDelay(1L);
|
|
dCLK_0(); DSP28x_usDelay(1L);
|
|
}
|
|
dCS_1();
|
|
}
|
|
|
|
void Init_DAC(void)
|
|
{
|
|
dSEND(0x9002|0x0000); toggle_RES_OUT_1();
|
|
}
|
|
|
|
void Anal_output(long vrot, long maxx)
|
|
{
|
|
long out;
|
|
static int x;
|
|
|
|
out = DAC_min() + vrot * DAC_max() / maxx - vrot * DAC_min() / maxx ;
|
|
|
|
x=0;// !x; òùåòíî áûòèå
|
|
|
|
if(cCalibrDac) out=DAC_cal();
|
|
|
|
out = out & 0xFFF;
|
|
|
|
if(x) dSEND(out|0x0000|0x0000);
|
|
else dSEND(out|0x8000|0x0000);
|
|
|
|
modbus[123] = out;
|
|
|
|
modbus[0x1C] = 40L + vrot * 200 / maxx - vrot * 40 / maxx ;
|
|
|
|
/*
|
|
if(!no_write)
|
|
{
|
|
Test_mem_limit(4);
|
|
|
|
Log_to_mem(modbus[0x7B]);
|
|
Log_to_mem(modbus[0x63]);
|
|
Log_to_mem(modbus[0x1C]);
|
|
Log_to_mem(modbus[0x1D]);
|
|
|
|
}
|
|
*/
|
|
|
|
|
|
}
|
|
|
|
void Load_runner()
|
|
{
|
|
static unsigned int count_dac=0, count_load=0, x=1;
|
|
float sinus=0;
|
|
int kod;
|
|
|
|
if(IMPowse) IMPowse--;
|
|
if(++count_dac >= period_dac)
|
|
{
|
|
count_dac=0;
|
|
|
|
if(WAKEpowse)
|
|
{
|
|
--WAKEpowse;
|
|
|
|
if( (WAKEpowse == DAC_FREQ/2*6)||
|
|
(WAKEpowse == DAC_FREQ/2*5)||
|
|
(WAKEpowse == DAC_FREQ/2*4)||
|
|
(WAKEpowse == DAC_FREQ/2*3)||
|
|
(WAKEpowse == DAC_FREQ/2*2)||
|
|
(WAKEpowse == DAC_FREQ/2*1) )
|
|
{
|
|
Init_DAC(); x=1;
|
|
} }
|
|
|
|
else
|
|
{
|
|
if(cUMPstart)
|
|
{
|
|
if(count_load > (time_dac/2))count_load++;
|
|
|
|
if(++count_load > time_dac) count_load = time_dac;
|
|
|
|
// sinus = ((float)(DAC_stop - DAC_go) / 16.0 * count_load) + ((float)(DAC_go - 4.0) / 16.0 * time_dac);
|
|
sinus = (10.0 / 16.0 * count_load) + (2.0 / 16.0 * time_dac);
|
|
}
|
|
else
|
|
{ count_load = 0;
|
|
sinus=0;
|
|
x = (x+1)&0x3FF;
|
|
}
|
|
|
|
if(!x || cInitDac)
|
|
{
|
|
Init_DAC(); x=1; cInitDac=0;
|
|
}
|
|
else
|
|
{
|
|
kod = (int)sinus;
|
|
|
|
Anal_output(kod, time_dac);
|
|
} } } }
|