Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
14.03.2011, 21:44
|
|
Прописка
Регистрация: 04.01.2007
Сообщений: 233
Сказал спасибо: 22
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
А на рике кто-нить,что-нить подобное делал.Сейчас занимаюсь зтой проблемой.
|
|
|
|
14.03.2011, 21:55
|
|
Временная регистрация
Регистрация: 05.10.2010
Сообщений: 68
Сказал спасибо: 12
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
народ может мне кто подскажет с моим кодом, делаю подобное (проше без пульта ИК), не могу заставить чтобы код кнопки понимал! тема по соседству!
|
|
|
|
14.03.2011, 22:11
|
|
Временная регистрация
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Фантастика... ЗАРАБОТАЛО!!!
urry, CodeNameHawk большое спасибо!!!
Код:
|
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
OCR1A = nagruzka[status];
OCR1B = nagruzka[status]+200;
TCNT1 = 0; // сбросили таймер
//GICR| = 0x80; // запретили прерывание INT0 // GIFR = 0x10000000
GICR&=~(1‹‹6); // запретили прерывание INT0 // GIFR = 0x10000000
}
...
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TRIAC_PIN = 0; // открыли симистор
}
// Timer 1 output compare B interrupt service routine
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
TRIAC_PIN = 1; // вернулись в режим ожидания
GIFR|=(1‹‹6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1‹‹6); // разрешаем прерывание INT0.
}
...
if (cmd == 0b11011000) { // кнопка "TV" - вкл/выкл диммера
GICR&=~(1‹‹7); // запретили прерывание INT1 (от TSOP) // GIFR = 0x01000000
if (status == 0) {
soft_on (); // 100% мощности
}
else {
soft_off(); // плавно выключаем
};
GIFR|=(1‹‹7); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1‹‹7); // разрешаем прерывание INT1
} |
Сейчас регулировка работает идеально 0 - 100% !!!
P.S. Осталась малюсенькая проблема: при плавном старте с нуля (предопределенная кнопка или удержание "+") в самом начале проскакивает кратковременное СЛАБОЕ моргание. Нить чуть накаляется, тухнет и дальше нормально регулируется. Ничего страшного, практически не заметно. Но всё равно интересно. Мне кажется что это как то связано с запуском таймера TCCR1B=0x02. По идее как только его запустили -› OCR1A = nagruzka[0]; т.к. status = 0 т.е. 1% нагрузки. Может слишком близко к нулю? Но тогда почему при выключении такого нет.
Кнопка "+" :
Код:
|
if (cmd == 0b11111000) { // кнопка "Display" - увеличение яркости
TCCR1B=0x02;
status++;
if (status › 97) {
TCCR1B=0x00;
status = 98;
TRIAC_PIN = 0; // полностью включили
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(20, 40,cnt, 0x07E0, 3); // выводим на экран
}
else {
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(20, 40,cnt, 0x07E0, 3); // выводим на экран
delay_ms(delay_);
}
} |
Плавный пуск:
Код:
|
void soft_on () {
TCCR1B=0x02;
while (status‹98) {
status++;
delay_ms(delay_);
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(20, 40,cnt, 0x07E0, 3); // выводим на экран
};
status = 98;
TCCR1B=0x00;
TRIAC_PIN = 0; // полностью включили
} |
Если есть моргание, значит на симистор подается импульс, а значит на доли секунды срабатывает этот кусок с неправильным значением:
Код:
|
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TRIAC_PIN = 0; // открыли симистор
} |
Только почему оно не правильное?
|
|
|
|
15.03.2011, 01:41
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 180
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от mr_smit
|
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { OCR1A = nagruzka[status]; OCR1B = nagruzka[status]+200; TCNT1 = 0; // сбросили таймер //GICR| = 0x80; // запретили прерывание INT0 // GIFR = 0x10000000 GICR&=~(1‹‹6); // запретили прерывание INT0 // GIFR = 0x10000000 }
|
Вы словами опишите как ваш код тут будет правильно работать.
Я тут вижу, что пока тиристор не закроется вы просто решили пропускать очередные полу волны, зачем?
Опишите словами логику работы вашей программы и сами найдете ошибки в программе.
Типа так:
засек переход через ноль, (INT0)
установил задержки таймера 1, сбросил его значение на ноль, далее
разрешил его работу.
interrupt [TIM1_COMPА] открыл тиристор, закроется он сам при переходе полу волны через ноль.
После того как сработало interrupt [TIM1_COMPB], прекратил открывать тиристор, остановил таймер.
ну и так далее
Последний раз редактировалось CodeNameHawk; 15.03.2011 в 01:47.
|
|
|
|
15.03.2011, 10:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
И чуть-чуть по аппаратной части. На входе моста постоянный потенциал в 1/2 Uвыпр., промодулированный переменкой 50Гц. Нуля там может никогда и не случиться.
Вот схема детектора перехода через "ноль", которую и настраивать-то не нужно, главное обеспечить безопасное напряжение на R2. R1 и R3 могут иметь разные номиналы - это не важно. Он будет "оквадрачивать" сетевое напряжение.
Номиналы элементов - какие получились. U1 - компаратор(можно и ОУ). Это принцип.
Последний раз редактировалось omercury; 15.03.2011 в 10:12.
|
|
|
|
15.03.2011, 16:40
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 180
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
С минимальными переделками я бы попробовал так :
R6 со схемы выкинуть
Прерывание ловить по спаду импульса.
(Прерывание случится чуть раньше начала полу волны, но
это как раз позволит достичь почти 100% регулировки яркости)
|
|
|
|
15.03.2011, 17:14
|
|
Временная регистрация
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от CodeNameHawk
|
Я тут вижу, что пока тиристор не закроется вы просто решили пропускать очередные полу волны, зачем?
|
От ноля до конца импульса открытия симистора нам зачем прерывания?????? Не нужны! Фильтрация помех!!!!!!!!!!!! До импульса проходит меньше 0,01 сек. (полупериод), поэтому следующий ноль мы гарантированно не пропустим!!! Если вдруг проскочит помеха из сети в этот промежуток мы её не засчитаем как ноль!!!
Код:
|
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
OCR1A = nagruzka[status];
OCR1B = nagruzka[status]+200;
TCNT1 = 0; // сбросили таймер
//GICR| = 0x80; // запретили прерывание INT0 // GIFR = 0x10000000
GICR&=~(1‹‹6); // запретили прерывание INT0 // GIFR = 0x10000000
} |
А после импульса вернули прерывания назад. Вот и всё
|
|
|
|
15.03.2011, 18:13
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 180
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от mr_smit
|
До импульса проходит меньше 0,01 сек. (полупериод), поэтому следующий ноль мы гарантированно не пропустим!!!
|
Какая длина открывающего тиристор импульса?
И что происходит при 5% яркости, я так понимаю вы подаете открывающий импульс по истечении 0.0095 сек и если длина открывающего импульса больше 0.0005 (0.01-0.0095) будет пропуск.
|
|
|
|
15.03.2011, 20:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от CodeNameHawk
|
И что происходит при 5% яркости, я так понимаю вы подаете открывающий импульс по истечении 0.0095 сек и если длина открывающего импульса больше 0.0005 (0.01-0.0095) будет пропуск.
|
Это ещё не всё. Кто нибудь регулирует по отрицательной полуволне? Ведь от неё нет прерывания. (а может и есть - кто знает?)...
Код:
|
if (b_cnt ‹ 9) addr_1 = (addr_1 ‹‹ 1) + 1; //первый байт - прямой адрес |
и
Код:
|
if (b_cnt ›= 9 && b_cnt ‹ 17) addr_0 = (addr_0 ‹‹ 1) + 1; //второй байт - инверсный адрес |
и так далее...
Сможете объяснить, зачем второй раз проверять счётчик, что он больше или равен 9-ти? То, что меньше Вы уже отсекли первым условием. Память программ резиновая? У МК лишнее время?
Убирайте шелуху и обновите то, что выложили.
|
|
|
|
16.03.2011, 01:56
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 180
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от omercury
|
Это ещё не всё. Кто нибудь регулирует по отрицательной полуволне? Ведь от неё нет прерывания. (а может и есть - кто знает?)...
|
Если схема не менялась, должна ловиться. Диодный мост положительную и отрицательную полу волну 50 Hz заменяет на две положительные с частотой 100 Hz.
Последний раз редактировалось CodeNameHawk; 16.03.2011 в 02:02.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:40.
|
|