Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Category:

Контроллер кулеров

Пофиксил кое-какие баги (одним из основных был неправильный поиск дихотомией по таблице узлов для кусочно-линейной аппроксимации) и испытал феном жены новую железяку:

Исходники здесь, там же схема и разведенная плата. Только надо учесть мой косяк, о котором я уже писал: нельзя у 4-проводного вентилятора отключать "землю": в этом случае +12В через p-n переход (как оказалось) биполярного транзистора, играющего роль ключа, попадают на вход МК… Либо управлять верхним ключом (т.е. добавлять еще и p-канальный мосфет), либо ставить на входы стабилитроны (как я, собственно, и нарукожопил).

Вкратце - о функционале. Просто приведу здесь Readme.md (который мне лень было на английский переводить, поэтому он пока что на русском).
Функционал:
  • Четыре канала измерения температуры с точностью +-1degrC (три канала управляют активностью кулеров, четвертый - для общего отключения питания в случае достижения критической температуры).

  • Два канала управления четырехпроводными кулерами с контролем их активности.

  • Две кнопки управления (включить/экстренно выключить нагрузку).

  • Внешний сигнал (пищалка 12В): короткий сигнал раз в 10 секунд - один из кулеров не вращается (а должен), непрерывные сигналы - критическая ситуация, питание скоро будет отключено, (сигналы в течение 4с с паузой в 6с - резерв).

  • Режим ручного управления (без контроля температур с соответствующими действиями) или мониторинга (в этом режиме нельзя вручную задавать параметры кулера или внешнего сигнала).


Сводка команд:
'0x' - turn cooler0 on/off (x=1/0) or get status (x - any other)
'1x' - turn cooler1 on/off (x=1/0) or get status (x - any other)
'Ax' - get ADC raw value (x=0..7)
'B' - buttons' state
'bx' - buzzer: x==0 - off, x==1 - on, x==l - long beeps, x==s - short beeps
'Cx' - get cooler x (0/1) RPS
'D' - activate DFU mode
'E' - show current state
'Gx' - get cooler x (0..3) PWM settings
'M' - get MCU temperature
'm' - toggle monitoring
'R' - software reset
'rx' - relay on/off (x=1/0) or get status
'Sx y' - set coolerx PWM to y
's' - show settings
'T' - get time from start (ms)
'tx' - get temperature x (0..3)
'V' - get voltage
'Z' - reinit ADC
'!' - switch between manual and automatic modes

0x,1x

x=='0' - выключить питание кулера; x=='1' - включить питание; любое другое значение - проверить состояние.

Ax

x=={0..7} - получить "сырое значение" x-го канала АЦП (в ADU).
Каналы: 0..3 - термометры, 4 - измерение 12В, 5 - измерение 5В, 6 - температура МК, 7 - уровень 3.3В.

B

Состояние обеих кнопок, например:
BUTTON0=0
BUTTON1=0
Нажатие кнопок проверяется один раз в секунду. Кнопка BUTTON0 переводит систему в автоматический режим и включает реле. Кнопка BUTTON1 отключает реле, отключает все кулеры и сигнал и переводит систему в ручной режим.

bx

Изменить состояние внешнего сигнала. 0 - выключить, 1 - включить серию непрерывных сигналов, l - включить серию коротких сигналов в течение 4 секунд с паузой в 6 секунд, s - включить короткий сигнал (0.5с) с паузой 9.5с.

Cx

Получить значения скорости вращения четырехпроводного кулера (обороты в секунду). Например:
C0
RPM0=78
C1
RPM1=0

D

Активировать режим DFU для перепрошивки. После прошивки нужно перезапустить МК, закоротив контакты "reset" или кратковременно отключив от питания.

E

Отобразить текущее состояние системы, например:
TIME=1229247
T0=293
T1=264
T2=262
T3=254
BUZZER=OFF
BUTTON0=0
BUTTON1=0
RPS0=82
RPS1=107
PWM0=30
PWM1=40
PWM2=33
COOLER0=1
COOLER1=1
RELAY=1

Где
TIME - время с момента включения (мс, приблизительно);
Tx - температуры (x10) соответствующих каналов в градусах Цельсия;
BUZZER - состояние сигнала;
BUTTONx - состояние кнопок (1 - нажата, 0 - отпущена);
RPSx - скорость вращения кулера x (оборотов в секунду);
PWMx - установленное значение ШИМ (в процентах, 0..100) канала x;
COOLERx - включено ли питание кулера x (0..1), из-за неправильной схемотехники не рекомендуется отключать питание четырехпроводных кулеров (+12В поступает в этом случае на измерительный вход);
RELAY - состояние реле (1 - включено, 0 - выключено).

Gx

Отобразить значения настройки ШИМ кулера x.

M

Отобразить температуру МК (приближенная температура, x10 градусов Цельсия).

m

Переключить (вкл/выкл) режим мониторинга, когда каждые 5 секунд отображается состояние системы.

R

Программный перезапуск системы.

rx

x==0 - выключить реле, x==1 - включить реле, любое другое значение - получить состояние реле.

Sx y

Установить значение заполнения ШИМ кулера x (0..2) в y (0..100). Согласно опыту, четырехпроводные кулеры не стартуют при значении PWM<15, а двухпроводные не стартуют при PWM<35, поэтому для получения малых оборотов необходимо стартовать на большей скорости, а затем уже установить нужное значение заполнения ШИМ.

s

Отобразить "вшитые" в код настройки, например:
Thysteresis=30
Tmin={400, 350, 350}
Tmax={900, 800, 600}
T3max=850

В данном случае гистерезис температуры установлен в 3℃, область допустимых значений температур - 40..90℃ для канала 0, 35..80℃ для канала 1 и 35..60℃ для канала 2. Критическая температура канала 3 установлена в 85℃. Если в течение 20 секунд превышено значение одной из критических температур (для T0..2 они равны Tmax+Thysteresis), то реле отключается, система остается в автоматическом режиме.

T

Отобразить время (условное) в миллисекундах со старта.

tx

Получить значение температуры x-го канала (0..3). Температура умножена на 10. Например:
t0
T0=294
t1
T1=265
t2
T2=264
t3
T3=256

Соответственно, температуры равны: t0=29.4, t1=26.5, t2=26.4 и t3=25.6°C.
Учитывая то, что величина вычисляется кусочно-линейной аппроксимацией с погрешностью до 0.1℃, а сами NTC дают разброс не лучше ±0.5℃, не стоит надеяться на то, что температуры будут достаточно точными.

V

Получить значения напряжения (x100) в каналах, например:
V3_3=330
V5=428
V12=1055

Означает, что питание МК =3.3В, на входе 5В присутствует 4.28В, а на входе 12В присутствует 10.55В. (в данном случае заниженные уровни на 5 и 12В возникли из-за слишком высоких сопротивлений резисторов в этих каналах, в результате чего предохранительный стабилитрон "сожрал" слишком много).

Z

Реинициализация АЦП (ХЗ, зачем я это добавил).

!

Переключение между автоматическим и ручным режимами управления.

В общем, релюшкой щелкает, весело крутит кулеры при нагреве термодатчиков феном, при превышении температуры пищит и выключает (через 20с) релюшку.
Вот только забыл я добавить хотя бы один-два светодиодных индикатора. Можно было бы по крайней мере одним показывать, что система нормально работает в автоматическом режиме (а не тупит в ручном), а вторым — что релюшка замкнута и нагрузка под напряжением.
Tags: stm32, железяки
Subscribe

  • И еще ремонты

    Больше месяца назад пыталась жена в очередной раз сдать зеленчукскую квартиру. Но вменяемых желающих не появилось (зато постоянно доставали лица…

  • Опять в генте что-то поломали

    Обновил вчера домашнюю систему. Давно не обновлял: больше 250 пакетов в списке было. А после обновления обнаружил, что в консоли кириллица есть, а в…

  • "Тетрис" и "змейка"

    Дорисовал заглавные буквы в шрифте в 8 пикселей высотой и можно сказать закончил "змейку" (видео) и тетрис (видео). Код на гитхабе. Все-таки,…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments