Unitra G600 стабилизатор скорости на датчике Холла
Добавлено: 09 янв 2024, 18:56
Здравствуйте!
Решил поделиться еще одним вариантом стабилизатора скорости. Может будет интересно, может кто-то тоже захочет "почесать руки" в этом направлении. Дальше много букаф, но зато подробно.
Короткая предыстория - на Вега 106 с Unitra G600C все время была небольшая нестабильность скорости - метки шатаются, это вероятнее всего из-за люфта в подшипнике, но они еще и медленно двигались то в одну, то в другую сторону. Попробовал собрать схему https://mysku.club/blog/diy/92517.html с таймером КР1441ВИ1, она завелась, работала постабильнее родной схемы, но все равно присутствовало это движение в разные стороны. Далее предположил, что проблема может быть в том, что стабилизируется скорость вращения вала мотора, а до диска еще идет пассик и вся эта система имеет нестабильное передаточное число. По этому надо попробовать измерять скорость самого диска.
Для этого на диск наклеил 90 неодимовых магнитиков 2мм, в Unitr'у поставил датчик Холла. Магнитики наклеивать удобно - через одну метку для скорости 33, но надо чтобы полюса всех магнитов были одинаково ориентированы. Платка с датчиком крепится через отверстие в столе одним винтом, сам датчик выходит наверх через еще одно отверстие. Датчик нужно ориентировать нужной стороной к магнитикам. Собрал все это, покрутил диск и импульсы пошли. Магнитики взял 2мм как самые маленькие, боялся, что магнит побольше еще "не отпустит" датчик, когда уже придет следующий магнит. Но получилось, что с магнитами 2мм, скважность импульсов не менне 5, т.е. есть запас и лучше ставить 3мм магниты - они посильнее.




Далее была мысль отправить импульсы с датчика на упомянутую схему, частота от 90 магнитов на скорости 33 будет ровно 50 Гц и можно сравнивать ее с частотой переменных 220 В. Но все это вместе не заработало, некое регулирование было, но скорость сильно плавала. Так и не победил это и решил делать ПИД-регулятор на Arduino. Схема на Arduino такая:

Стабилизатор +5В отдельный стандартный на L7805. На транзисторе собран ключ, на вывод D9 Arduino выдает ШИМ, которым регулирует скорость вращения мотора. Резистор R1 необязателен, без него тоже работало, но на скорости 33 коэфф. заполнения ШИМ был примерно 240 из диапазона 0-1023. Чем меньше значение, тем и меньше точность регулирования. По этому поставил R1, с ним ШИМ стал примерно 800 и изменение его на единицу это изменение на примерно 0.125% - точность лучше. R5 позволяет регулировать установленную скорость больше или меньше от 33/45. Кнопки с независимой фиксацией- "старт" включает вращение мотора,"33/45" - выбор скорости (33, если не нажата и 45, если нажата), "авто" отключает задание нужной скорости с помощью переменного резистора R5 (скорости ровно 33 и 45). Светодиод включается, когда переходный процесс закончился и скорость стала стабильна (когда ошибка регулирования меньше порога определенное время). Плату Arduino взял Uno по тому, что она у меня была и у нее кварцевый резонатор, у Nano керамический резонатор с худщей стабильностью. Провода к мотору и датчику Холла заэкранировал. Программу вставлю текстом в самом конце. По программе напишу подробнее, если будет интересно. Фотки Arduino:




В итоге все это заработало. Никаких наводок не появилось. Метки теперь шатаются от люфта, но постоянно ведут себя полностью одинаково, не бегают в разные стороны. Скорость измеряется на самом диске и задается по кварцевому резонатору.
Дальше можно сделать красивые кнопки с подсветкой. Кварцованный стробоскоп тоже можно сделать, но 16-битный таймер на Arduino один и ШИМ мотора придется перенести на другой таймер с меньшей точностью.
Для интереса графики работы:



Ну и программа:
// Переменные
// Номера pin
const int PINres = 0; // A0 Переменный резистор установки скорости
const int PINstart = 2; // D2 Кнопка "Старт"
const int PINspeed = 3; // D3 Кнопка "33/45"
const int PINauto = 4; // D4 Кнопка "Авто"
const int PINled = 5; // D5 Светодиод "Установивщейся режим"
const int PINhall = 8; // D8 Д. Холла
const int PINmotor = 9; // D9 ШИМ на мотор
// Скорость вращения диска
unsigned long T; // Измеренный и усредненный период импульсов д. Холла, Tunknown пока нет результата измерения, 4 мкс
unsigned long Tcur; // Текущий неусредненный период импульсов д. Холла, 4 мкс
const float Terr = -0.2; // Допустиоме отклоненеие текущего периода д. Холла от предыдущего
const int Tnum = 8; // Количество усреднений периода д. Холла
const int Tlog = 3; // log2(Tnum)
const unsigned long Tunknown = 1000000; // Период импульсов д. Холла, пока еще нет результатов измерений, 4 мкс
unsigned long Tarr[Tnum]; // Массив последних Tnum измерений периода д. Холла
int Tindex = 0; // Текущее измерение T в массиве
unsigned long Ttotal; // Сумма последних Tnum измерений периода д. Холла
unsigned int ICR1prev; // Предыдущее значение ICR1
unsigned int Timer1OVFCounter; // Счетчик переполнений Timer 1
unsigned int Timer1OVFCounterTmp; // Счетчик переполнений Timer 1
const int Treslog = 0; // Пределы изменения уставки периода д. Холла переменным резистором. 0 ~ +-10%, 1 ~ +-5%, 2 ~ +-2.5%
// ПИД-регулятор
const unsigned int PIDinterval = 100; // Интервая между выполнениями ПИД-регулятора, ms
unsigned long PIDmillis = 0; // Время последнего выполнения ПИД-регулятора, ms
const unsigned int T33ust = 5000; // Уставка периода д. Холла для скорости 33, 4 мкс
const unsigned int T45ust = 3704; // Уставка периода д. Холла для скорости 45, 4 мкс
unsigned int Tust; // Уставка периода д. Холла текущая, 4 мкс
const float Kp = 1; // Пропорциональный коэффициент
const float Ki = 0.5; // Интегральный коэффициент 0.5
const float Kd = 0; // Дифференциальный коэффициент 0.1
const float Kierr = 1024; // Ошибка, меньше которой начинает работать интегральная составляющая
float Kidiscr;
float Kidiscr1;
float Kddiscr;
float PWM0; // Текущее значение ШИМ
float PWM1; // Предыдущее значение ШИМ
unsigned int PWM; // Значение ШИМ с ограничениями
const unsigned int PWMmin = 0; // Минимальное значение ШИМ
const unsigned int PWMmax = 1023; // Максимальное значение ШИМ
float Err0; // Текущее значение ошибки регулирования
float Err1; // Предыдущее значение ошибки регулирования
float Err2; // Позапрошлое значение ошибки регулирования
// Критерий установивщегося режима
const unsigned int Serr = 100; // Допустимая ошибка периода д. Холла, 4 мкс
const unsigned int Soknum = 50; // Количество последовательных допустимых ошибок до начала установивщегося режима
const unsigned int Serrnum = 1; // Количество последовательных недопустимых ошибок до конца установивщегося режима (+1 от заданного)
unsigned int Sokcnt; // Обратный счетчик последовательных допустимых ошибок
unsigned int Serrcnt; // Обратный счетчик последовательных недопустимых ошибок
void setup() {
Serial.begin(1000000); // Вывод отладки в последовательный порт
// Pins
pinMode (PINstart, INPUT_PULLUP);
pinMode (PINspeed, INPUT_PULLUP);
pinMode (PINauto, INPUT_PULLUP);
pinMode (PINled, OUTPUT);
digitalWrite(PINled, LOW);
pinMode (PINhall, INPUT_PULLUP);
pinMode (PINmotor, OUTPUT);
// Переменные для рассчета периода
for (int index = 0; index < Tnum; index++) {
Tarr[index] = Tunknown;
}
Ttotal = Tunknown << Tlog;
T = Tunknown;
// ПИД-регулятор
Tust = T33ust;
PWM = 0;
Kidiscr = Ki * PIDinterval / 1000;
Kddiscr = Kd * 1000 / PIDinterval;
Err0 = Tunknown - T33ust;
Err1 = Tunknown - T33ust;
Err2 = Tunknown - T33ust;
PWM0 = Kp*Err0;
PWM1 = 0;
// Timer1
TCCR1A = 0;
TCCR1B = 0;
TCCR1A |= (1 << WGM10) | (1 << WGM11); // Fast PWM, 10-bit
TCCR1B |= (1 << WGM12); // Fast PWM, 10-bit
TCCR1A |= (1 << COM1A1); // D9 PWM non-inverting mode
TCCR1B |= (1 << ICNC1); // Noise Canceler
TCCR1B |= (1 << CS10) | (1 << CS11); // clk I/O/64 (from prescaler)
TCNT1 = 0; // Сброс счетчика
Timer1OVFCounter = 0; // Сброс счетчика переполнений
TIMSK1 = (1 << ICIE1) | (1 << TOIE1); // Прерывания по импульсу д. Холла и переполнению
OCR1A = 0;
// Критерий установивщегося режима
Sokcnt = Soknum;
Serrcnt = Serrnum;
}
ISR (TIMER1_CAPT_vect) {
// Прерываение по входу д. Холла
Timer1OVFCounterTmp = Timer1OVFCounter;
// Вычисление текущего периода импульсов д. Холла
Tcur = ((unsigned long)ICR1 | (((unsigned long)Timer1OVFCounterTmp) << 10)) - (unsigned long)ICR1prev;
if (!(Sokcnt == 0 && (((float)Tcur - (float)T)/(float)T <= Terr))) {
// Если в устоявщемся режиме и текущее измерение меньше среднего более, чем на Terr, игнорируем измерение (ложное срабатываение от наводки на д. Холла)
Timer1OVFCounter = 0;
ICR1prev = ICR1;
Ttotal = Ttotal - Tarr[Tindex];
Tarr[Tindex] = Tcur;
Ttotal = Ttotal + Tarr[Tindex];
// Усреднение периода импульсов д. Холла
Tindex++;
if (Tindex >= Tnum) {
Tindex = 0;
}
T = Ttotal >> Tlog;
}
else {
// Игнорируем
Serial.print("Tcur ignored: ");
Serial.print(Tcur);
Serial.println();
}
}
ISR (TIMER1_OVF_vect) {
// Прервывание по переполнению Timer1
Timer1OVFCounter++;
}
void pid() {
// ПИД-регулятор
PWM1 = PWM0;
Err2 = Err1;
Err1 = Err0;
Err0 = (float)T - (float)Tust;
if (abs(Err0) <= Kierr) {Kidiscr1 = Kidiscr;} else {Kidiscr1 = 0;}
PWM0 = PWM1 + Kidiscr1*Err0 + Kp*(Err0 - Err1) + Kddiscr*(Err0 - 2*Err1 + Err2);
}
void loop() {
// Чтение кнопок и переменного резистора
if (digitalRead(PINspeed)) {Tust = T33ust;} else {Tust = T45ust;}
if (digitalRead(PINauto)) {Tust = Tust + (analogRead(PINres) >> Treslog) - (512 >> Treslog);}
// Выполнение ПИД-регулятора с интервалом PIDinterval, если нажата копка "Старт"
if (!digitalRead(PINstart)) {
if (millis() - PIDmillis >= PIDinterval) {
PIDmillis = millis();
pid();
// ограничение и программирование ШИМ
PWM = (unsigned int)constrain(PWM0,PWMmin, PWMmax);
OCR1A = PWM;
// Проверка установивщегося режима
if (abs((int)(Err0)) <= Serr) {
Serrcnt = Serrnum;
if (Sokcnt > 0) {Sokcnt--;}
}
else {
if (Serrcnt > 0) {Serrcnt--;}
else {
Sokcnt = Soknum;
Serrcnt = Serrnum;
}
}
// Включение/выключение светодиода "Установивщейся режим"
if (Sokcnt == 0) {
digitalWrite (PINled, HIGH);
}
else {
digitalWrite (PINled, LOW);
}
// Вывод отладки
Serial.print("Tust:");
Serial.print(Tust);
Serial.print("\tT:");
Serial.print(T);
Serial.print("\tErr0:");
Serial.print(Err0);
Serial.print("\tPWM:");
Serial.print(PWM);
Serial.print("\tSokcnt:");
Serial.print(Sokcnt);
Serial.print("\tSerrcnt:");
Serial.print(Serrcnt);
Serial.println();
}
}
else {
OCR1A = 0;
digitalWrite (PINled, LOW);
Sokcnt = Soknum;
Serrcnt = Serrnum;
}
}
На этом откланиваюсь. Кто дочитал до конца - молодец )
Решил поделиться еще одним вариантом стабилизатора скорости. Может будет интересно, может кто-то тоже захочет "почесать руки" в этом направлении. Дальше много букаф, но зато подробно.
Короткая предыстория - на Вега 106 с Unitra G600C все время была небольшая нестабильность скорости - метки шатаются, это вероятнее всего из-за люфта в подшипнике, но они еще и медленно двигались то в одну, то в другую сторону. Попробовал собрать схему https://mysku.club/blog/diy/92517.html с таймером КР1441ВИ1, она завелась, работала постабильнее родной схемы, но все равно присутствовало это движение в разные стороны. Далее предположил, что проблема может быть в том, что стабилизируется скорость вращения вала мотора, а до диска еще идет пассик и вся эта система имеет нестабильное передаточное число. По этому надо попробовать измерять скорость самого диска.
Для этого на диск наклеил 90 неодимовых магнитиков 2мм, в Unitr'у поставил датчик Холла. Магнитики наклеивать удобно - через одну метку для скорости 33, но надо чтобы полюса всех магнитов были одинаково ориентированы. Платка с датчиком крепится через отверстие в столе одним винтом, сам датчик выходит наверх через еще одно отверстие. Датчик нужно ориентировать нужной стороной к магнитикам. Собрал все это, покрутил диск и импульсы пошли. Магнитики взял 2мм как самые маленькие, боялся, что магнит побольше еще "не отпустит" датчик, когда уже придет следующий магнит. Но получилось, что с магнитами 2мм, скважность импульсов не менне 5, т.е. есть запас и лучше ставить 3мм магниты - они посильнее.
Далее была мысль отправить импульсы с датчика на упомянутую схему, частота от 90 магнитов на скорости 33 будет ровно 50 Гц и можно сравнивать ее с частотой переменных 220 В. Но все это вместе не заработало, некое регулирование было, но скорость сильно плавала. Так и не победил это и решил делать ПИД-регулятор на Arduino. Схема на Arduino такая:
Стабилизатор +5В отдельный стандартный на L7805. На транзисторе собран ключ, на вывод D9 Arduino выдает ШИМ, которым регулирует скорость вращения мотора. Резистор R1 необязателен, без него тоже работало, но на скорости 33 коэфф. заполнения ШИМ был примерно 240 из диапазона 0-1023. Чем меньше значение, тем и меньше точность регулирования. По этому поставил R1, с ним ШИМ стал примерно 800 и изменение его на единицу это изменение на примерно 0.125% - точность лучше. R5 позволяет регулировать установленную скорость больше или меньше от 33/45. Кнопки с независимой фиксацией- "старт" включает вращение мотора,"33/45" - выбор скорости (33, если не нажата и 45, если нажата), "авто" отключает задание нужной скорости с помощью переменного резистора R5 (скорости ровно 33 и 45). Светодиод включается, когда переходный процесс закончился и скорость стала стабильна (когда ошибка регулирования меньше порога определенное время). Плату Arduino взял Uno по тому, что она у меня была и у нее кварцевый резонатор, у Nano керамический резонатор с худщей стабильностью. Провода к мотору и датчику Холла заэкранировал. Программу вставлю текстом в самом конце. По программе напишу подробнее, если будет интересно. Фотки Arduino:
В итоге все это заработало. Никаких наводок не появилось. Метки теперь шатаются от люфта, но постоянно ведут себя полностью одинаково, не бегают в разные стороны. Скорость измеряется на самом диске и задается по кварцевому резонатору.
Дальше можно сделать красивые кнопки с подсветкой. Кварцованный стробоскоп тоже можно сделать, но 16-битный таймер на Arduino один и ШИМ мотора придется перенести на другой таймер с меньшей точностью.
Для интереса графики работы:
Ну и программа:
// Переменные
// Номера pin
const int PINres = 0; // A0 Переменный резистор установки скорости
const int PINstart = 2; // D2 Кнопка "Старт"
const int PINspeed = 3; // D3 Кнопка "33/45"
const int PINauto = 4; // D4 Кнопка "Авто"
const int PINled = 5; // D5 Светодиод "Установивщейся режим"
const int PINhall = 8; // D8 Д. Холла
const int PINmotor = 9; // D9 ШИМ на мотор
// Скорость вращения диска
unsigned long T; // Измеренный и усредненный период импульсов д. Холла, Tunknown пока нет результата измерения, 4 мкс
unsigned long Tcur; // Текущий неусредненный период импульсов д. Холла, 4 мкс
const float Terr = -0.2; // Допустиоме отклоненеие текущего периода д. Холла от предыдущего
const int Tnum = 8; // Количество усреднений периода д. Холла
const int Tlog = 3; // log2(Tnum)
const unsigned long Tunknown = 1000000; // Период импульсов д. Холла, пока еще нет результатов измерений, 4 мкс
unsigned long Tarr[Tnum]; // Массив последних Tnum измерений периода д. Холла
int Tindex = 0; // Текущее измерение T в массиве
unsigned long Ttotal; // Сумма последних Tnum измерений периода д. Холла
unsigned int ICR1prev; // Предыдущее значение ICR1
unsigned int Timer1OVFCounter; // Счетчик переполнений Timer 1
unsigned int Timer1OVFCounterTmp; // Счетчик переполнений Timer 1
const int Treslog = 0; // Пределы изменения уставки периода д. Холла переменным резистором. 0 ~ +-10%, 1 ~ +-5%, 2 ~ +-2.5%
// ПИД-регулятор
const unsigned int PIDinterval = 100; // Интервая между выполнениями ПИД-регулятора, ms
unsigned long PIDmillis = 0; // Время последнего выполнения ПИД-регулятора, ms
const unsigned int T33ust = 5000; // Уставка периода д. Холла для скорости 33, 4 мкс
const unsigned int T45ust = 3704; // Уставка периода д. Холла для скорости 45, 4 мкс
unsigned int Tust; // Уставка периода д. Холла текущая, 4 мкс
const float Kp = 1; // Пропорциональный коэффициент
const float Ki = 0.5; // Интегральный коэффициент 0.5
const float Kd = 0; // Дифференциальный коэффициент 0.1
const float Kierr = 1024; // Ошибка, меньше которой начинает работать интегральная составляющая
float Kidiscr;
float Kidiscr1;
float Kddiscr;
float PWM0; // Текущее значение ШИМ
float PWM1; // Предыдущее значение ШИМ
unsigned int PWM; // Значение ШИМ с ограничениями
const unsigned int PWMmin = 0; // Минимальное значение ШИМ
const unsigned int PWMmax = 1023; // Максимальное значение ШИМ
float Err0; // Текущее значение ошибки регулирования
float Err1; // Предыдущее значение ошибки регулирования
float Err2; // Позапрошлое значение ошибки регулирования
// Критерий установивщегося режима
const unsigned int Serr = 100; // Допустимая ошибка периода д. Холла, 4 мкс
const unsigned int Soknum = 50; // Количество последовательных допустимых ошибок до начала установивщегося режима
const unsigned int Serrnum = 1; // Количество последовательных недопустимых ошибок до конца установивщегося режима (+1 от заданного)
unsigned int Sokcnt; // Обратный счетчик последовательных допустимых ошибок
unsigned int Serrcnt; // Обратный счетчик последовательных недопустимых ошибок
void setup() {
Serial.begin(1000000); // Вывод отладки в последовательный порт
// Pins
pinMode (PINstart, INPUT_PULLUP);
pinMode (PINspeed, INPUT_PULLUP);
pinMode (PINauto, INPUT_PULLUP);
pinMode (PINled, OUTPUT);
digitalWrite(PINled, LOW);
pinMode (PINhall, INPUT_PULLUP);
pinMode (PINmotor, OUTPUT);
// Переменные для рассчета периода
for (int index = 0; index < Tnum; index++) {
Tarr[index] = Tunknown;
}
Ttotal = Tunknown << Tlog;
T = Tunknown;
// ПИД-регулятор
Tust = T33ust;
PWM = 0;
Kidiscr = Ki * PIDinterval / 1000;
Kddiscr = Kd * 1000 / PIDinterval;
Err0 = Tunknown - T33ust;
Err1 = Tunknown - T33ust;
Err2 = Tunknown - T33ust;
PWM0 = Kp*Err0;
PWM1 = 0;
// Timer1
TCCR1A = 0;
TCCR1B = 0;
TCCR1A |= (1 << WGM10) | (1 << WGM11); // Fast PWM, 10-bit
TCCR1B |= (1 << WGM12); // Fast PWM, 10-bit
TCCR1A |= (1 << COM1A1); // D9 PWM non-inverting mode
TCCR1B |= (1 << ICNC1); // Noise Canceler
TCCR1B |= (1 << CS10) | (1 << CS11); // clk I/O/64 (from prescaler)
TCNT1 = 0; // Сброс счетчика
Timer1OVFCounter = 0; // Сброс счетчика переполнений
TIMSK1 = (1 << ICIE1) | (1 << TOIE1); // Прерывания по импульсу д. Холла и переполнению
OCR1A = 0;
// Критерий установивщегося режима
Sokcnt = Soknum;
Serrcnt = Serrnum;
}
ISR (TIMER1_CAPT_vect) {
// Прерываение по входу д. Холла
Timer1OVFCounterTmp = Timer1OVFCounter;
// Вычисление текущего периода импульсов д. Холла
Tcur = ((unsigned long)ICR1 | (((unsigned long)Timer1OVFCounterTmp) << 10)) - (unsigned long)ICR1prev;
if (!(Sokcnt == 0 && (((float)Tcur - (float)T)/(float)T <= Terr))) {
// Если в устоявщемся режиме и текущее измерение меньше среднего более, чем на Terr, игнорируем измерение (ложное срабатываение от наводки на д. Холла)
Timer1OVFCounter = 0;
ICR1prev = ICR1;
Ttotal = Ttotal - Tarr[Tindex];
Tarr[Tindex] = Tcur;
Ttotal = Ttotal + Tarr[Tindex];
// Усреднение периода импульсов д. Холла
Tindex++;
if (Tindex >= Tnum) {
Tindex = 0;
}
T = Ttotal >> Tlog;
}
else {
// Игнорируем
Serial.print("Tcur ignored: ");
Serial.print(Tcur);
Serial.println();
}
}
ISR (TIMER1_OVF_vect) {
// Прервывание по переполнению Timer1
Timer1OVFCounter++;
}
void pid() {
// ПИД-регулятор
PWM1 = PWM0;
Err2 = Err1;
Err1 = Err0;
Err0 = (float)T - (float)Tust;
if (abs(Err0) <= Kierr) {Kidiscr1 = Kidiscr;} else {Kidiscr1 = 0;}
PWM0 = PWM1 + Kidiscr1*Err0 + Kp*(Err0 - Err1) + Kddiscr*(Err0 - 2*Err1 + Err2);
}
void loop() {
// Чтение кнопок и переменного резистора
if (digitalRead(PINspeed)) {Tust = T33ust;} else {Tust = T45ust;}
if (digitalRead(PINauto)) {Tust = Tust + (analogRead(PINres) >> Treslog) - (512 >> Treslog);}
// Выполнение ПИД-регулятора с интервалом PIDinterval, если нажата копка "Старт"
if (!digitalRead(PINstart)) {
if (millis() - PIDmillis >= PIDinterval) {
PIDmillis = millis();
pid();
// ограничение и программирование ШИМ
PWM = (unsigned int)constrain(PWM0,PWMmin, PWMmax);
OCR1A = PWM;
// Проверка установивщегося режима
if (abs((int)(Err0)) <= Serr) {
Serrcnt = Serrnum;
if (Sokcnt > 0) {Sokcnt--;}
}
else {
if (Serrcnt > 0) {Serrcnt--;}
else {
Sokcnt = Soknum;
Serrcnt = Serrnum;
}
}
// Включение/выключение светодиода "Установивщейся режим"
if (Sokcnt == 0) {
digitalWrite (PINled, HIGH);
}
else {
digitalWrite (PINled, LOW);
}
// Вывод отладки
Serial.print("Tust:");
Serial.print(Tust);
Serial.print("\tT:");
Serial.print(T);
Serial.print("\tErr0:");
Serial.print(Err0);
Serial.print("\tPWM:");
Serial.print(PWM);
Serial.print("\tSokcnt:");
Serial.print(Sokcnt);
Serial.print("\tSerrcnt:");
Serial.print(Serrcnt);
Serial.println();
}
}
else {
OCR1A = 0;
digitalWrite (PINled, LOW);
Sokcnt = Soknum;
Serrcnt = Serrnum;
}
}
На этом откланиваюсь. Кто дочитал до конца - молодец )
