Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Регулятор яркости лампы накаливания
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
LexRoss
Переменка 3 вольта заведена на компаратор, он дает прерывание по каждому переходу через 0. В прерывании включаю ногу на несколько миллисекунд, затем отключаю. Так каждый полупериод. Нога подключена к управляющему выводу тиристора КУ202.
В cvavr написал цикл с увеличением задержки. Вроде бы лампочка должна медленно загораться и гаснуть, а она просто моргает.
Из-за чего? Может быть, тиристор не тот, и нужно поставить что-то типа BT137?
DpInRock
Несколько миллисекунд - это сколько? Полпериода - всего 10 мс.

Чтобы плавно гасла-загоралась надо менять задержку включения с дискретй 40 МИКРОсекунд. (Можно и больше, но смотря что понимать под понятием "плавно").

"Нога" должна включаться не на несколько миллисекунд, а где-нибудь на 100 микросекунд. Можно меньше, если лампочка достаточной мощности.

BT137 не тиристор.
Herz
Цитата(LexRoss @ Jul 21 2009, 17:31) *
Переменка 3 вольта заведена на компаратор, он дает прерывание по каждому переходу через 0. В прерывании включаю ногу на несколько миллисекунд, затем отключаю. Так каждый полупериод. Нога подключена к управляющему выводу тиристора КУ202.
В cvavr написал цикл с увеличением задержки. Вроде бы лампочка должна медленно загораться и гаснуть, а она просто моргает.
Из-за чего? Может быть, тиристор не тот, и нужно поставить что-то типа BT137?

Вот тиристор и включается в начале каждого полупериода, а выключается в конце, когда ток через него спадёт до нуля. Чтобы регулировать яркость, нужно подавать импульс включения с задержкой относительно перехода через ноль. Тогда, чем больше задержка - тем короче время включенного состояния и тем меньше яркость.
LexRoss
DpInRock, все так и есть, как Вы сказали. Шаг 2 микросек, меняется от 0 до 10000 мкс примерно за 3 сек. Я думаю достаточно для плавности. smile.gif

Вот такой код

interrupt [ANA_COMP] void ana_comp_isr(void)
{

i++;
k=i;
PORTD.0 = 1;
while (k>0) {
k--;
delay_us(2);
}
PORTD.0 = 0;

if (i>500) {
i = i-500;
}


}

Может быть криво (первый раз пишу на си), но осциллограф на PD0 показывает, что все работает.
BT137 симистор.

Может напряжение маловато? Сейчас экспериментирую с лампочкой на 12В.

Herz, т.е. так?
rezident
Во-первых, с помощью тиристора можно коммутировать только одну фазу переменки. Для коммутации переменки в обеих фазах нужно включить его через выпрямительный диодный мост. Для коммутации переменки применяются симмисторы (симметричные тиристоры, триаки), но для управления ими нужно подавать импульсы с полярностью, соответствующей фазе напряжения питания. Управлять симмистором прямо от пина МК несколько затруднительно. Поэтому для управления симмисторами обычно применяют оптоизоляторы или импульсные трансформаторы.
Во-вторых, у тиристора есть такой параметр, как минимальный ток удержания. Если к концу управляющего импульса ток тиристора (и нагрузки) не достигнет величины минимального тока удержания, то тиристор закроется сразу после окончания управляющего импульса. Сравните минимальный ток удержания для используемого тиристора и ток нагрузки в конце вашего миллисекундного управляющего импульса.
Рекомендую почитать "Тиристоры и симмисторы - десять золотых правил для успешного применения" в оригинале или в некотором переводе на русский.
DpInRock
Есть такой параметр - ток защелкивания тиристора. Это раз. (Маленькое напряжение - маленький (возможно) ток.

В прерывании какая-то фигня написана. Импульс запуска симистора должен быть фиксированной длины. 100 микросекунд. (Это необязательно, конечно, но лучше сразу так сделать, для краткости дальнейших объяснений).
А вот фаза запуска - должна быть разной...


По жизни должно быть так.
В копмараторе у вас должен устанавливаться (корректироваться) таймер фазовой задержки.

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

А в идеале - посмотрите работу таймеров в режиме PWM. C помощью этого можно сделать диммер без особых программных кодов. Все будет делаться автматически.
Herz
Цитата(LexRoss @ Jul 21 2009, 18:14) *
Herz, т.е. так?

Совершенно верно. Остальное Вам уже разьяснили.
LexRoss
Кое-что получилось.

interrupt [ANA_COMP] void ana_comp_isr(void)
{
delay_ms(5);
PORTD.0 = 1;
delay_us(100);
PORTD.0 = 0;
}

Зажигаю вполнакала (с пятой милисекунды).
Лампа горит так, как задаю задержкой, но она моргает случайным образом через 0,5-1 сек
Vishv
Возможно у Вас просто "грязная" сеть и соответственно в некоторые моменты времени компаратор отрабатывает раньше или позже желаемого.
Кроме того 3 В переменки маловато - переход через 0 нечеткий, особенно если у Вас компаратор без гистерезиса.
Я в этих случаях беру сигнал для формирования прерываний сразу после выпрямителя, но при этом необходим дополнительный развязывающий диод перед входным фильтром.
LexRoss
добавил до 5в на вход компаратора, заработало!
Подскажите еще как правильно сделать цикл, чтобы задержка менялась?
Vishv
Попробуйте такой вариант:
interrupt [ANA_COMP] void ana_comp_isr(void)
{
static int i,k;
i++;
if(i>100)
{
k++;
i=0;
if(k>9) k=0;
}

delay_ms(k);
PORTD.0 = 1;
delay_us(100);
PORTD.0 = 0;
}
По идее должно работать так - загорается в полный накал и потом гаснет ступенями по 10% в течении 10 сек.
LexRoss
Vishv, я что-то подобное пробовал, ошибку пишет, что delay_ms(k), k должна быть константа.
Сейчас вот так работает:

unsigned int k=0, p=0, i=0;
interrupt [ANA_COMP] void ana_comp_isr(void)
{
p++;

if (p==5) {
i++;
p=p-5;
}

k=i;

while (k>0) {
k--;
delay_us(2);
}
PORTD.0 = 1;
delay_us(100);
PORTD.0 = 0;

if (i>700) {
i = i-700;
}
}
rezident
Не нужно никаких delay_ms() Тем более в прерывании. В прерывании компаратора нужно лишь установить новое значение для таймера, который аппаратно генерирует сигнал ШИМ, который в свою очередь управляет симмистором.
Vishv
"Не нужно никаких delay_ms() Тем более в прерывании" - утверждение абсолютно правильное, в том случае, если процессор делает еще что-нибудь.
Ну а тут, как я понял, ему больше ничего и делать не надо.
Я просто не знаю уровень Ваших, уважаемый LexRoss, знаний (sorry!) про потроха процессора и степень его (процессора) загруженности,
поэтому и привел простейший вариант (увы неработоспособный) решения Вашей задачи
LexRoss
Не совсем понятно
Цитата
В прерывании компаратора нужно лишь установить новое значение для таймера, который аппаратно генерирует сигнал ШИМ, который в свою очередь управляет симмистором.

Т.е. в прерывании компаратора нужно включить таймер, а потом по прерыванию таймера включить симистор?
rezident
Цитата(LexRoss @ Jul 22 2009, 13:05) *
Т.е. в прерывании компаратора нужно включить таймер, а потом по прерыванию таймера включить симистор?
Можно и так. Но лучше, если таймер будет сам генерить сигнал ШИМ с периодом равным полупериоду сетевой частоты и длительностью равной углу отсечки симмистора. Нужно лишь синхронизировать ШИМ с сетью (для этого задействовать компаратор). А при необходимости изменить параметры ШИМ достаточно всего лишь обновлять значения регистров таймера, формирующего этот ШИМ. Правда для этого придется разобраться с архитектурой и аппаратурой самого таймера. laughing.gif
Vishv
Я бы Вам посоветовал разобраться как работает и управляется ШИМ в Вашем процессоре. А дальше Вы сами поймете что нужно делать в прерываниях компаратора.
Для начала попробуйте с помощью вывода процессора (к которому подключен выход ШИМ) управлять яркостью светодиода (без привязки к сети).
Ну а для полной конкретики - укажите хотя бы тип процессора - будет проще давать советы.
rezident
Цитата(Vishv @ Jul 22 2009, 20:41) *
Ну а для полной конкретики - укажите хотя бы тип процессора - будет проще давать советы.
Тип МК в заголовке указан - mega8, т.е. ATmega8.
Vishv
Цитата(rezident @ Jul 22 2009, 21:11) *
Тип МК в заголовке указан - mega8, т.е. ATmega8.

Прошу прощения - между глаз попало..
rezident
Цитата(Vishv @ Jul 22 2009, 21:29) *
Прошу прощения - между глаз попало.
Нет, это типичная ошибка топикстартеров. Важные исходные данные нужно размещать (или по крайней мере дублировать) в теле сообщения.
LexRoss
Придется разбираться с шим... wink.gif
И еще, после этого хочу автоматизировать включение/выключение света, считая число вошедших/вышедших человек. Поставить на входе в комнату ик светодиод и 2 приемника. TSOP, наверно, будет излишне. Какие приемники попроще?
Vishv
Цитата(LexRoss @ Jul 22 2009, 22:26) *
Придется разбираться с шим... wink.gif
И еще, после этого хочу автоматизировать включение/выключение света, считая число вошедших/вышедших человек. Поставить на входе в комнату ик светодиод и 2 приемника. TSOP, наверно, будет излишне. Какие приемники попроще?

Ну разбираться с ШИМ совсем не обязательно, просто с использованием ШИМ программа будет короче. Можно написать "программный" ШИМ, тоже будет работать. Так что Вам решать...
Приемник "попроще" можно сделать на расыпухе - схем море, на любой вкус, однако для достижения конечного результата лучше взять готовую микросхему и не заморачиваться.
Решение задачи счета вошедших/вышедших в настоящий момент обсуждается на Форуме в теме "ENCODER"(кажется так) - почитайте и поймете, что это по сущности то, что Вам нужно.
LexRoss
255 значений таймера оказалось очень мало для плавной регулировки, а с 16-ти битным таймером я так и не смог подобрать нужный интервал: при верхнем значении ШИМ в 3FF и 125кгц период 8мкс * 1023 = 8мс (мало), а при 15,625 кгц период 64мкс * 1023 = 66мс слишком много - на полпериода остается только около 150 значений. Что посоветуете?
rezident
Цитата(LexRoss @ Jul 23 2009, 16:33) *
Что посоветуете?
Выбрать период перезагрузки таймера чуть больше полупериода сетевой частоты (>10мс), а для синхронизации сбрасывать таймер в прерывании от компаратора.
DpInRock
Цитата(Vishv @ Jul 22 2009, 21:05) *
Ну разбираться с ШИМ совсем не обязательно, просто с использованием ШИМ программа будет короче. Можно написать "программный" ШИМ, тоже будет работать. Так что Вам решать...
Приемник "попроще" можно сделать на расыпухе - схем море, на любой вкус, однако для достижения конечного результата лучше взять готовую микросхему и не заморачиваться.
Решение задачи счета вошедших/вышедших в настоящий момент обсуждается на Форуме в теме "ENCODER"(кажется так) - почитайте и поймете, что это по сущности то, что Вам нужно.

1. Tаймер 0 или 2 делаете частотой 100 гц *1024 (максимально близко к этому) - Учтите, что вы будете программировать не частоту, а длительность между тогглами - поэтому расчитывайте на 200*1024 (Тогда частота будет как раз 100*1024).

2. Таймер 1 прогрммируете на ШИМ от 0 до 3FF. Ставите момент установки внешнего пина, который управляет симистором где-нибудь 3F0.
Тогда в итоге вы получите последовтельность импульсов длиной 3FF - 3F0 с частотой примерно 100 герц.

Без синхронизации от компаратора лампочка будет достаточно плавно менять яркость. (Зависит от точности 100 герц). Это полезно. Далеко не все переходы через 0 вы сможете засечь (помехи и пр.). Так что диммер некоторое время продержится и без синхронизации.

----
Забыл. Выход таймера 0 или 2 подаете на счетный вход таймера 1. Проводочком.

3. В прерывании от компаратора перезагружаем значение TCNT1. В зависимости от фазы.

Таким образом, весь код который работает будет в пункте 3. Т.е. ровно одна сишная строчка.
LexRoss
Цитата
Выбрать период перезагрузки таймера чуть больше полупериода сетевой частоты (>10мс), а для синхронизации сбрасывать таймер в прерывании от компаратора.

так и делал

Цитата
Выход таймера 0 или 2 подаете на счетный вход таймера 1. Проводочком.

ноги жалко, еще много на них повесить хочу.

Сейчас сделал так: в прерывании компаратора цикл, в котором включается таймер примерно на 10 микросекунд, цикл повторяется столько раз, сколько установлено кнопками - от 0 до 1000, т.е. задержка от 0 до 10 миллисекунд.
LexRoss
Нужно теперь научить регулятор понимать пульт от муз. центра. Нашел ИК приемник, подключил к входу звуковой карты (внизу то, что получилось). Протокол похож на nec, но стартовый бит только 4мс. Остался не задействован только 1 таймер (16бит), и, я так понимаю, приемник надо вешать на INT0. В общих чертах объясните, как распознать 5 кнопок. help.gif
DpInRock
Измерять таймером длительности нулей и единиц. (т.е. результат - массив из длительностей).Потом их анализировать.
А можно и сразу. Для каждой кнопки такая последовательность будет уникальной.

Длительность стартового можно не учитывать. Ибо он выйдет за разрядность 8 бит.
Где-то так. Лично я именно так делал. Тогда не нужно знать что там за протокол в пульте. И вообще наплевать на него.
Правда, стоит учесть, что автоповтор у пульта - тоже хитрый. Но - дойдете сами до этого...
LexRoss
Да, про массив я бы не догадался, спасибо. Автоповтор - это при удержании кнопки? При удержании он выдает стартовый и 2 единицы, с этим, думаю, разберусь.
DpInRock
автоповтор - он одинаковый для всех кнопок.

ну и когда будете реальные значения получать, увидите, что длительности будут иметь совсем мало вариантов. И их можно смело заменять битами.
Скажем длительности от 25 до 33 - это 0, а от 44 до 67 - 1. Будет короче и быстрее. (Единицы я привел крайне условные).
Diko
Впринципе есть вариант воспользоваться пультом с известным протоколом RC-5, например и воспользоваться готовыми процедурами анализа посылок от этого пульта. Данные пример есть наверное на все МК, в частности на Atmel и MSP430.
Goodefine
Цитата(LexRoss @ Jul 26 2009, 15:57) *
... Нашел ИК приемник, подключил к входу звуковой карты (внизу то, что получилось). Протокол похож на nec, но стартовый бит только 4мс. ...

Это nec-подобный протокол, встречался мне в пультах от Samsung-а:
Нажмите для просмотра прикрепленного файла
Написал к нему декодер (Си). Кроме него распознает еще два nec-подобных протокола от
JVC:
Нажмите для просмотра прикрепленного файла
и msi(собственно, чистый nec):
Нажмите для просмотра прикрепленного файла
скрины даны с автоповтором. В декодере программно реализован триггер-бит для распознавания удержания кнопки. Если актуально, могу привести код...
LexRoss
Goodefine, да, хотелось бы посмотреть. Хотя я уже сделал, но все равно, может, что-то поправлю.

И еще, вопрос совсем простой. Есть число X. Как его загрузить в TCNT1H, TCNT1L ?
В хелпе cvavr нашел такую строку:
TCNT1=0x1111; /* Write to TCNT1L & TCNT1H registers */
Пишет ошибку.

Все, разобрался. Что-то запутался с sfrw.

TCNT1 работает.
LexRoss
Появилась проблема.
Лампой управляет оптотиристор ТО125-12.5. Контроллер распознает кнопки от пульта только при отключенном от питания светодиоде оптотиристора. Как только подключаю тиристор, с выхода фотоприемника начинает сыпаться мусор. Питания разделял - не помогло. Кондер на питании и резисторы у фотоприемника стоят как по ДШ.

Может, развязать фотоприемник с контроллером оптроном?
Goodefine
Цитата(LexRoss @ Aug 1 2009, 09:07) *
Goodefine, да, хотелось бы посмотреть. Хотя я уже сделал, но все равно, может, что-то поправлю.

Выложил здесь.
LexRoss
Goodefine, спасибо.

С оптроном не получается. Осцил показывает, что сигнал на INT0 проходит, однако ничего не работает.
Посмотрите схему, я правильно подключаю?
=AK=
Цитата(LexRoss @ Aug 2 2009, 17:28) *
С оптроном не получается.

"Оптрон после фотоприемника" выглядит просто как издевательство над здравым смыслом. В сущности это точно соответствует присказке "водку продали, деньги пропили".

Как бороться с помехами - читайте здесь
LexRoss
Развязал тиристор с контроллером, он давал помехи по земле. Проблему ликвидировал.

Осталось всего 2 ноги. Хотелось бы еще связать это все с компутером. Где можно почитать про RS232, интересует именно программа для компьютера (на си или делфи)?
Или может быть есть более простое решение (через LPT)? Нужно всего 3 команды.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.