Фронты START/STOP обрабатываются при принятии командного слова CAN/RS, а окончание импульса обслуживается таймером. STOP имеет приоритет, перекрытие выходов исключено, сохранена защита от самопуска при включении. Загрузка параметров больше не подменяет живые команды нагрузки. Добавлены подробные русские комментарии во все собственные C-модули и основные заголовки, описание поведения и host-тест автомата. Обновлены файлы прошивки. Полная сборка TI 22.6.1.LTS и тесты пройдены; проверка на физической плате не выполнялась.
183 lines
4.0 KiB
C
183 lines
4.0 KiB
C
/* ÖÀÏ íàãðóçêè è àïïàðàòíàÿ îá¸ðòêà èìïóëüñîâ ÑÈÔÓ. Load_runner
|
|
* âûçûâàåòñÿ òàéìåðîì 1 êÃö, ðàñ÷¸ò ÖÀÏ äåëèòñÿ äî DAC_FREQ.
|
|
* Ôîðìóëà 166 çàäà¸ò ôèêñèðîâàííûé ðàçãîí 6..16 ìÀ. DAC_min/max
|
|
* ïåðåâîäÿò ïîëîæåíèå â êîä, cCalibrDac âûáèðàåò ðó÷íîé êîä.
|
|
* WAKEpowse îòíîñèòñÿ ê ÖÀÏ, íå ÿâëÿåòñÿ ðàçðåøåíèåì äèñêðåòà çàïóñêà.
|
|
* Àâòîìàò ÑÈÔÓ ïîäêëþ÷¸í â êîíöå ôàéëà ÷åðåç ump_control_impl.h.
|
|
*/
|
|
#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"
|
|
#include "ump_pulse.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;
|
|
volatile unsigned long IMPowse;
|
|
unsigned int period_dac, time_dac;
|
|
|
|
/* Èíèöèàëèçàöèÿ, íå îáðàáîòêà êàæäîãî START. 601 îòñ÷¸ò ïðè 200 Ãö
|
|
* äàþò îêîëî 3 ñåêóíä äî ðàáî÷åãî ðàñ÷¸òà ÖÀÏ ïîñëå âêëþ÷åíèÿ.
|
|
*/
|
|
void Setup_DAC_time(void)
|
|
{
|
|
WAKEpowse = 3L * DAC_FREQ +1;
|
|
|
|
period_dac = READY_FREQ / DAC_FREQ;
|
|
time_dac = LOAD_TIME * DAC_FREQ;
|
|
/* Diagnostic values for the fixed 166 ramp (0.1 mA). */
|
|
ump_dac_go10 = 60; ump_dac_stop10 = 160;
|
|
ump_dac_duration = time_dac;
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
/* vrot/maxx — äîëÿ äèàïàçîíà ìåæäó êîäàìè 4 è 20 ìÀ. Ìàñêà 0xFFF
|
|
* ñîõðàíÿåò 12 áèò, íî íå ÿâëÿåòñÿ íàñûùåíèåì. modbus[0x1C] ñîäåðæèò
|
|
* ðàñ÷¸òíîå çàäàíèå, íå èçìåðåííûé òîê íà âûõîäíûõ êëåììàõ.
|
|
*/
|
|
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]);
|
|
|
|
}
|
|
*/
|
|
|
|
|
|
}
|
|
|
|
/* Ïîñëå ïîëîâèíû time_dac ñ÷¸ò÷èê ðàñò¸ò äâàæäû çà âûçîâ. Ïîýòîìó
|
|
* LOAD_TIME=30 äà¸ò ïðèìåðíî 22.5 ñ äî êîíöà ðàçãîíà ïðè 200 Ãö.
|
|
* Ñóùåñòâóþùèé ïðîôèëü 166 èñïðàâëåíèå èìïóëüñà ÑÈÔÓ íå ìåíÿåò.
|
|
*/
|
|
void Load_runner()
|
|
{
|
|
static unsigned int count_dac=0, count_load=0, x=1;
|
|
float sinus=0;
|
|
int kod;
|
|
|
|
/* IMPowse îáíîâëÿåòñÿ UMP_pulse_tick(), à íå àëãîðèòìîì ÖÀÏ. */
|
|
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;
|
|
}
|
|
|
|
/* Observe the existing ramp without changing DAC control. */
|
|
ump_dac_ramp = count_load;
|
|
ump_dac_duration = time_dac;
|
|
ump_dac_position = (unsigned int)sinus;
|
|
|
|
if(!x || cInitDac)
|
|
{
|
|
Init_DAC(); x=1; cInitDac=0;
|
|
}
|
|
else
|
|
{
|
|
kod = (int)sinus;
|
|
|
|
Anal_output(kod, time_dac);
|
|
} } } }
|
|
|
|
|
|
#include "ump_control_impl.h"
|