Еще для управления можно использовать (транзистор + диодный мост).
Использовать для схемы с DB3, или для схемы с МК?. Где можно увидеть схему такого использования?.
clawham практически убедил, что моя схема управления изврат юзера. Я тоже не схематический экстрасенс, и не программный экстрасенс, свои вопросы я не могу обрисовать на пальцах и закидать весь этот форум терминологией специалиста-электронщика, я не увлечен здесь игрой разных умных слов, выложил полностью свой проект на первой странице форума, к большинству своих сообщений прикладываю скрины и схемы.
clawham писал(а):
дык синхронизация тож ручная....развертка аналогично ну если не хочет не надо и не будет он заниматься измерениями экстрасенсы тут увы.....уехали....
Что за измерения? нет у меня осциллографа, а делать из компьютера осциллограф не буду ... писал уже почему. clawham вот между словесных поучений сделал же , программу деньгомер, отличная реальная вещь, за что спасибо. В общем тут кто про что , осциллограф у меня пока только один... в протеусе. И я пока не знаю, как сделать управляющий сигнал на симистор (зеленая линия) ,импульсным... Сейчас так а вот так нужно попытаться сделать Мой проект все там же, на первой странице.
Действительно элементарно... (только ж, у меня ведь тяжелый случай)))))))) Сделал копи пастом 70 штук "nop" и все стало ОК. Только, наверное 70 это сильно, может есть метод задать эти 21 mS программно в цифровом значении? Спасибо. P.S. сейчас моя монтажка на проводках распалась на проводки...).(((( Надо мне будет заняться и вытравить постоянную платку, испытаю в железе отпишусь
Задержка внутри прерывания - нонсенс. Я делал по-другому. Вот часть исходника, который я здесь выкладывал:
Код:
// Timer 0 output compare A interrupt service routine interrupt [TIM0_COMPA] voidtimer0_compa_isr(void) { // сюда попадаем, когда таймер досчитал до OCR0A // формируем импульс включения симистора, равный одному периоду входной частоты таймера - примерно 50 мкс //PORTB.4 = 1; // для отладки if(PINB.3) { // импульс ещё не начал формироваться PORTB.3 = 0; // начинаем формировать импульс включения симистора PORTB.0 = 1; // начинаем формировать импульс ШИМ OCR0A++; // увеличиваем OCR0A на единицу, чтобы попасть в это же самое прерывание на следующем такте // таймера. В дальнейшем, прежнее значение OCR0A восстанавливать не надо, т.к. оно задаётся // в начале каждого полупериода } else { // импульс включения симистора уже формируется PORTB.3 = 1; // закончили формировать } //PORTB.4 = 0; // для отладки }
можно и так...но задержка в 2 микросекунды в прерывании абсолютно допустима если не используется никаких программных времязависимых протоколов или задач + если сама задержка не является функцией с параметрами...
70 тактов простоя это много...там у Вас уже есть тактов 10-15 между взведением единички и концом прерывания....потому нужно просто посчитать длительность одного машинного такта и вычитать в даташите время минимальное для пробития по управлению...у вашего вродебы 2 микросекунды... при тактовой 8 мегагерц это 8 тактов на микросекунду.....выждите 20-30 нопов и всё от этого никому не станет ни плохо ни хорошо.....а вот если на единичку инкрементировать сравнение - начнутся проблемы на минимальной мощности...когда симистор надо будет выключить через прерывание а оно уже в начале новой полуволны....ибо выход и вход в прерывание это гораздо больше чем 2 микросекунды
_________________ Что нас не убило сделало нас осторожней Не доверяйте русским лужам - это может быть вход в метро.
Спасибо ребята за толковые подсказки (жалею только, что так быстро распсиховался и раскидал экспериментальную монтажку с этой схемой, не могу сразу опробовать это в железе(((((() Дело пока пошло на лад не терпится пробовать усе в железе. Вот уж не ожидал,..... что могу воспользоватся асемблерной вставкой (так как, не имею реального понятия что это такое)
В средствах отладки это выглядит , компактно и изумительно с этой вставкой задержка аж 155 mS, не знаю насколько будет логично это применение с другими программными функциями ( не хочется торопить события без испытания в железе)))). По крайней мере в протеусе при выставленном (минимально) значении ldi r16,30 длина импульса 25mS, симуляция проходит нормально.
Миллисекунда это 1/1000 секунды - 1 килогерц - 1 mS
МИКРОсекунда это 1/1000000 секунды - 1 МЕГАгерц - 1 uS
Нам с Вашим симистором НАДО всего лишь 2 МИКРОсекунды чтоб открыться.....для надежности можно взять в 3-4 раза бОльшее значение - 5-8 МИКРОсекунд...
Если у Вас мега 8 то одна МИКРОсекунда порождает 8 тактов (ну +-)
у Вас уже есть 12 тактов прерывания .... надбавьте ещё 32-12 НОПа и хватит....использовать вставки очень опасно!!! компилятор не сохраняет использованный Вами регистр ибо он не используется в прерывании(Сишной его части) - потому если где-то в программе он будет использоваться и тут произойдёт прерывание - вы его запортите! да и не нужно этого....Вам не 2000 тактов надо пропустить...всего 20....
Кроме того....что за хиленький симисторчик-то? 4 ампера это мизер!!!! не намного дороже зато неубиваемые....термоядерные...скоростные....
я закупился BTA24-600CWRG - 25 ампер 600 вольт, Изолированная подложка!!!!!
_________________ Что нас не убило сделало нас осторожней Не доверяйте русским лужам - это может быть вход в метро.
Барсик прошу прощения что оставил ваш пост без внимания, с интересом попытался разобраться , но там хоть и откомментирована каждая строка, я не смог вникнуть в структуру программы. Честно говоря я не осилил подобное и в еще одном варианте исходника на tiny13 Пытался переложить на мегу8 ... не осилил , (надеюсь это для меня не окончательный диагноз) но с моим понятием про такую схему, статья для меня очень полезна.
clawham писал(а):
у Вас уже есть 12 тактов прерывания .... надбавьте ещё 32-12 НОПа и хватит....использовать вставки очень опасно!!! компилятор не сохраняет использованный Вами регистр ибо он не используется в прерывании(Сишной его части) - потому если где-то в программе он будет использоваться и тут произойдёт прерывание - вы его запортите! да и не нужно этого....Вам не 2000 тактов надо пропустить...всего 20....
clawham ваш одесский юмор не всегда могу уловить, уже все было красиво и идеально..... (шутка) Спасибо принял к сведению. Пока не добрался до испытаний в натуре, при испытаниях начну с вставок ноп. Вот очевидно есть еще вариант без использования вставок, но с использованием двух таймеров. Как то так.
Project : Version : Date : 10.10.2010 Author : Company : Comments:
Chip type : ATmega8 Program type : Application Clock frequency : 16,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/
// 2 Wire Bus initialization // Generate Acknowledge Pulse: On // 2 Wire Bus Slave Address: 68h // General Call Recognition: Off // Bit Rate: 100,000 kHz
if (cmd == 0b11111000) { // кнопка "Display" - увеличение яркости TCCR1B=0x02; status++; if (status > 97) { TCCR1B=0x00; status = 98; TRIAC_PIN = 0; // полностью включили sprintf(cnt,"%u",status); // преобразование "яркости" в строку put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран } else { sprintf(cnt,"%u",status); // преобразование "яркости" в строку put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран delay_ms(delay_); } }
if (cmd == 0b11000000) { // кнопка "Sleep" - уменьшение яркости TCCR1B=0x02; status--; if (status < 1) { status = 0; // чтобы не уйти в минус TCCR1B=0x00; TRIAC_PIN = 1; // полностью выключили sprintf(cnt,"%u",status); // преобразование "яркости" в строку put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран } else { sprintf(cnt,"%u",status); // преобразование "яркости" в строку put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран delay_ms(delay_); } }
/*=================== ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ С ПУЛЬТА ====*/
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 }
if (cmd == 0b10000000) { // кнопка "VIDEO" - вкл/выкл основного света // реле вкл/выкл LCD_PowerOff (); }
if (count_RTC > 100000) { // чтобы не опрашивать DS1307 слишком часто count_RTC = 0; rtc_get_time(&hour,&min,&sec); //считать время rtc_get_date(&day,&month,&year); //считать дату
sec = bcd2bin(sec); min = bcd2bin(min); hour = bcd2bin(hour); day = bcd2bin(day); month = bcd2bin(month); year = bcd2bin(year);
Барсик прошу прощения что оставил ваш пост без внимания, с интересом попытался разобраться , но там хоть и откомментирована каждая строка, я не смог вникнуть в структуру программы.
Работает так. По прерыванию в начале каждого полупериода сетевого напряжения, запускается таймер. Как только таймер досчитает до OCR0A, включается симистор. Настроено прерывание от аналогового компаратора по изменению состояния входа. Изменение происходит в начале каждого полупериода сетевого напряжения - каждые 10 миллисекунд. Соответственно, прерывания происходят в начале каждого полупериода сетевого напряжения. Таймер пересчитывает тактовую частоту микроконтроллера. В качстве тактового генератора выбран внутренний генератор микроконтроллера. Тактовая частота и прескалер выбраны так, чтобы за 10 миллисекунд таймер насчитывал бы 100 - 200. В даном случае, он насчитывает примерно 187. Почему "примерно"? А потому, что точность частоты внутреннего генератора +/- 10%, а точность частоты сетевого напряжения гораздо выше. Сколько насчитал таймер за полупериод - столько получится дискретных значений для угла открывания симистора. По прерыванию от аналогового компаратора в начале каждого полупериода сетевого напряжения происходит следующее: 1. Измеряется точное значение - half_period_time - сколько насчитал таймер за полупериод. 2. Таймер сбрасывается в ноль. 3. Задаётся новое значение OCR0A - угол открывания симистора. 4. Запрещается прерывание от аналогового компаратора. Кроме этого, прерывание используется для отсчёта реальнго времени в функции временной задержки, и формирования импульсов ШИМ для индикации (с помощью стрелочного микроамперметра) угла отпирания симистора. Настроено прерывание от таймера по совпадению с OCR0A. При совпадении формируется импульс включения симистора с длительностью, равной одному периоду тактовой частоты на входе таймера (примерно 50-60 мкс). Настроено прерывание от таймера по совпадению с OCR0B. Оно случается примерно в середине каждого полупериода, когда состояние аналогового компаратора стабильно. В этот момент очищается флаг и вновь разрешается прерывание от аналогового компаратора. Настроено прерывание по переполнению таймера. При нормальной работе диммера, оно никогда не присходит, т.к. таймер перезапускается раньше, чем успевает досчитать до "конца". Если оно всё-таки произошло, то значит, что-то случилось с сетевым напряжением. Скорее всего, его просто выключили. По этому прерыванию настройки запоминаются в EEPROM, а микроконтроллер переключается в спящий режим. Чтобы микроконтроллер успел всё это сделать, по питанию включён конденсатор достаточно большой ёмкости.
Выход PD0 , прицепил светодиод, яркость меняется, значится схема получается живая... Далее МОС3052+ВТ136, лампа горит во весь накал, при уменьшении периода синусоиды кнопкой минус
Для отпирания симистора достаточно короткого импульса.
_________________ Будете проходить мимо- проходите!
не путайте пожалуйста милли и МИКРО секунды!!! ............. надбавьте ещё 32-12 НОПа и хватит....использовать вставки очень опасно!!! компилятор не сохраняет использованный Вами регистр ибо он не используется в прерывании(Сишной его части) - потому если где-то в программе он будет использоваться и тут произойдёт прерывание - вы его запортите! да и не нужно этого....Вам не 2000 тактов надо пропустить...всего 20....
Да действительно,слышал такое: чтобы использовать регистры во вставках есть функция блокировки регистров, но они получается выпадают из работы компилятора и оптимизатора.
takei писал(а):
Только, наверное 70 это сильно, может есть метод задать эти 21 mS программно в цифровом значении? Спасибо.
Определенно есть и это
Код:
delay_us(21);
В этом случае создастся точно такой же по смыслу фрагмент кода и в отличие от вставки он никак не повлияет на работу компилятора/оптимизатора.
Собрал в железе , как одиночное устройство (без всяких наворотов) работает отлично. Но теперь нужно браться за всякие там "навороты" и тут вопросы? Первое. При пропадании синхроимпульса из сети (например неисправность какой-то части схемы), то есть будет отсутствовать на INT0 прерывание... Как организовать отключение работы таймера TIM1_COMPA, соответственно и управление тиристором тоже будет 0. Примерно так
Код:
interrupt [TIM1_COMPA] void timer1_compa_isr(void) { if ( каким тут воспользоватся условием????? ) { TTT_PIN = 1; GIFR|=(1<<6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ GICR|=(1<<6); OCR1A = procent; #asm("nop"); // все элементарно просто спасибо clawham delay_us(19); // опять все просто, спасибо vitalik_1984 TTT_PIN = 0; } else { OCR1A = 0; //??????????????? TTT_PIN = 0; //?????????????? };
}
Второе. Как эту схему перевести из регулировки в 1025 ступеней в шим 255 ступеней.
по поводу пропадания сонхры - просто ловите полное переполнение таймера...вы же его каждый синхроимпульс сбрасываете в ноль...если так и не сбросили(а лучше сделать "повторялку) в 5-10 раз - сбрасываемся в ноль
далее как перевести? 1024/256= сколько? ЧЕТЫРЕ! что такое Четыре? это 1024/4 а что такое /4?
Это сдвиг влево на 2 разряда! вот и пишите 1024<<2
_________________ Что нас не убило сделало нас осторожней Не доверяйте русским лужам - это может быть вход в метро.
а что такое /4? Это сдвиг влево на 2 разряда! вот и пишите 1024<<2
как я это прочел: "а что такое поделить на 4? Это сдвиг влево на 2 разряда! вот и пишите 1024 сдвинуть влево 2 раза" так это не поделить, а умножить на 4 получится! (1024<<2 = 4096) Излагайтесь яснее пожалуйста.
clawham писал(а):
а нам надо деление ... то вправо... ж не знаю что у него во чно преобразовывается
Если не знаете, зачем тогда вообще направление сдвига говорить?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения