0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
|
|
1 | |
[закрыта] ШИМ-управление двумя вентиляторами с таймером10.12.2015, 12:24. Показов 309132. Ответов 758
Метки нет (Все метки)
Привет всем :)
Ищу единомышленника, способного писать код и реально программировать МК 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
|
10.12.2015, 12:24 | |
Ответы с готовыми решениями:
758
управление с помощью ШИМ вентиляторами большим количеством.. Управление вентиляторами AC 220В Gtx 1050ti: есть ли смысл переплачивать за версию с двумя вентиляторами ? MSP430 PWM - формирование ШИМ таймером. Измерение нескольких ШИМ одним таймером |
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
08.06.2016, 12:10 | 441 |
И волки сыты и овцы целы )))))
Практически - утрем нос 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
0
|
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
|
|
08.06.2016, 12:54 | 445 |
Сообщение от ShodS
А остальное очень уж привлекательно. Если для вас собака - в новинку, то представляете, как с моими познаниями программить задуманное :)))))))
0
|
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
|
|
08.06.2016, 12:59 | 446 |
Сообщение от ShodS
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
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
У меня, правда, бесключевой доступ и бесключевой запуск (кнопкой), там не RFID, но как представил "пропуском" - поржал. :)))
0
|
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
|
|
08.06.2016, 15:41 | 451 |
Сообщение от dymyurk1978
А если поставить большой электролит, который не будет успевать сильно разряжаться, то охренеют уже блок питания и ключ. :))) Дроссель в ИИП как раз и нужен, чтобы все жили спокойно и скучно. А на 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; } } Код
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
Я не понимаю тогда как именно это сделать в данном случае. Сергей, А собакопрерывание совсем похоронили?
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
08.06.2016, 16:34 | 457 |
Сообщение от u37
Код
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
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 | |
08.06.2016, 17:03 | |
Помогаю со студенческими работами здесь
460
Маленькая видеокарта с одним вентилятором чем-то отличается от той же самой но с двумя вентиляторами? Аппаратная генерация ШИМ-сигнала таймером в режиме phase-correct для управления сервоприводом (arduino uno) Управление таймером Управление таймером Управление таймером созданным в функции Управление таймером (или что-то другое) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |