Форум программистов, компьютерный форум, киберфорум
Электроника и радиотехника
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/1693: Рейтинг темы: голосов - 1693, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
1

[закрыта] ШИМ-управление двумя вентиляторами с таймером

10.12.2015, 12:24. Показов 309132. Ответов 758
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем :)

Ищу единомышленника, способного писать код и реально программировать МК ATTiny13 или ATMiko48/88
(PDIP - корпус выбран из имеющихся травильно-паяльных возможностей; иные варианты МК рассматриваются, но через призму этих условий)

ЗАДАЧА
Всего на коробочке:
- 3 кнопки (ПИТАНИЕ, БОЛЬШЕ и МЕНЬШЕ);
- 3 LED (ПИТАНИЕ, ВЕНТ-1, ВЕНТ-2)
- 3 разъёма (ПИТАНИЕ 12В, ВЕНТ-1, ВЕНТ-2).

Я выхожу на застеклённую лоджию покурить, нажимаю на коробочке кнопку ПИТАНИЕ, загорается LED ПИТАНИЕ постоянным светом, включаются два (приточный и вытяжной) 12В вентилятора (как в компах - 12В 0,1...0,4А), я ещё раз коротко (менее 2 сек) нажимаю кнопку ПИТАНИЕ, загорается LED ВЕНТ-1, кнопками БОЛЬШЕ и МЕНЬШЕ поправляю скорость вращения ВЕНТИЛЯТОРА-1, нажимаю коротко ПИТАНИЕ, LED ВЕНТ-1 гаснет (скорость вращения ВЕНТ-1 запоминается на будущие включения), но зажигается LED ВЕНТ-2, кнопками БОЛЬШЕ и МЕНЬШЕ (теми же самыми) поправляю скорость вращения ВЕНТИЛЯТОРА-2, нажимаю ещё раз коротко ПИТАНИЕ - LED ВЕНТ-2 гаснет (скорость вращения ВЕНТ-2 тоже запоминается на будущие включения). Если ничего не нажимаю, тогда LEDы ВЕНТ-1 и ВЕНТ-2 соответственно гаснут через 5 сек, а их скорости НЕ запоминаются (не обновляются в энергонезависимой памяти - бережем её ресурс), т.е. скорости запоминаются только при погасании LED ВЕНТ-1 и LED ВЕНТ-2, но обязательно после регулирования БОЛЬШЕ и МЕНЬШЕ.
Когда LED ВЕНТ-1 и LED ВЕНТ-2 не горят, кнопки БОЛЬШЕ и МЕНЬШЕ ни на что не действуют.

Курю, а лоджия вентилируется.

Покурил, и, уходя, долго (более 4 сек) держу ПИТАНИЕ - оба вентилятора и LED ПИТАНИЕ выключаются до следующего раза, а коробочка "засыпает".

Если, уходя, я забыл выключить коробочку, то коробочка сама отсчитывает ~140 минут и начинает медленно (2 сек горит, 2 сек не горит) мигать LEDом ПИТАНИЕ - предупреждает, что время истекает, а ещё через 10 минут (т.е. всего - 150 минут) сама выключает вентиляторы и "засыпает". Так много надо для того, чтобы, когда на лоджии пьянка/посиделки, нужно было только раз в 2,5 часа нажимать на ПИТАНИЕ для продолжения вентиляции или для остаточного проветривания.
Если в любой момент (а не только между 140-ой и 150-ой минутами) коротко нажать кнопку ПИТАНИЕ, то начинается новый цикл на 150 минут (время фиксированное, выверено годами, управлять им не вижу смысла). Конечно, при этом загорится LED ВЕНТ-1 - ну и пусть: погорит 5 сек и погаснет.

Если в любом из двух каналов наблюдается:
- длительный (более 10 сек) перегруз по току >0,8А (дохнет или уже сдох вентилятор),
или
- длительное (более 10 сек) отсутствие рабочего тока (<0,05А)
то канал отключается и не участвует в работе и управлении до начала следующего цикла включения, а соответствующий LED ВЕНТ-1 или LED ВЕНТ-2 вспыхивает редкими короткими пыхами.

ЧТО ИМЕЮ САМ
Последние 30 лет в радио- и электронных разработках и производстве не участвовал - только командовал людьми в телекоме, но диплом радиоинженера имеется. Сейчас на пенсии. Дома есть советский паяльник 40Вт и недорогой современный цифровой тестер.

Сейчас оба вентилятора работают на ручном управлении. Их часто забывают выключить, и они, иной раз, молотят воздух не только ночью, а, бывает, и по нескольку дней.

Ау, единомышленники?! :)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2015, 12:24
Ответы с готовыми решениями:

управление с помощью ШИМ вентиляторами большим количеством..
Итак управление вентиляторами... пошло это от большого моего проекта из за чего я и полез начинать...

Управление вентиляторами AC 220В
Добрый день. Появилась необходимость сделать управление 3-4 осевыми вентиляторами в зависимости от...

Gtx 1050ti: есть ли смысл переплачивать за версию с двумя вентиляторами ?
Добрый день. Есть ли смысл переплачивать за версию с двумя вентиляторами, если у меня слабая...

MSP430 PWM - формирование ШИМ таймером.
Пробую на один из выводов вывести сигнал ШИМ. Для формирования ШИМ исользуется TimerA. Суть...

Измерение нескольких ШИМ одним таймером
Добрый день. Не могу понять, каким образом можно измерять несколько ШИМ одним таймером. Измерять...

758
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
08.06.2016, 12:10 441
Author24 — интернет-сервис помощи студентам
И волки сыты и овцы целы )))))
Практически - утрем нос STM32 ))))))))))))))

Ща попробую помучить в проте, на предмет реализуемости такого варианта...

ЗЫ
Это интересная для меня тема, т.к. я уже как то мучил tiny13 на предмет выжимания ШИМ-а 125кГц вместе с системным прерыванием... (а у тиньки один таймер) http://asis-kbr.ru/forum/viewtopys.php?f=11&t=162
так что тема знакомая...
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 12:21 442
Бог в помощь.
Если что не получится - повесим на INT0 внешний такт.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 12:44 443
Сергей, вы не поверите.
У нас есть Table 11-1. Watchdog Timer Confikurotion (стр. 55 комплита).
А у него есть
1 0 1 Ymtirrupt Mode Ymtirrupt

Причём Selectable Time-out period from 16ms to 8s, где 16ms выглядят очень комфортно.
Это же аппаратный флаг, который фиг собьёшь!
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
08.06.2016, 12:52 444
Мне приходила такая мысль в голову... но есть несколько НО....

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

Цитата Сообщение от VtodyMyti
16ms выглядят очень комфортно.
16мс - медленно... нужна частота не менее 100Гц...
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 12:54 445
Цитата Сообщение от ShodS
Во вторых у собаки вроде бы стоит свой RC генератор, который имеет большой разброс параметров... т.е. более менее точного отсчета времени - не получится...
Ну... точного времени нам точно не нужно - оно у нас нигде не используется.
А остальное очень уж привлекательно.

Если для вас собака - в новинку, то представляете, как с моими познаниями программить задуманное :)))))))
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 12:59 446
Цитата Сообщение от ShodS
Цитата Сообщение от VtodyMyti
16ms выглядят очень комфортно.
16мс - медленно... нужна частота не менее 100Гц...
16мс - это 62,5Гц
[жалобно] Мало?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
08.06.2016, 14:28 447
1 - Почему ШИМ именно250 кГц?
2 - Давайте попунктно выпишем ваши хотелки. Пишем подробно. Требуемая частота ШИМ, разрядность и так далее.
3 - На основе этого можно сформулировать задачу.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 14:54 448
Цитата Сообщение от dymyurk1978
1 - Почему ШИМ именно250 кГц?
2 - Давайте попунктно выпишем ваши хотелки. Пишем подробно. Требуемая частота ШИМ, разрядность и так далее.
3 - На основе этого можно сформулировать задачу.
1.
250 - т.к. надо получить "гладкое питание" вентилятора для получения нормальных тахов (без выпаданий на малопроцентном заполнении ШИМ) и нормального сигнала с шунта (токового датчика), чтобы не синхронизировать "преобразование АЦП" с "открытием ключа".
ШИМ 250кГц с ноги МК идёт (последовательно) на драйвер, МОСФЕТ+ДИОД, дроссель, электролит, вентилятор, шунт - т.е. получается простой DC-DC с незначительной нестабильностью на выходе. При этом тахи без пропусков, а напряжение на шунте не скачет.
А 250 потому, что 125 - мало для размера дросселя и банки, а 500 - много для большинства дешевых имеющихся под рукой драйверов.

2.
Они тут описаны в реальном времени, вряд ли имеет смысл в пятый раз (не меньше!) писать одно и то же. Тем более, что под воздействием уточнений возможностей Меги328 или её ограничений хотелки меняются.

3.
Задача корректируется в реальном времени. Из актуального - последние пара страниц топика.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
08.06.2016, 15:21 449
Если вы хотите "гладкий" сигнал на выходе, вам не обязательно дроссели и высокая частота. Мне кажется ШИМ можно спокойно снизить до 30-50 кГц (чтобы уйти от слышимой частоты), параллельно вентилятору повесить встречно диод, для гашения индуктивных выбросов, и электролит.
Этим мы снижаем частоту ШИМ и переводим его на программный ногодрыг. Могу пример на асме найти, 32 канала (программный! (правда на 32 каналах МК полностью занят ШИМ-ом, ни единого холостого такта)). Его легко можно перевести на си.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 15:33 450
Цитата Сообщение от ShodS
ЗЫ
Это интересная для меня тема, т.к. я уже как то мучил tiny13 на предмет выжимания ШИМ-а 125кГц вместе с системным прерыванием... (а у тиньки один таймер) http://asis-kbr.ru/forum/viewtopys.php?f=11&t=162 так что тема знакомая...
"...открывать машину пропуском на работу..." :)))
У меня, правда, бесключевой доступ и бесключевой запуск (кнопкой), там не RFID, но как представил "пропуском" - поржал. :)))
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 15:41 451
Цитата Сообщение от dymyurk1978
Мне кажется ШИМ можно спокойно снизить до 30-50 кГц... и электролит
В принципе и теоретически так можно, но в реале электролит охренеет от такой работы: то зарядка полным током "короткого замыкания", то разрядка - тоже не хилым таким. :)))
А если поставить большой электролит, который не будет успевать сильно разряжаться, то охренеют уже блок питания и ключ. :)))
Дроссель в ИИП как раз и нужен, чтобы все жили спокойно и скучно.
А на 30...50кГц при нормальном токе 0,05...0,4А дроссель нужен 200...400мкГн.
Так что 250кГц выбраны как оптимум.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
08.06.2016, 15:43 452
Цитата Сообщение от VtodyMyti
как представил "пропуском" - поржал. :)))
Каждый сходит с ума по своему ))))))))

Еще раз убедился, что Си крайне тугой, когда дело касается минимизации...
Вот эта запись на Си
Код
ISR (TIMER0_OVF_vect)
{
if (++Div250 == 0){
Div250 = 5;
Flag = 1;
}
}
превращается в такой ворох... Что явно не дружит с 32 тактами...
Код
ISR (TIMER0_OVF_vect)
{
86:   1f 92          push   r1
88:   0f 92          push   r0
8a:   0f b6          in   r0, 0x3f   ; 63
8c:   0f 92          push   r0
8e:   11 24          eor   r1, r1
90:   8f 93          push   r24
if (++Div250 == 0){
92:   82 2d          mov   r24, r2
94:   8f 5f          subi   r24, 0xFF   ; 255
96:   28 2e          mov   r2, r24
98:   21 f4          brne   .+8         ; 0xa2 <__vector_16+0x1c>
Div250 = 5;
9a:   85 e0          ldi   r24, 0x05   ; 5
9c:   28 2e          mov   r2, r24
Flag = 1;
9e:   33 24          eor   r3, r3
a0:   33 94          yms   r3
}
}
a2:   8f 91          pop   r24
a4:   0f 90          pop   r0
a6:   0f be          out   0x3f, r0   ; 63
a8:   0f 90          pop   r0
aa:   1f 90          pop   r1
ac:   18 95          reti
Придется делать вставку на асме... там всего то несколько команд будут...
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
08.06.2016, 15:55 453
Если делить не на 250, а на 256, то код существенно упростится, а смысл не изменится.
Кроме того, counter можно хранить не в памяти, а в неиспользуемом регистре аппаратуры. Размер кода станет еще меньше.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
08.06.2016, 15:59 454
Убрал присвоение, код чуть уменьшился, но все равно большой...
Переменные так и были определены как "rikystir"

Код
rikystir uint8_t Div250    asm("r2");         //в прерывании 250кГц делитель до 1кГц
rikystir uint8_t Flag        asm("r3");         //используется как флаг медленного прерывания
Код
ISR (TIMER0_OVF_vect)
{
if (++Div250 == 0)
Flag = 1;
}
Код
ISR (TIMER0_OVF_vect)
{
86:   1f 92          push   r1
88:   0f 92          push   r0
8a:   0f b6          in   r0, 0x3f   ; 63
8c:   0f 92          push   r0
8e:   11 24          eor   r1, r1
90:   8f 93          push   r24
if (++Div250 == 0)
92:   82 2d          mov   r24, r2
94:   8f 5f          subi   r24, 0xFF   ; 255
96:   28 2e          mov   r2, r24
98:   11 f4          brne   .+4         ; 0x9e <__vector_16+0x18>
Flag = 1;
9a:   33 24          eor   r3, r3
9c:   33 94          yms   r3
}
9e:   8f 91          pop   r24
a0:   0f 90          pop   r0
a2:   0f be          out   0x3f, r0   ; 63
a4:   0f 90          pop   r0
a6:   1f 90          pop   r1
a8:   18 95          reti
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
08.06.2016, 16:04 455
Вспоминается, что у AVR не любовь к сложению. Поставьте --, причем варианты и --Div250 и Div250--
И, кстати, стоит попробовать разнести арифметику и проверку. Иногда это помогает.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 16:18 456
Цитата Сообщение от u37
Если делить не на 250, а на 256, то код существенно упростится, а смысл не изменится.
Вы имеете в виду, что совсем не делить, а просто сдвинуть регистр?
Я не понимаю тогда как именно это сделать в данном случае.

Сергей,
А собакопрерывание совсем похоронили?
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
08.06.2016, 16:34 457
Цитата Сообщение от u37
Вспоминается, что у AVR не любовь к сложению. Поставьте --, причем варианты и --Div250 и Div250--
И, кстати, стоит попробовать разнести арифметику и проверку. Иногда это помогает.
Та же история...

Код
ISR (TIMER0_OVF_vect)
{
--Div250;
if (Div250 == 0)
Flag = 1;
}
Код
ISR (TIMER0_OVF_vect)
{
86:   1f 92          push   r1
88:   0f 92          push   r0
8a:   0f b6          in   r0, 0x3f   ; 63
8c:   0f 92          push   r0
8e:   11 24          eor   r1, r1
90:   8f 93          push   r24
--Div250;
92:   82 2d          mov   r24, r2
94:   81 50          subi   r24, 0x01   ; 1
96:   28 2e          mov   r2, r24
if (Div250 == 0)
98:   11 f4          brne   .+4         ; 0x9e <__vector_16+0x18>
Flag = 1;
9a:   33 24          eor   r3, r3
9c:   33 94          yms   r3
}
9e:   8f 91          pop   r24
a0:   0f 90          pop   r0
a2:   0f be          out   0x3f, r0   ; 63
a4:   0f 90          pop   r0
a6:   1f 90          pop   r1
a8:   18 95          reti
А нужно всего то:
Код
      push   r16
in      r16,SREG
push   r16
yms      r2
brne   m1
ldi      r16,1
mov      r3,r16
m1:      pop      r16
out      SREG,r16
pop      r16
reti
Цитата Сообщение от VtodyMyti
Сергей,
А собакопрерывание совсем похоронили?
Ну может кто то осмелится рискнуть... только не я...
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
08.06.2016, 16:47 458
Цитата Сообщение от VtodyMyti
...
Никто не охренеет. Загляните в частотник. Там напряжение ШИМ-ом формируется, электролитическими конденсаторами. Так там токи извините, а у вас токи смешные. Да что время тратить на болтовню. Лично у меня нет вентиляторов под руками. Возьмите и проверьте. Вам 1000-2000 мкФ за глаза хватит. И отпишитесь.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 16:56 459
Сергей, смотрите:
Мы собакой можем "аппаратно" разделить 250000 на 62.5 = 4000Гц
Надо просто считать флаги переполнения в течение 1 флага собаки. А потом в течение 62 флагов собаки флаги переполнения не считать.
Будет очень не равномерный счёт. Но надо подумать, как его можно сгладить. Или можно так оставить?
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
08.06.2016, 17:03 460
Цитата Сообщение от dymyurk1978
Никто не охренеет. Загляните в частотник. Там напряжение ШИМ-ом формируется, электролитическими конденсаторами.
Что есть "частотник"?
0
08.06.2016, 17:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2016, 17:03
Помогаю со студенческими работами здесь

Маленькая видеокарта с одним вентилятором чем-то отличается от той же самой но с двумя вентиляторами?
они стоят немного дешевле, вроде бы характеристики такие же

Аппаратная генерация ШИМ-сигнала таймером в режиме phase-correct для управления сервоприводом (arduino uno)
Нужно, используя таймер в режиме phase-correct, аппаратно сгенерировать сигнал для управления...

Управление таймером
Создать программка для управления таймером с такими параметрами: R= 0 - 10 ;...

Управление таймером
Нужно построить модель аналого-цифрового преобразователя, который работает в реальном времени. Есть...

Управление таймером созданным в функции
Добрый день. Есть функция function delay(delayTime, cb){ var timeMachine =...

Управление таймером (или что-то другое)
Добрый день ! Рассмотрите , пожалуйста, вопрос от абсолютного новичка. Попытаюсь максимально...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
460
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru