реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Регулятор яркости лампы накаливания, mega8, cvavr
LexRoss
сообщение Jul 21 2009, 15:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



Переменка 3 вольта заведена на компаратор, он дает прерывание по каждому переходу через 0. В прерывании включаю ногу на несколько миллисекунд, затем отключаю. Так каждый полупериод. Нога подключена к управляющему выводу тиристора КУ202.
В cvavr написал цикл с увеличением задержки. Вроде бы лампочка должна медленно загораться и гаснуть, а она просто моргает.
Из-за чего? Может быть, тиристор не тот, и нужно поставить что-то типа BT137?
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 21 2009, 15:56
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Несколько миллисекунд - это сколько? Полпериода - всего 10 мс.

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

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

BT137 не тиристор.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Herz
сообщение Jul 21 2009, 16:03
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



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

Вот тиристор и включается в начале каждого полупериода, а выключается в конце, когда ток через него спадёт до нуля. Чтобы регулировать яркость, нужно подавать импульс включения с задержкой относительно перехода через ноль. Тогда, чем больше задержка - тем короче время включенного состояния и тем меньше яркость.
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Jul 21 2009, 16:14
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



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, т.е. так?

Сообщение отредактировал LexRoss - Jul 21 2009, 16:10
Прикрепленные изображения
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 21 2009, 16:14
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Во-первых, с помощью тиристора можно коммутировать только одну фазу переменки. Для коммутации переменки в обеих фазах нужно включить его через выпрямительный диодный мост. Для коммутации переменки применяются симмисторы (симметричные тиристоры, триаки), но для управления ими нужно подавать импульсы с полярностью, соответствующей фазе напряжения питания. Управлять симмистором прямо от пина МК несколько затруднительно. Поэтому для управления симмисторами обычно применяют оптоизоляторы или импульсные трансформаторы.
Во-вторых, у тиристора есть такой параметр, как минимальный ток удержания. Если к концу управляющего импульса ток тиристора (и нагрузки) не достигнет величины минимального тока удержания, то тиристор закроется сразу после окончания управляющего импульса. Сравните минимальный ток удержания для используемого тиристора и ток нагрузки в конце вашего миллисекундного управляющего импульса.
Рекомендую почитать "Тиристоры и симмисторы - десять золотых правил для успешного применения" в оригинале или в некотором переводе на русский.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 21 2009, 16:29
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Есть такой параметр - ток защелкивания тиристора. Это раз. (Маленькое напряжение - маленький (возможно) ток.

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


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

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

А в идеале - посмотрите работу таймеров в режиме PWM. C помощью этого можно сделать диммер без особых программных кодов. Все будет делаться автматически.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Herz
сообщение Jul 21 2009, 16:38
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(LexRoss @ Jul 21 2009, 18:14) *
Herz, т.е. так?

Совершенно верно. Остальное Вам уже разьяснили.
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Jul 21 2009, 17:03
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



Кое-что получилось.

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

Зажигаю вполнакала (с пятой милисекунды).
Лампа горит так, как задаю задержкой, но она моргает случайным образом через 0,5-1 сек
Go to the top of the page
 
+Quote Post
Vishv
сообщение Jul 21 2009, 17:27
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 310
Регистрация: 11-07-09
Из: Екатеринбург
Пользователь №: 51 154



Возможно у Вас просто "грязная" сеть и соответственно в некоторые моменты времени компаратор отрабатывает раньше или позже желаемого.
Кроме того 3 В переменки маловато - переход через 0 нечеткий, особенно если у Вас компаратор без гистерезиса.
Я в этих случаях беру сигнал для формирования прерываний сразу после выпрямителя, но при этом необходим дополнительный развязывающий диод перед входным фильтром.
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Jul 21 2009, 17:40
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



добавил до 5в на вход компаратора, заработало!
Подскажите еще как правильно сделать цикл, чтобы задержка менялась?
Go to the top of the page
 
+Quote Post
Vishv
сообщение Jul 21 2009, 18:02
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 310
Регистрация: 11-07-09
Из: Екатеринбург
Пользователь №: 51 154



Попробуйте такой вариант:
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 сек.
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Jul 21 2009, 18:11
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



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;
}
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 21 2009, 18:43
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Не нужно никаких delay_ms() Тем более в прерывании. В прерывании компаратора нужно лишь установить новое значение для таймера, который аппаратно генерирует сигнал ШИМ, который в свою очередь управляет симмистором.
Go to the top of the page
 
+Quote Post
Vishv
сообщение Jul 21 2009, 19:05
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 310
Регистрация: 11-07-09
Из: Екатеринбург
Пользователь №: 51 154



"Не нужно никаких delay_ms() Тем более в прерывании" - утверждение абсолютно правильное, в том случае, если процессор делает еще что-нибудь.
Ну а тут, как я понял, ему больше ничего и делать не надо.
Я просто не знаю уровень Ваших, уважаемый LexRoss, знаний (sorry!) про потроха процессора и степень его (процессора) загруженности,
поэтому и привел простейший вариант (увы неработоспособный) решения Вашей задачи
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Jul 22 2009, 07:05
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



Не совсем понятно
Цитата
В прерывании компаратора нужно лишь установить новое значение для таймера, который аппаратно генерирует сигнал ШИМ, который в свою очередь управляет симмистором.

Т.е. в прерывании компаратора нужно включить таймер, а потом по прерыванию таймера включить симистор?
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 21:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01581 секунд с 7
ELECTRONIX ©2004-2016