Автоматизация управления флегмовым числом домашней ректификационной колонны

в 14:23, , рубрики: diy или сделай сам, ректификация, метки:

Не секрет, что в наше время можно достаточно легко получать чистый спирт или высоко очищенный дистиллят у себя дома, имея в своем арсенале ректификационную или тарельчатую колонну. Производством такого оборудования в России занимается десяток уважаемых производителей.

image

Однако правильно, качественно и со стабильным результатом провести ректификацию дома можно только при наличии автоматики, о которой дальше и пойдет речь.

Теория

Если объяснять просто, то принцип ректификации похож на обычную дистилляцию. Пары [2] от нагрева ТЭНом [3] поднимаются по колонне [4] из перегонного куба [1] и конденсируются в холодильнике [10]. Отличие состоит в том, что при дистилляции в приемную емкость [11] сразу отбирается вся жидкость, а при ректификации отбирается только небольшая часть, а остальное, сконденсированное дефлегматором [8], отправляется обратно в куб. В ректификационной колонне находится наполнитель (или тарелки) [6], так называемая насадка, которая увеличивает поверхность соприкосновения пара и жидкости. Таким образом по колонне снизу вверх идет пар, а сверху вниз идет жидкость. Данный процесс позволяет, в отличие от дистилляции, выстроить компоненты, содержащиеся в исходном спирте-сырце последовательно, и отобрать их по очереди в виде различных фракций [12] через регулятор отбора [9].

В процессе важна теплоизоляция [5], которая позволяет уменьшить теплообмен с внешней средой. Термометр [7] показывает температуру спиртосодержащих паров для контроля хвостовых фракций. В процессе ректификации давление должно быть строго не больше нормы, чтобы исключить так называемый захлеб. Прибором для измерения давления служит манометрическая трубка [13] или обычный манометр, а атмосферный штуцер [14] используется для связи с атмосферой.

Не вдаваясь в детали, среднестатический спирт-сырец состоит из трех основных групп веществ: головные фракции, товарный спирт, хвостовые фракции. Цель ректификации состоит в том, чтобы сначала отделить головные фракции, а потом отобрать товарный спирт, причем не допуская попадания в него хвостовых фракций. Головные фракции обычно отделяют, ориентируясь на их объем (5-10%) от общего количества спирта-сырца. Начало хвостовых фракций обычно контролируют с помощью термометра, находящегося в колонне снизу.

Несмотря на простоту процесса, на практике домашний винокур всегда сталкивается с частными вопросами, которые в итоге и определяют чистоту отобранного товарного спирта. Все эти вопросы в большинстве решаются двумя устройствами: регулятором мощности для точной установки паспортной мощности нагрева конкретной колонны и устройством отбора для обеспечения равномерного отбора продукта определенным способом.

Специфика ректификации состоит в том, что даже при обеспечении стабильного нагрева колонны весь успех работы, а значит и чистота продукта зависит только от разделяющей способности колонны, которая зависит главным образом от двух факторов. Первый фактор заложен в самой конструкции колонны, в ее высоте, диаметре и виде насадки, от чего зависит и ее цена. Второй фактор состоит в количестве отведенной в отбор жидкости, а проще говоря, в скорости отбора. Чем больше скорость, тем хуже разделяющая способность колонны и наоборот. Кроме того очень важно обеспечивать равномерную скорость отбора на всех этапах ректификации, причем скорость на каждом этапе разная.

Казалось бы достаточно пережимать силиконовый шланг отбора с разной силой, например с помощью зажима Гоффмана.

Автоматизация управления флегмовым числом домашней ректификационной колонны - 2

Но проблема в том, что силикон в контакте со спиртом постепенно начинает разбухать, тем самым меняется сечение, а следовательно и скорость отбора. Этих недостатков лишен игольчатый кран, но даже с ним, установить точную скорость отбора (до 1 мл/ч) несколько раз подряд не получится.

Автоматизация управления флегмовым числом домашней ректификационной колонны - 3

Этих недостатков лишены устройства отбора на основе электромагнитного клапана.

Автоматизация управления флегмовым числом домашней ректификационной колонны - 4

Клапан открывается и закрывается в ШИМ-режиме, т.е. через определенные промежутки времени, изменяя которые можно регулировать скорость отбора. Промежутки времени задаются очень точно, поэтому из раза в раз скорость отбора будет одинакова.

Автоматизация управления флегмовым числом домашней ректификационной колонны - 5

Кроме того, если головные фракции мы можем отделить, просто контролируя объем, то для контроля хвостовых фракций мы должны контролировать температуру в колонне. При отборе товарного спирта эта температура при правильно выбранной мощности нагрева, скорости отбора и достаточном утеплении колонны должна быть стабильна с точностью до 0.1 градуса цельсия. Повышение этой температуры означает, что из куба начинают прорываться хвостовые фракции. При этом отбор нужно прекратить, тем самым переводя колонну в режим максимального разделения, что в итоге отправит их обратно в куб, что приведет к возврату температуры к прежним значениям. Данная технология получила название старт-стоп. Данная операция требует постоянного присутствия оператора возле колонны, что мягко-говоря неудобно, учитывая то, что среднестатическая ректификация длится около 10 часов.

Другим, более продвинутым способом контроля хвостовых фракций является метод плавного уменьшения скорости отбора пропорционально спиртуозности в кубе, а значит увеличению его температуры. Не вдаваясь в подробности можно утверждать, что в ходе ректификации, чем меньше спирта остается в кубе, тем сложнее отделить хвостовые фракции от товарного спирта, а значит разделительная способность колонны должна увеличиваться, соответственно должен уменьшаться отбор. При правильно подобранном снижении отбора, хвостовые фракции в принципе не смогут прорваться в отбор, следовательно чистота продукта будет максимальной. При этом способе вручную вообще повторить результат не представляется возможным и необходимость присутствия возле колонны даже возрастает.

Из вышеизложенного один простой вывод: ректификацию без автоматизации отбора можно проводить, но для повторения стабильного результата и для максимального облегчения работы оператора она просто необходима.

Практика

Ректификация состоит из следующих этапов

1. Установка времени работы на себя для стабилизации колонны
В системе предусмотрена установка времени работы на себя (счетчик), т.е. задержка на стабилизацию колонны для концентрации головных фракций вверху колонны, после которого начнется отбор головных фракций.

2. Отбор головных фракций
Принцип ШИМ-управления клапаном, как уже было описано ранее, позволяет абсолютно точно устанавливать любую скорость отбора каждый раз. Прибор оперирует шкалой от 0 до 999, где значением шкалы является время в секундах между открытиями клапана. Например при значении 10, между открытиями клапана пройдет 10 секунд. Время на которое приоткрывается клапан так же задается в настройках прибора в десятых долях секунды.
Обычно на практике, прежде чем переходить к отбору товарного спирта, оператору нужно отобрать определенный объем головных фракций. Система позволяет с помощью звукового излучателя контролировать на слух объем отобранных головных фракций. Т.к. скорость отбора всегда одинакова при одинаковых значениях шкалы отбора, то определенный объем отобранных головных фракций соответствует определенному количеству открытий клапана. Систему можно настроить таким образом, чтобы например через каждые 10, 20, 30 и т.д. раз открытия клапана, подавался сигнал. Например если установить, чтобы сигнал срабатывал через каждые 40 открытий клапана, то через 40 открытий система подаст один сигнал, через 80 открытий два сигнала, через 120 открытий 3 сигнала. Таким образом, на слух можно проконтролировать достижение необходимого объема головных фракций. Данная функция может быть отключена. Также могут быть отключены вообще все звуковые оповещения.

3. Отбор товарного спирта
После отбора головных фракций и смены тары, прибор переводится в режим отбора товарного спирта, при этом автоматически запоминается так называемая температура стабилизации, от которой и фиксируется отклонение температуры при прорыве хвостовых фракций. Необходимое отклонение (0.1, 0.2, и т.д. градусов) может задаваться в параметрах прибора. При фиксации выхода температуры за определенные оператором рамки, клапан запирается и система ждет возврата температуры в заданный диапазон, тем самым не допуская попадания хвостовых фракций в товарный спирт. В зависимости от настроек, если температура не возвращается в заданный диапазон, возможно как окончание отбора, так и снижение скорости отбора на определенное количество процентов (старт-стоп с декрементом).
Возможен также отбор с уменьшением скорости отбора пропорционально температуре куба. При данном методе отбора контролируется температура не в колонне, а в кубе. При увеличении температуры с определенного значения (задается пользователем) на каждые 0.1 градус, отбор будет уменьшаться на определенное оператором количество процентов. Например установив начало снижения отбора на 84 градуса и установив процент снижения отбора на 0.6 градусов, получим 96% снижение отбора к 100 градусам или 90% снижение отбора к 99 градусам. Температура, при которой отбор должен быть прекращен тоже настраивается оператором из соображений экономии электроэнергии.

4. Исполнительное устройство окончания процесса
Иногда бывает удобно, чтобы при окончании процесса не только прозвучал сигнал, но и произошло некоторое действие. Для этого в системе предусмотрено маломощное электромагнитное реле (гальванически развязано с самим прибором, эквивалентно механическому замыканию 2х кусков провода), которое например может выключать питание или включать сигнализацию. Также его можно использовать для выключения питания напимер через твердотельное реле.

Исходный код проекта (ATMEGA8 фьюзы [2E-D9])

#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>

unsigned char number[] = {

0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f, //9

0x00, // 10
0x40, //- 11
0x08, //6bup_ 12

0x23, //up 13
0x1c, //down 14
0x50, //r 15
0x58, //c 16
0x5e, //d 17
0x74, //h 18
0x63, //oup 19
0x5c, //o 20
0x6b, //Ob 21
0x54, //n 22
0x79, //E 23
0x36 //|| 24

};

char param_dot[] ={ 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0 };
int param_min[] = { 0, 0, 1, 0, 1, 1, 1, 1, 1, 80, 0, 0};
int param_max[] = { 999, 999, 3, 99, 99, 99, 99, 99, 99, 99, 99,99 };

unsigned char data1 = 0, data2 = 0, data3 = 0, fv = 0, fp = 0, fp2 = 0, fl = 0,
status = 0, mtype = 0, is_menu = 0, vcount = 0, fvz = 0, kk = 0, sf = 0, resbutt = 0, count = 0, jj = 0, pi, upState,
downState, OldState, NewState, isok = 0;
int x = 0, curr_temp = 0, temp_temp = 0, stab_temp = 0, tic_h = 0, xtic_voice =
0, xtic_sil = 0, tic_reg = 0, heads_kol = 0, tic_voice = 0, tic_sil = 0,
theads_kol = 0, total_kol = 0, temp_total_kol = 0, tic = 0,
tic_m = 0, kol_stop = 0, quadro = 0, t3pr = 0;
long tic_w = 0,vkoeff = 0, param[12], tparam[12],reg_k=1000;

unsigned int fparam[12] EEMEM;

#define W1_PORT PORTC
#define W1_DDR DDRC
#define W1_PIN PINC
#define W1_BIT 3

ISR( TIMER1_OVF_vect ) {
cli();

TCNT1H = 0xF9;
TCNT1L = 0xE4; //16mhz

if ((PINB & 0b00000001) == 1) {
resbutt++;
if (resbutt > 30) {
PORTC &= ~(1 << PC5);
vcount = 1;
vkoeff = 0;
tic_w=0;
fvz = 0;
reg_k=1000;
pi = 2;
}
} else {
resbutt = 0;
}

if (quadro>0&&param[2] == 2&&pi > 14 && pi < 17&&reg_k > param[10]*10&& stab_temp + param[4] < curr_temp)
{
if (quadro>0)
{
quadro--;
}
if (quadro==0)
{
PORTC &= ~(1 << PC5);
vcount = 1;
vkoeff = 0;
pi = 18;
}
}

if (isok > 0) {
isok--;
} else {
isok = 0;
}

if (fv == 1 && x > 0 && param[11] < 99) {
if (tic_voice > 0) {
PORTC |= (1 << PC4);
tic_voice--;
} else {
PORTC &= ~(1 << PC4);
fv = 0;
tic_sil = 10;
}
}
if (fv == 0 && x > 0) {
if (tic_sil > 0) {
tic_sil--;
} else {
x--;
tic_voice = xtic_voice;
tic_sil = xtic_sil;
fv = 1;
}
}

if (x == 0) {
kk = 0;
fv = 0;
}

if (pi > 10) {
tic++;
}
if (pi == 13) {
tic_w++;
}
if (pi == 17) {
tic_reg++;
}

if (pi == 16&&param[2]<3) {
tic_h++;
if (tic_h > param[5] * 60) {
if (param[2] == 1) {
tic_h = 0;
pi = 18;
}
if (param[2] == 2) {
reg_k = reg_k — param[8]*10;
pi = 17;
x = 1;
xtic_voice = 30;
xtic_sil = 5;
tic_voice = xtic_voice;
tic_sil = xtic_sil;
fv = 1;

if (reg_k <= param[10]*10) {
tic_h = 0;
pi = 18;
}
}

}

}
if (pi == 0 || pi == 1) {
tic_m++;
if (tic_m > 40) {
tic_m = 0;
pi = pi + 14;
}
}

if ((vcount == 0 && pi == 14) | (vcount == 0 && pi == 0)) {
vkoeff++;
if (vkoeff < param[6]) {
PORTC |= (1 << 5);
} else {
vcount = 1;
vkoeff = 0;
}

}
if ((vcount == 0 && pi > 14 && pi < 17) | (vcount == 0 && pi == 1)) {
vkoeff++;
if (vkoeff < param[7]) {
PORTC |= (1 << 5);
} else {
vcount = 1;
vkoeff = 0;
}

}

if ((vcount == 1 && pi == 14) | (vcount == 1 && pi == 0)) {
vkoeff++;
if (vkoeff < param[0] * 10) {
PORTC &= ~(1 << 5);
} else {
vcount = 0;
vkoeff = 0;
heads_kol++;
}

}
if ((vcount == 1 && pi == 15) | (vcount == 1 && pi == 1)) {
vkoeff++;

if (fvz == 0) {
if (param[2]==3)
{
reg_k=1000-t3pr;
}
if (vkoeff < param[1] * 1000 / reg_k) {
PORTC &= ~(1 << 5);
} else {
vcount = 0;
vkoeff = 0;
}

} else {
if (vkoeff < param[5] * 30) {
PORTC &= ~(1 << 5);
} else {
vcount = 0;
vkoeff = 0;
fvz = 0;
}
}
}

if (pi == 19) {
PORTC |= (1 << 5);
}
if ((pi > 1 && pi < 14) || (pi > 16 && pi < 19)) {
PORTC &= ~(1 << 5);
}

sei();

}

ISR( TIMER0_OVF_vect ) {
cli();

TCNT0 = 0xbc; //16mhz

PORTC &= ~((1 << 2) | (1 << 1) | (1 << 0));

if (count == 0) {
PORTD = number[data3];
PORTC |= (1 << 0);
}
if (count == 1) {
PORTD = number[data2];
PORTC |= (1 << 1);
if (param_dot[pi] == 1) {
PORTD |= (1 << 7);
}
if (param_dot[pi] == 0) {
PORTD &= ~(1 << 7);
}
}
if (count == 2) {
PORTD = number[data1];
PORTC |= (1 << 2);
if (pi == 14) {
PORTD |= (1 << 7);
} else {
PORTD &= ~(1 << 7);
}
}
count++;
if (count == 3)
count = 0;

}

ISR( TIMER2_OVF_vect ) {
cli();

if ((PINB & 0b00000001) == 1 && isok == 0) //
{

if (pi >= 2 && pi <= 11) {
pi++;
}

if (pi == 12) {

for (unsigned char pj = 2; pj < 12; pj++) {
if (param[pj] > tparam[pj] || param[pj] < tparam[pj]) {
eeprom_write_word(&fparam[pj], param[pj]);
}
}
}

jj = 0;
if (pi == 15 || pi == 16) {
PORTC &= ~(1 << PC5);
vcount = 1;
vkoeff = 0;
pi = 14;
jj = 1;
}

if (pi == 14 && jj == 0) {
stab_temp = curr_temp;
pi = 15;
sf = 0;
PORTC &= ~(1 << PC5);
vcount = 1;
vkoeff = 0;
}

if (pi == 19) {
kol_stop = 0;
pi = 2;
}

if (pi == 18) {
pi = 19;
}

isok = 5;

}

NewState = PINB & 0b00000110;
if (NewState != OldState) {
switch (OldState) {
case 4: {
if (NewState == 6)
upState++;
if (NewState == 0)
downState++;
break;
}

case 0: {
if (NewState == 4)
upState++;
if (NewState == 2)
downState++;
break;
}
case 2: {
if (NewState == 0)
upState++;
if (NewState == 6)
downState++;
break;
}
case 6: {
if (NewState == 2)
upState++;
if (NewState == 4)
downState++;
break;
}
}
OldState = NewState;
}

if (upState >= 4) {
tic_m = 0;

if (pi <= 11) {
param[pi]++;
if (param[pi] > param_max[pi]) {
param[pi] = param_min[pi];
}
}

if (pi > 13 && pi < 16) {
tic_m = 0;
param[pi — 14]++;
if (param[pi — 14] > param_max[pi — 14]) {
param[pi — 14] = param_min[pi — 14];
}

pi = pi — 14;
}

upState = 0;
}

if (downState >= 4) {
tic_m = 0;

if (pi <= 11) {
if (param[pi] == param_min[pi]) {
param[pi] = param_max[pi];
} else {
param[pi]--;
}

}

if (pi > 13 && pi < 16) {
tic_m = 0;
if (param[pi — 14] == param_min[pi — 14]) {
param[pi — 14] = param_max[pi — 14];
} else {
param[pi — 14]--;
}

pi = pi — 14;
}

downState = 0;
}

sei();

}

void show_seg(int data, int literal) {
if (literal == 0) {
data3 = data / 100;
data2 = (data — data3 * 100) / 10;
data1 = (data — data3 * 100) % 10;
} else {
if (literal == 12) {
data3 = literal;
data2 = literal;
data1 = literal;
} else {
data3 = literal;
data2 = data / 10;
data1 = data % 10;
}
}

}

unsigned char w1_find() {
unsigned char device;
W1_DDR |= 1 << W1_BIT;
_delay_us(485);
W1_DDR &= ~(1 << W1_BIT);
_delay_us(65);
if ((W1_PIN & (1 << W1_BIT)) == 0x00)
device = 1;
else
device = 0;
_delay_us(420);
return device;
}

void w1_sendcmd(unsigned char cmd) {
for (unsigned char i = 0; i < 8; i++) {
if ((cmd & (1 << i)) == 1 << i) {
W1_DDR |= 1 << W1_BIT;
_delay_us(2);
W1_DDR &= ~(1 << W1_BIT);
_delay_us(65);
} else {
W1_DDR |= 1 << W1_BIT;
_delay_us(65);
W1_DDR &= ~(1 << W1_BIT);
_delay_us(5);
}
}
}

unsigned char w1_receive_byte() {
unsigned char data = 0;
for (unsigned char i = 0; i < 8; i++) {
W1_DDR |= 1 << W1_BIT;
_delay_us(2);
W1_DDR &= ~(1 << W1_BIT);
_delay_us(7);
if ((W1_PIN & (1 << W1_BIT)) == 0x00)
data &= ~(1 << i);
else
data |= 1 << i;
_delay_us(50);
}
return data;
}

int temp_18b20() {
unsigned char data[2];
int temp = 0;
if (w1_find() == 1) {
w1_sendcmd(0xcc);
w1_sendcmd(0x44);
_delay_ms(750);
w1_find();
w1_sendcmd(0xcc);
w1_sendcmd(0xbe);
data[0] = w1_receive_byte();
data[1] = w1_receive_byte();
temp = data[1];
temp = temp << 8;
temp |= data[0];
temp = temp * 0.625;
if (temp > 0 && temp < 999) {
temp_temp = temp;
} else {
temp = temp_temp;
}
}
return temp;
}

int main() {

DDRC |= (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
DDRB |= (1 << 5) | (1 << 4);

DDRD = 0xff;
PORTD = 0xff;

TCCR0 = (1 << CS02) | (0 << CS01) | (1 << CS00);
TCCR1B = (1 << CS02) | (0 << CS01) | (1 << CS00);
TCCR2 = (1 << CS02) | (0 << CS01) | (1 << CS00);

TIMSK |= (1 << TOIE0);
TIMSK |= (1 << TOIE2);
TIMSK |= (1 << TOIE1);

TCNT1H = 0xF9;
TCNT1L = 0xE4; //16mhz

sei();

fv = 1;

pi = 2;
mtype = 1;

for (unsigned char pj = 0; pj < 12; pj++) {
param[pj] = eeprom_read_word(&fparam[pj]);
tparam[pj] = param[pj];
}

PORTC &= ~(1 << PC5);

while (1) {

if (pi == 0||pi == 1) {
show_seg(param[pi], 0);
}
if (pi < 12&&pi>1) {
show_seg(param[pi], pi + 13);
}
if (pi == 12 || pi == 14) {
show_seg(curr_temp, 0);
}
if (pi == 13) {
show_seg(param[3] * 6 — tic_w / 600, 0);
}
if (pi == 15&&param[2]<3) {
if (curr_temp >= stab_temp) {
if (curr_temp — stab_temp > 99) {
show_seg(99, 10);
} else {
show_seg(curr_temp — stab_temp, 10);
}

}
if (curr_temp < stab_temp) {
if (stab_temp — curr_temp > 99) {
show_seg(99, 11);
} else {
show_seg(stab_temp — curr_temp, 11);
}

}
}
if (pi == 15&&param[2]==3) {
show_seg(curr_temp, 0);
}
if (pi == 16) {
show_seg(param[5] * 6 — tic_h / 10, 0);
}
if (pi == 17) {
show_seg(reg_k/10, 0);
}
if (pi == 18) {
show_seg(kol_stop, 0);
}
if (pi == 19) {
show_seg(888, 0);
}

if (tic > 10 && pi > 11) {
curr_temp = temp_18b20();
tic = 0;
}

if ((param[2]<3&&curr_temp > 500 && pi == 12)||(param[2]==3&&curr_temp > 800 && pi == 12)) {
x = 5;
xtic_voice = 10;
xtic_sil = 10;
tic_voice = xtic_voice;
tic_sil = xtic_sil;
fv = 1;
pi = 13;
heads_kol = 0;
theads_kol = 0;
kk = 0;
PORTB |= (1 << PB4);
}
if (param[3] * 6 < tic_w / 600 && pi == 13) {
x = 2;
xtic_voice = 5;
xtic_sil = 10;
tic_voice = xtic_voice;
tic_sil = xtic_sil;
fv = 1;
pi = 14;
}

if (pi == 14) {
if (heads_kol % (param[11] * 10) == 0
&& heads_kol > (param[11] * 10 — 1) && kk == 0
&& heads_kol > theads_kol&& param[0]>0) {
x = heads_kol / (param[11] * 10);
xtic_voice = 5;
xtic_sil = 10;
tic_voice = xtic_voice;
tic_sil = xtic_sil;
fv = 1;
kk = 1;
theads_kol = heads_kol;
}

}

if (pi == 15 && stab_temp + param[4] < curr_temp&&param[2]<3) {
PORTC &= ~(1 << PC5);
tic_h = 0;
vcount = 1;
vkoeff = 0;
fvz = 1;
if (sf == 0 && (param[2] == 2 || param[2] == 1)) {
pi = 16;
kol_stop++;
quadro = param[5]*4*60;
}
sf = 1;
}
if (pi > 14 && pi < 17 && stab_temp + param[4] >= curr_temp&&param[2]<3) {
sf = 0;
pi = 15;
}

if (pi == 17 && tic_reg > 30) {
tic_reg = 0;
pi = 15;
}

if (param[2]==2&&pi > 14 && pi < 18 && stab_temp + param[4] >= curr_temp) {
quadro=0;
}

if (param[2]==3&&pi==15)
{
if (curr_temp<param[9]*10)
{
t3pr=0;
}
if (curr_temp>=param[9]*10&&curr_temp<=param[10]*10)
{
t3pr=param[8]*(curr_temp-param[9]*10);
}
if (t3pr>1000||curr_temp>param[10]*10||param[9]>param[10])
{
pi=18;
PORTC &= ~(1 << PC5);
vcount = 1;
vkoeff = 0;
}
}

if (pi == 18 && kk == 0) {
x = 1;
xtic_voice = 20;
xtic_sil = 5;
tic_voice = xtic_voice;
tic_sil = xtic_sil;
fv = 1;
kk = 1;
reg_k = 1000;
tic_w = 0;
fvz = 0;
PORTB |= (1 << PB5);

for (unsigned char pj = 0; pj < 2; pj++) {
if (param[pj] > tparam[pj] || param[pj] < tparam[pj]) {
eeprom_write_word(&fparam[pj], param[pj]);
}
}
}

if (pi == 19) {
PORTB &= ~(1 << PB5);
}

}
return 0;

}

Принципиальная схема и внешний прибора.

Автоматизация управления флегмовым числом домашней ректификационной колонны - 6

Автоматизация управления флегмовым числом домашней ректификационной колонны - 7

Автоматизация управления флегмовым числом домашней ректификационной колонны - 8

Автоматизация управления флегмовым числом домашней ректификационной колонны - 9

В заключение отмечу, что мое изначальное видение прибора было идеалистическим и само собой неверным. Только с помощью корректировки изначальной постановки задачи коллегами на одном известном форуме, и года работы, этот довольно простой прибор реально стал удобным. На данный момент он протестирован на более чем 50 экземплярах и в принципе зарекомендовал себя как законченное решение. Проект на данный момент открыт для повторения всеми желающими.

Автор: 61003

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js