Balsam_166/Source/Internal/DAC.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);
} } } }