Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
584 lines
42 KiB
C
584 lines
42 KiB
C
/* Настройка АЦП, обработка преобразований и первичная фильтрация измерений. Русские пояснения сохранены в UTF-8. */
|
||
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
|
||
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
||
/* Подключает "DSP2833x_Examples.h": поставляемое TI описание Examples для семейства C2833x. */
|
||
#include "DSP2833x_Examples.h" // DSP281x Examples Include File
|
||
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
|
||
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
||
|
||
/* Подключает "ADC.h": настройка АЦП, обработка преобразований и первичная фильтрация измерений. */
|
||
#include "ADC.h"
|
||
|
||
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
|
||
#include "log_to_mem.h"
|
||
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
|
||
#include "RS485.h"
|
||
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
|
||
#include "filter_bat2.h"
|
||
|
||
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
|
||
#include "measure.h"
|
||
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
|
||
#include "message.h"
|
||
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
|
||
#include "package.h"
|
||
|
||
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
|
||
#include "peripher.h"
|
||
|
||
/* Объявляет adc_table_lem — АЦП table lem. */
|
||
Uint16 adc_table_lem[4];
|
||
/* Объявляет ADC_table — АЦП table. */
|
||
Uint16 ADC_table[28]; // Потому что +4 калибр
|
||
/* Объявляет prev_ok — данные prev_ok. */
|
||
Uint16 prev_ok[28];
|
||
|
||
/* Объявляет COUNT_ONE_CANAL — число ONE CANAL. */
|
||
unsigned int COUNT_ONE_CANAL;
|
||
/* Объявляет COUNT_DISCHARGE — число DISCHARGE. */
|
||
unsigned int COUNT_DISCHARGE;
|
||
/* Объявляет COUNT_TRANSICIA — число TRANSICIA. */
|
||
unsigned int COUNT_TRANSICIA;
|
||
/* Объявляет FILTER_CLIP — данные FILTER_CLIP. */
|
||
unsigned int FILTER_CLIP;
|
||
|
||
/* Объявляет WAKE — данные WAKE; WAKE_TIME — данные WAKE_TIME. */
|
||
long WAKE, WAKE_TIME;
|
||
|
||
// Prototype statements for functions found within this file.
|
||
/* Принимает результаты последовательности АЦП и обновляет измерительные фильтры в прерывании. */
|
||
interrupt void adc_isr(void);
|
||
|
||
/* Настраивает каналы, последовательность преобразований и запуск АЦП. */
|
||
void setup_adc()
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Объявляет CLKdiv — данные CLKdiv; HSPCLKdiv — данные HSPCLKdiv; Rate — данные Rate. */
|
||
long CLKdiv,HSPCLKdiv,Rate;
|
||
/* Объявляет i — данные i. */
|
||
int i;
|
||
|
||
/* Условие компиляции (CPU_FRQ_150MHZ): выбранный блок включается в текущий вариант прошивки. */
|
||
#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
|
||
/* Задаёт ADC_MODCLK = 0x3; АЦП MODCLK. */
|
||
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
|
||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||
#endif
|
||
/* Условие компиляции (CPU_FRQ_100MHZ): выбранный блок включается в текущий вариант прошивки. */
|
||
#if (CPU_FRQ_100MHZ)
|
||
/* Задаёт ADC_MODCLK = 0x2; АЦП MODCLK. */
|
||
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
|
||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||
#endif
|
||
|
||
// Specific clock setting for this example:
|
||
// EALLOW;
|
||
// SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
|
||
// EDIS;
|
||
|
||
// Interrupts that are used in this example are re-mapped to
|
||
// ISR functions found within this file.
|
||
/* Разрешение записи в защищённые регистры периферии. */
|
||
EALLOW; // This is needed to write to EALLOW protected register
|
||
/* Записывает PieVectTable.ADCINT значением &adc_isr; данные ADCINT. */
|
||
PieVectTable.ADCINT = &adc_isr;
|
||
/* Закрытие доступа к защищённым регистрам периферии. */
|
||
EDIS; // This is needed to disable write to EALLOW protected registers
|
||
|
||
/* Инициализирует модуль вызовом InitAdc(); перед его дальнейшим использованием. */
|
||
InitAdc(); // For this example, init the ADC
|
||
|
||
// Enable ADCINT in PIE
|
||
/* Записывает PieCtrlRegs.PIEIER1.bit.INTx6 значением 1; данные INTx6. */
|
||
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
|
||
/* Устанавливает биты IER значением M_INT1; регистр разрешения прерываний ядра C28x. */
|
||
IER |= M_INT1; // Enable CPU Interrupt 1
|
||
// EINT; // Enable Global interrupt INTM
|
||
// ERTM; // Enable Global realtime interrupt DBGM
|
||
|
||
/* Цикл for(i=0;i<28;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for(i=0;i<28;i++)
|
||
/* Записывает ADC_table[i] значением ; АЦП table. */
|
||
ADC_table[i]=
|
||
/* Записывает prev_ok[i] значением 0; данные prev_ok. */
|
||
prev_ok[i] = 0;
|
||
|
||
// Configure ADC
|
||
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_LOAD)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x0005; данные MAX_CONV1. */
|
||
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0005; // Setup 2 conv's on SEQ1
|
||
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x3; данные CONV00. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // температура (которой нет)
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV01 значением 0x1; данные CONV01. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // омега
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV02 значением 0x5; данные CONV02. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x5; // напруга 1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV03 значением 0x4; данные CONV03. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x4; // напруга 2
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV04 значением 0x7; данные CONV04. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x7; // ток 1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV05 значением 0x2; данные CONV05. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x2; // ток 2
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Проверяет if(Desk==dsk_BKST); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_BKST)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x0002; данные MAX_CONV1. */
|
||
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0002; // Setup 2 conv's on SEQ1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x0; данные CONV00. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //0x5;//0x7; // Setup ADCINA3 as 1st SEQ1 conv.
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV01 значением 0x1; данные CONV01. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; //0x4;// Setup ADCINA2 as 2nd SEQ1 conv.
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV02 значением 0x2; данные CONV02. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; //0x4;// Setup ADCINA2 as 2nd SEQ1 conv.
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Проверяет if(Desk==dsk_COMM); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_COMM)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x0006; данные MAX_CONV1. */
|
||
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0006; // Setup 2 conv's on SEQ1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x5; данные CONV00. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x5; // сначала тоже будут температуры
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV01 значением 0x4; данные CONV01. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x4; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV02 значением 0x7; данные CONV02. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x7; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV03 значением 0x2; данные CONV03. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV04 значением 0x3; данные CONV04. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x3; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV05 значением 0x6; данные CONV05. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x6; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV06 значением 0x1; данные CONV06. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x1; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_BKSD)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x0000; данные MAX_CONV1. */
|
||
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0000; // Setup 2 conv's on SEQ1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x0; данные CONV00. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA3 as 1st SEQ1 conv.
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Проверяет if(Desk==dsk_SHKF); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_SHKF)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x000F; данные MAX_CONV1. */
|
||
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x000F; // Setup 2 conv's on SEQ1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x2; данные CONV00. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x2; // 380В Ф1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV01 значением 0x3; данные CONV01. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x3; // 380В Ф2
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV02 значением 0x6; данные CONV02. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x6; // 31В Ф1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV03 значением 0xC; данные CONV03. */
|
||
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0xC; // 31В Ф2 ?
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV04 значением 0xA; данные CONV04. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0xA; // 31В UC1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV05 значением 0xB; данные CONV05. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0xB; // 31В UC2
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV06 значением 0x7; данные CONV06. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x7; // 24В ПУ
|
||
/* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV07 значением 0x4; данные CONV07. */
|
||
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x4; // 24В ПУ
|
||
|
||
/* Записывает AdcRegs.ADCCHSELSEQ3.bit.CONV08 значением 0x5; данные CONV08. */
|
||
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x5; // 24В ПК было 5
|
||
/* Записывает AdcRegs.ADCCHSELSEQ3.bit.CONV09 значением 0x1; данные CONV09. */
|
||
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x1; // 15В Др
|
||
/* Записывает AdcRegs.ADCCHSELSEQ3.bit.CONV10 значением 0xE; данные CONV10. */
|
||
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xE; // +24В Дт
|
||
/* Записывает AdcRegs.ADCCHSELSEQ3.bit.CONV11 значением 0x0; данные CONV11. */
|
||
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0; // +24В Дт
|
||
/* Записывает AdcRegs.ADCCHSELSEQ4.bit.CONV12 значением 0x8; данные CONV12. */
|
||
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x8; // -24В Дт было 8
|
||
|
||
/* Записывает AdcRegs.ADCCHSELSEQ4.bit.CONV13 значением 0xF; данные CONV13. */
|
||
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xF;//0xF; // ДТ° 1
|
||
/* Записывает AdcRegs.ADCCHSELSEQ4.bit.CONV14 значением 0xD; данные CONV14. */
|
||
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xD;//0xD; // ДТ° 2
|
||
/* Записывает AdcRegs.ADCCHSELSEQ4.bit.CONV15 значением 0x9; данные CONV15. */
|
||
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x9;//0x9;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Записывает AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 значением 1; данные EPWM_SOCA_SEQ1. */
|
||
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
|
||
/* Записывает AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 значением 1; данные INT_ENA_SEQ1. */
|
||
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS)
|
||
/* Записывает AdcRegs.ADCST.bit.INT_SEQ1_CLR значением 1; данные INT_SEQ1_CLR. */
|
||
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
|
||
|
||
/* Записывает AdcRegs.ADCTRL1.bit.SEQ_CASC значением 1; данные SEQ_CASC. */
|
||
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded mode
|
||
|
||
/* Записывает AdcRegs.ADCTRL1.bit.CONT_RUN значением 0; данные CONT_RUN. */
|
||
AdcRegs.ADCTRL1.bit.CONT_RUN=0;
|
||
/* Записывает AdcRegs.ADCTRL1.bit.ACQ_PS значением 15; данные ACQ_PS. */
|
||
AdcRegs.ADCTRL1.bit.ACQ_PS = 15;
|
||
|
||
//AdcRegs.ADCTRL1.bit.CPS=1;
|
||
|
||
/* Записывает AdcRegs.ADCTRL2.bit.RST_SEQ1 значением 1; данные RST_SEQ1. */
|
||
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
|
||
/* Записывает PieCtrlRegs.PIEACK.all значением PIEACK_GROUP1; представление регистра целым словом без разбиения на битовые поля. */
|
||
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
|
||
|
||
// Assumes ePWM1 clock is already enabled in InitSysCtrl();
|
||
/* Записывает EPwm1Regs.ETSEL.bit.SOCAEN значением 1; данные SOCAEN. */
|
||
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
|
||
/* Записывает EPwm1Regs.ETSEL.bit.SOCASEL значением 4; данные SOCASEL. */
|
||
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount
|
||
/* Записывает EPwm1Regs.ETPS.bit.SOCAPRD значением 1; данные SOCAPRD. */
|
||
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
|
||
/* Записывает EPwm1Regs.CMPA.half.CMPA значением 0x0080; данные CMPA. */
|
||
EPwm1Regs.CMPA.half.CMPA = 0x0080; // Set compare A value
|
||
|
||
/* Записывает EPwm1Regs.TBCTL.bit.HSPCLKDIV значением CLKMULT; данные HSPCLKDIV. */
|
||
EPwm1Regs.TBCTL.bit.HSPCLKDIV = CLKMULT;
|
||
/* Записывает EPwm1Regs.TBCTL.bit.CLKDIV значением 2; данные CLKDIV. */
|
||
EPwm1Regs.TBCTL.bit.CLKDIV=2;
|
||
|
||
/* Записывает CLKdiv значением 1<<EPwm1Regs.TBCTL.bit.CLKDIV; данные CLKdiv. */
|
||
CLKdiv = 1<<EPwm1Regs.TBCTL.bit.CLKDIV;
|
||
/* Проверяет if(EPwm1Regs.TBCTL.bit.HSPCLKDIV) HSPCLKdiv = 2*EPwm1Regs.TBCTL.bit.HSPCLKDIV; последующий оператор выполняется только при истинном условии. */
|
||
if(EPwm1Regs.TBCTL.bit.HSPCLKDIV) HSPCLKdiv = 2*EPwm1Regs.TBCTL.bit.HSPCLKDIV;
|
||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||
else HSPCLKdiv = 1;
|
||
|
||
/* Записывает Rate значением (SYSCLKOUT/(HSPCLKdiv*CLKdiv))/ADC_FREQ; данные Rate. */
|
||
Rate = (SYSCLKOUT/(HSPCLKdiv*CLKdiv))/ADC_FREQ;
|
||
|
||
/* Записывает EPwm1Regs.TBPRD значением Rate; данные TBPRD. */
|
||
EPwm1Regs.TBPRD = Rate; // Set period for ePWM1
|
||
/* Записывает EPwm1Regs.TBCTL.bit.CTRMODE значением 0; данные CTRMODE. */
|
||
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // count up and start
|
||
|
||
/* Записывает WAKE_TIME значением 2L * ADC_FREQ; данные WAKE_TIME. */
|
||
WAKE_TIME =2L * ADC_FREQ; // dsk_LOAD;
|
||
|
||
/* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_BKSD)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает COUNT_ONE_CANAL значением ADC_FREQ/250; число ONE CANAL. */
|
||
COUNT_ONE_CANAL = ADC_FREQ/250; // 15
|
||
/* Записывает COUNT_DISCHARGE значением 4; число DISCHARGE. */
|
||
COUNT_DISCHARGE = 4;
|
||
/* Записывает COUNT_TRANSICIA значением 9; число TRANSICIA. */
|
||
COUNT_TRANSICIA = 9;
|
||
/* Записывает FILTER_CLIP значением 20; данные FILTER_CLIP. */
|
||
FILTER_CLIP = 20;//40;
|
||
/* Записывает WAKE_TIME значением 7L * ADC_FREQ; данные WAKE_TIME. */
|
||
WAKE_TIME =7L * ADC_FREQ;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
/* Проверяет if(Desk==dsk_BKST); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_BKST)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает COUNT_ONE_CANAL значением ADC_FREQ/350; число ONE CANAL. */
|
||
COUNT_ONE_CANAL = ADC_FREQ/350; // 10
|
||
/* Записывает COUNT_DISCHARGE значением 1; число DISCHARGE. */
|
||
COUNT_DISCHARGE = 1;
|
||
/* Записывает COUNT_TRANSICIA значением 4; число TRANSICIA. */
|
||
COUNT_TRANSICIA = 4;
|
||
/* Записывает FILTER_CLIP значением 20; данные FILTER_CLIP. */
|
||
FILTER_CLIP = 20;//40;
|
||
/* Записывает WAKE_TIME значением 3L * ADC_FREQ; данные WAKE_TIME. */
|
||
WAKE_TIME =3L * ADC_FREQ;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
/* Проверяет if(TermoAD); последующий оператор выполняется только при истинном условии. */
|
||
if(TermoAD)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает COUNT_ONE_CANAL значением ADC_FREQ/15; число ONE CANAL. */
|
||
COUNT_ONE_CANAL = ADC_FREQ/15; // 250;
|
||
/* Записывает COUNT_DISCHARGE значением ADC_FREQ/145; число DISCHARGE. */
|
||
COUNT_DISCHARGE = ADC_FREQ/145; // 25;
|
||
/* Записывает COUNT_TRANSICIA значением ADC_FREQ/25; число TRANSICIA. */
|
||
COUNT_TRANSICIA = ADC_FREQ/25; // 150;
|
||
/* Записывает FILTER_CLIP значением 20; данные FILTER_CLIP. */
|
||
FILTER_CLIP = 20;//200;
|
||
/* Записывает WAKE_TIME значением 3L * ADC_FREQ; данные WAKE_TIME. */
|
||
WAKE_TIME =3L * ADC_FREQ;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_LOAD)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает WAKE_TIME значением 10L * ADC_FREQ; данные WAKE_TIME. */
|
||
WAKE_TIME =10L * ADC_FREQ;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
/* Проверяет if(Desk==dsk_SHKF); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_SHKF)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает WAKE_TIME значением 1L * ADC_FREQ; данные WAKE_TIME. */
|
||
WAKE_TIME =1L * ADC_FREQ;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Записывает WAKE значением WAKE_TIME; данные WAKE. */
|
||
WAKE = WAKE_TIME;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Принимает результаты последовательности АЦП и обновляет измерительные фильтры в прерывании. */
|
||
interrupt void adc_isr(void)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Объявляет cownt_one_canal — данные cownt_one_canal. Начальное значение задаётся справа от знака равенства. */
|
||
static int cownt_one_canal=0;
|
||
/* Объявляет cownt_cans — данные cownt_cans. Начальное значение задаётся справа от знака равенства. */
|
||
static int cownt_cans=0;
|
||
/* Объявляет code_tpl_canal — данные code_tpl_canal. Начальное значение задаётся справа от знака равенства. */
|
||
int code_tpl_canal=0;
|
||
/* Объявляет Temper — данные Temper; Filter — данные Filter. */
|
||
float Temper,Filter;
|
||
/* Объявляет i — данные i; n — данные n. */
|
||
int i,n;
|
||
|
||
/* Объявляет ok — данные ok; cwnt_ok — данные cwnt_ok. Начальное значение задаётся справа от знака равенства. */
|
||
static int ok, cwnt_ok[2]={0,0};
|
||
|
||
// Set interrupt priority:
|
||
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
|
||
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER1.all;
|
||
|
||
/* Устанавливает биты IER значением M_INT1; регистр разрешения прерываний ядра C28x. */
|
||
IER |= M_INT1;
|
||
/* Оставляет биты маски IER значением MINT1; регистр разрешения прерываний ядра C28x. */
|
||
IER &= MINT1; // Set "global" priority
|
||
/* Оставляет биты маски PieCtrlRegs.PIEIER1.all значением MG11; представление регистра целым словом без разбиения на битовые поля. */
|
||
PieCtrlRegs.PIEIER1.all &= MG11;//16; // Set "group" priority
|
||
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
|
||
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
|
||
/* Разрешение маскируемых прерываний ядра. */
|
||
EINT;
|
||
|
||
/* Проверяет if(WAKE) WAKE--; последующий оператор выполняется только при истинном условии. */
|
||
if(WAKE) WAKE--;
|
||
/* Проверяет if(!READY) goto fin; последующий оператор выполняется только при истинном условии. */
|
||
if(!READY) goto fin;
|
||
|
||
/* Проверяет if(Caliber_time); последующий оператор выполняется только при истинном условии. */
|
||
if(Caliber_time)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Проверяет if(!--Caliber_time); последующий оператор выполняется только при истинном условии. */
|
||
if(!--Caliber_time)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает cTermoCal значением 0; данные cTermoCal. */
|
||
cTermoCal = 0;
|
||
/* Записывает cSaveParam значением 1; данные cSaveParam. */
|
||
cSaveParam = 1;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
} }
|
||
|
||
/* Проверяет if(Kurrent); последующий оператор выполняется только при истинном условии. */
|
||
if(Kurrent)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for(i=0;i<4;i++)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает adc_table_lem[i] значением *((&AdcRegs.ADCRESULT0)+i+2) >>4; Current_count(i); АЦП table lem. */
|
||
adc_table_lem[i] = *((&AdcRegs.ADCRESULT0)+i+2) >>4; Current_count(i);
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
} }
|
||
|
||
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_LOAD)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает Temper значением AdcRegs.ADCRESULT1 >> 4; данные Temper. */
|
||
Temper = AdcRegs.ADCRESULT1 >> 4;
|
||
/* Записывает modbus[0x63] значением Temper; массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||
modbus[0x63] = Temper;
|
||
/* Записывает Temper значением filterbat(&adc_filter[0],Temper); данные Temper. */
|
||
Temper = filterbat(&adc_filter[0],Temper);
|
||
/* Записывает modbus[0x1D] значением (Temper-DAC_04)/(DAC_20-DAC_04)*(200-40)+40; массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||
modbus[0x1D] = (Temper-DAC_04)/(DAC_20-DAC_04)*(200-40)+40;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Проверяет if(Desk==dsk_SHKF); последующий оператор выполняется только при истинном условии. */
|
||
if(Desk==dsk_SHKF)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Цикл for(i=0;i<CLKMULT*3;); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for(i=0;i<CLKMULT*3;)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Проверяет if (++cownt_cans>=tpl_cans) cownt_cans=0; последующий оператор выполняется только при истинном условии. */
|
||
if (++cownt_cans>=tpl_cans) cownt_cans=0;
|
||
|
||
// Именно здесь нет дыр
|
||
// if(sens_type[cownt_cans])
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Изменяет счётчик в выражении i++; на один для следующего шага. */
|
||
i++;
|
||
/* Записывает Temper значением *(&AdcRegs.ADCRESULT0 + cownt_cans) >>4; данные Temper. */
|
||
Temper= *(&AdcRegs.ADCRESULT0 + cownt_cans) >>4;
|
||
/* Записывает ADC_table[cownt_cans] значением filterbat(&adc_filter[cownt_cans],Temper); АЦП table. */
|
||
ADC_table[cownt_cans]=filterbat(&adc_filter[cownt_cans],Temper);
|
||
/* Проверяет if(sens_type[cownt_cans]==TERMO_AD) Temper_count(cownt_cans,0); последующий оператор выполняется только при истинном условии. */
|
||
if(sens_type[cownt_cans]==TERMO_AD) Temper_count(cownt_cans,0);
|
||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||
else Power_count(cownt_cans);
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
} } }
|
||
|
||
/* Проверяет if(TermoSW); последующий оператор выполняется только при истинном условии. */
|
||
if(TermoSW)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Проверяет if(cownt_one_canal==COUNT_DISCHARGE); последующий оператор выполняется только при истинном условии. */
|
||
if(cownt_one_canal==COUNT_DISCHARGE)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает code_tpl_canal значением cownt_cans; данные code_tpl_canal. */
|
||
code_tpl_canal = cownt_cans;
|
||
|
||
/* Проверяет if(TermoAD); последующий оператор выполняется только при истинном условии. */
|
||
if(TermoAD)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Проверяет if(cownt_cans == TPL_CANS ) code_tpl_canal = TERMOPAIR-1; последующий оператор выполняется только при истинном условии. */
|
||
if(cownt_cans == TPL_CANS ) code_tpl_canal = TERMOPAIR-1;
|
||
/* Проверяет if(cownt_cans == TPL_CANS+1) code_tpl_canal = TERMOPAIR-2; последующий оператор выполняется только при истинном условии. */
|
||
if(cownt_cans == TPL_CANS+1) code_tpl_canal = TERMOPAIR-2; // потому что 300 и 400 наоборот
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
/* Вызывает select_tpl_canal с аргументами (code_tpl_canal) в текущей последовательности операций. */
|
||
select_tpl_canal(code_tpl_canal);
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Проверяет if(cownt_one_canal > COUNT_TRANSICIA); последующий оператор выполняется только при истинном условии. */
|
||
if(cownt_one_canal > COUNT_TRANSICIA)
|
||
/* Цикл for(i=0;i<TermoSW;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for(i=0;i<TermoSW;i++)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает n значением TermoSW*cownt_cans+i; данные n. */
|
||
n = TermoSW*cownt_cans+i;
|
||
|
||
/* Записывает Temper значением *(&AdcRegs.ADCRESULT0 + i) >>4; данные Temper. */
|
||
Temper = *(&AdcRegs.ADCRESULT0 + i) >>4;
|
||
|
||
/* Записывает ok значением abs(ADC_table[n]-Temper) < FILTER_CLIP; данные ok. */
|
||
ok = abs(ADC_table[n]-Temper) < FILTER_CLIP;
|
||
|
||
/* Проверяет if(ok) cwnt_ok[i]++; последующий оператор выполняется только при истинном условии. */
|
||
if(ok) cwnt_ok[i]++;
|
||
|
||
/* Проверяет if(ok|!prev_ok[n]); последующий оператор выполняется только при истинном условии. */
|
||
if(ok|!prev_ok[n])
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает Filter значением filterbat(&adc_filter[n],Temper); данные Filter. */
|
||
Filter = filterbat(&adc_filter[n],Temper);
|
||
|
||
/* Проверяет if(WAKE)ADC_table[n] = Temper; последующий оператор выполняется только при истинном условии. */
|
||
if(WAKE)ADC_table[n] = Temper;
|
||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||
else ADC_table[n] = Filter;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
/*
|
||
if(cownt_cans == TPL_CANS)
|
||
{
|
||
Test_mem_limit(8);
|
||
|
||
modbus[0x2F]=Log.Adres;
|
||
|
||
for(i=0;i<1;i++)
|
||
{
|
||
Log_to_mem(*(&AdcRegs.ADCRESULT0 + i) >>4);
|
||
Log_to_mem(ADC_table[2*cownt_cans+i]);
|
||
}
|
||
}
|
||
*/
|
||
/* Проверяет if(++cownt_one_canal>=COUNT_ONE_CANAL); последующий оператор выполняется только при истинном условии. */
|
||
if(++cownt_one_canal>=COUNT_ONE_CANAL)
|
||
/* Записывает cownt_one_canal значением 0; данные cownt_one_canal. */
|
||
{ cownt_one_canal=0;
|
||
|
||
/* Вызывает select_tpl_255 с аргументами () в текущей последовательности операций. */
|
||
select_tpl_255();
|
||
|
||
/* Цикл for(i=0;i<TermoSW;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for(i=0;i<TermoSW;i++)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Записывает n значением TermoSW*cownt_cans+i; данные n. */
|
||
n = TermoSW*cownt_cans+i;
|
||
/* Вызывает Temper_count с аргументами (n,0) в текущей последовательности операций. */
|
||
Temper_count(n,0);
|
||
/* Записывает prev_ok[n] значением cwnt_ok[i]; данные prev_ok. */
|
||
prev_ok[n] = cwnt_ok[i];
|
||
/* Записывает cwnt_ok[i] значением 0; данные cwnt_ok. */
|
||
cwnt_ok[i] = 0;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
/* Проверяет if(++cownt_cans >= TPL_CANS+2); последующий оператор выполняется только при истинном условии. */
|
||
if(++cownt_cans >= TPL_CANS+2)
|
||
/* Записывает cownt_cans значением 0; данные cownt_cans. */
|
||
{ cownt_cans=0;
|
||
|
||
/* Цикл for(i=0;i<Owen;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for(i=0;i<Owen;i++)
|
||
/* Вызывает Temper_count с аргументами (tpl_cans+i,1) в текущей последовательности операций. */
|
||
Temper_count(tpl_cans+i,1);
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
} } }
|
||
|
||
/* Метка fin для перехода внутри функции. */
|
||
fin:
|
||
|
||
// Reinitialize for next ADC sequence
|
||
/* Записывает AdcRegs.ADCTRL2.bit.RST_SEQ1 значением 1; данные RST_SEQ1. */
|
||
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
|
||
/* Записывает AdcRegs.ADCST.bit.INT_SEQ1_CLR значением 1; данные INT_SEQ1_CLR. */
|
||
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
|
||
/* Записывает PieCtrlRegs.PIEACK.all значением PIEACK_GROUP1; представление регистра целым словом без разбиения на битовые поля. */
|
||
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
|
||
|
||
// Restore registers saved:
|
||
/* Запрет маскируемых прерываний ядра. */
|
||
DINT;
|
||
/* Записывает PieCtrlRegs.PIEIER1.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
|
||
PieCtrlRegs.PIEIER1.all = TempPIEIER;
|
||
|
||
/* Завершает adc_isr без возвращаемого значения. */
|
||
return;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|