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

Переменка 3 вольта заведена на компаратор, он дает прерывание по каждому переходу через 0. В прерывании включаю ногу на несколько миллисекунд, затем отключаю. Так каждый полупериод. Нога подключена к управляющему выводу тиристора КУ202.
В cvavr написал цикл с увеличением задержки. Вроде бы лампочка должна медленно загораться и гаснуть, а она просто моргает.
Из-за чего? Может быть, тиристор не тот, и нужно поставить что-то типа BT137?
Вот тиристор и включается в начале каждого полупериода, а выключается в конце, когда ток через него спадёт до нуля. Чтобы регулировать яркость, нужно подавать импульс включения с задержкой относительно перехода через ноль. Тогда, чем больше задержка - тем короче время включенного состояния и тем меньше яркость.
LexRoss
Jul 21 2009, 16:14
DpInRock, все так и есть, как Вы сказали. Шаг 2 микросек, меняется от 0 до 10000 мкс примерно за 3 сек. Я думаю достаточно для плавности.

Вот такой код
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
Jul 21 2009, 16:14
Во-первых, с помощью тиристора можно коммутировать только одну фазу переменки. Для коммутации переменки в обеих фазах нужно включить его через выпрямительный диодный мост. Для коммутации переменки применяются симмисторы (симметричные тиристоры, триаки), но для управления ими нужно подавать импульсы с полярностью, соответствующей фазе напряжения питания. Управлять симмистором прямо от пина МК несколько затруднительно. Поэтому для управления симмисторами обычно применяют оптоизоляторы или импульсные трансформаторы.
Во-вторых, у тиристора есть такой параметр, как минимальный ток удержания. Если к концу управляющего импульса ток тиристора (и нагрузки) не достигнет величины минимального тока удержания, то тиристор закроется сразу после окончания управляющего импульса. Сравните минимальный ток удержания для используемого тиристора и ток нагрузки в конце вашего миллисекундного управляющего импульса.
Рекомендую почитать "Тиристоры и симмисторы - десять золотых правил для успешного применения" в
оригинале или в некотором
переводе на русский.
DpInRock
Jul 21 2009, 16:29
Есть такой параметр - ток защелкивания тиристора. Это раз. (Маленькое напряжение - маленький (возможно) ток.
В прерывании какая-то фигня написана. Импульс запуска симистора должен быть фиксированной длины. 100 микросекунд. (Это необязательно, конечно, но лучше сразу так сделать, для краткости дальнейших объяснений).
А вот фаза запуска - должна быть разной...
По жизни должно быть так.
В копмараторе у вас должен устанавливаться (корректироваться) таймер фазовой задержки.
По срабатыванию этого таймера - срабатывать другой таймер (или этот же) на 100 микрсекунд для формирования импульса запуска тиристора.
А в идеале - посмотрите работу таймеров в режиме PWM. C помощью этого можно сделать диммер без особых программных кодов. Все будет делаться автматически.
Цитата(LexRoss @ Jul 21 2009, 18:14)

Herz, т.е. так?
Совершенно верно. Остальное Вам уже разьяснили.
LexRoss
Jul 21 2009, 17:03
Кое-что получилось.
interrupt [ANA_COMP] void ana_comp_isr(void)
{
delay_ms(5);
PORTD.0 = 1;
delay_us(100);
PORTD.0 = 0;
}
Зажигаю вполнакала (с пятой милисекунды).
Лампа горит так, как задаю задержкой, но она моргает случайным образом через 0,5-1 сек
Возможно у Вас просто "грязная" сеть и соответственно в некоторые моменты времени компаратор отрабатывает раньше или позже желаемого.
Кроме того 3 В переменки маловато - переход через 0 нечеткий, особенно если у Вас компаратор без гистерезиса.
Я в этих случаях беру сигнал для формирования прерываний сразу после выпрямителя, но при этом необходим дополнительный развязывающий диод перед входным фильтром.
LexRoss
Jul 21 2009, 17:40
добавил до 5в на вход компаратора, заработало!
Подскажите еще как правильно сделать цикл, чтобы задержка менялась?
Попробуйте такой вариант:
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
Jul 21 2009, 18:11
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
Jul 21 2009, 18:43
Не нужно никаких delay_ms() Тем более в прерывании. В прерывании компаратора нужно лишь установить новое значение для таймера, который аппаратно генерирует сигнал ШИМ, который в свою очередь управляет симмистором.
"Не нужно никаких delay_ms() Тем более в прерывании" - утверждение абсолютно правильное, в том случае, если процессор делает еще что-нибудь.
Ну а тут, как я понял, ему больше ничего и делать не надо.
Я просто не знаю уровень Ваших, уважаемый LexRoss, знаний (sorry!) про потроха процессора и степень его (процессора) загруженности,
поэтому и привел простейший вариант (увы неработоспособный) решения Вашей задачи
LexRoss
Jul 22 2009, 07:05
Не совсем понятно
Цитата
В прерывании компаратора нужно лишь установить новое значение для таймера, который аппаратно генерирует сигнал ШИМ, который в свою очередь управляет симмистором.
Т.е. в прерывании компаратора нужно включить таймер, а потом по прерыванию таймера включить симистор?
rezident
Jul 22 2009, 14:37
Цитата(LexRoss @ Jul 22 2009, 13:05)

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

Ну а для полной конкретики - укажите хотя бы тип процессора - будет проще давать советы.
Тип МК в заголовке указан - mega8, т.е. ATmega8.
Цитата(rezident @ Jul 22 2009, 21:11)

Тип МК в заголовке указан - mega8, т.е. ATmega8.
Прошу прощения - между глаз попало..
rezident
Jul 22 2009, 15:34
Цитата(Vishv @ Jul 22 2009, 21:29)

Прошу прощения - между глаз попало.
Нет, это типичная ошибка топикстартеров. Важные исходные данные нужно размещать (или по крайней мере дублировать) в теле сообщения.
LexRoss
Jul 22 2009, 16:26
Придется разбираться с шим...

И еще, после этого хочу автоматизировать включение/выключение света, считая число вошедших/вышедших человек. Поставить на входе в комнату ик светодиод и 2 приемника. TSOP, наверно, будет излишне. Какие приемники попроще?
Цитата(LexRoss @ Jul 22 2009, 22:26)

Придется разбираться с шим...

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

Что посоветуете?
Выбрать период перезагрузки таймера чуть больше полупериода сетевой частоты (>10мс), а для синхронизации сбрасывать таймер в прерывании от компаратора.
DpInRock
Jul 23 2009, 15:18
Цитата(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
Jul 23 2009, 16:13
Цитата
Выбрать период перезагрузки таймера чуть больше полупериода сетевой частоты (>10мс), а для синхронизации сбрасывать таймер в прерывании от компаратора.
так и делал
Цитата
Выход таймера 0 или 2 подаете на счетный вход таймера 1. Проводочком.
ноги жалко, еще много на них повесить хочу.
Сейчас сделал так: в прерывании компаратора цикл, в котором включается таймер примерно на 10 микросекунд, цикл повторяется столько раз, сколько установлено кнопками - от 0 до 1000, т.е. задержка от 0 до 10 миллисекунд.
LexRoss
Jul 26 2009, 12:57
Нужно теперь научить регулятор понимать пульт от муз. центра. Нашел ИК приемник, подключил к входу звуковой карты (внизу то, что получилось). Протокол похож на nec, но стартовый бит только 4мс. Остался не задействован только 1 таймер (16бит), и, я так понимаю, приемник надо вешать на INT0. В общих чертах объясните, как распознать 5 кнопок.
DpInRock
Jul 26 2009, 15:09
Измерять таймером длительности нулей и единиц. (т.е. результат - массив из длительностей).Потом их анализировать.
А можно и сразу. Для каждой кнопки такая последовательность будет уникальной.
Длительность стартового можно не учитывать. Ибо он выйдет за разрядность 8 бит.
Где-то так. Лично я именно так делал. Тогда не нужно знать что там за протокол в пульте. И вообще наплевать на него.
Правда, стоит учесть, что автоповтор у пульта - тоже хитрый. Но - дойдете сами до этого...
LexRoss
Jul 26 2009, 15:32
Да, про массив я бы не догадался, спасибо. Автоповтор - это при удержании кнопки? При удержании он выдает стартовый и 2 единицы, с этим, думаю, разберусь.
DpInRock
Jul 26 2009, 15:48
автоповтор - он одинаковый для всех кнопок.
ну и когда будете реальные значения получать, увидите, что длительности будут иметь совсем мало вариантов. И их можно смело заменять битами.
Скажем длительности от 25 до 33 - это 0, а от 44 до 67 - 1. Будет короче и быстрее. (Единицы я привел крайне условные).
Впринципе есть вариант воспользоваться пультом с известным протоколом RC-5, например и воспользоваться готовыми процедурами анализа посылок от этого пульта. Данные пример есть наверное на все МК, в частности на Atmel и MSP430.
Goodefine
Jul 30 2009, 14:29
Цитата(LexRoss @ Jul 26 2009, 15:57)

... Нашел ИК приемник, подключил к входу звуковой карты (внизу то, что получилось). Протокол похож на nec, но стартовый бит только 4мс. ...
Это nec-подобный протокол, встречался мне в пультах от Samsung-а:
Нажмите для просмотра прикрепленного файлаНаписал к нему декодер (Си). Кроме него распознает еще два nec-подобных протокола от
JVC:
Нажмите для просмотра прикрепленного файлаи msi(собственно, чистый nec):
Нажмите для просмотра прикрепленного файласкрины даны с автоповтором. В декодере программно реализован триггер-бит для распознавания удержания кнопки. Если актуально, могу привести код...
LexRoss
Aug 1 2009, 06:07
Goodefine, да, хотелось бы посмотреть. Хотя я уже сделал, но все равно, может, что-то поправлю.
И еще, вопрос совсем простой. Есть число X. Как его загрузить в TCNT1H, TCNT1L ?
В хелпе cvavr нашел такую строку:
TCNT1=0x1111; /* Write to TCNT1L & TCNT1H registers */
Пишет ошибку.
Все, разобрался. Что-то запутался с sfrw.
TCNT1 работает.
LexRoss
Aug 1 2009, 13:55
Появилась проблема.
Лампой управляет оптотиристор ТО125-12.5. Контроллер распознает кнопки от пульта только при отключенном от питания светодиоде оптотиристора. Как только подключаю тиристор, с выхода фотоприемника начинает сыпаться мусор. Питания разделял - не помогло. Кондер на питании и резисторы у фотоприемника стоят как по ДШ.
Может, развязать фотоприемник с контроллером оптроном?
Goodefine
Aug 1 2009, 16:44
Цитата(LexRoss @ Aug 1 2009, 09:07)

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

С оптроном не получается.
"Оптрон после фотоприемника" выглядит просто как издевательство над здравым смыслом. В сущности это точно соответствует присказке "водку продали, деньги пропили".
Как бороться с помехами -
читайте здесь
LexRoss
Aug 7 2009, 11:06
Развязал тиристор с контроллером, он давал помехи по земле. Проблему ликвидировал.
Осталось всего 2 ноги. Хотелось бы еще связать это все с компутером. Где можно почитать про RS232, интересует именно программа для компьютера (на си или делфи)?
Или может быть есть более простое решение (через LPT)? Нужно всего 3 команды.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.