Регулятор яркости на pic
|
|
tolyan249 |
Дата: Сб, 20.10.2012, 13:31 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
199
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Здраствуйте всем. Вопрос такого характера, есть ли у кого наработки по регулированию яркости лампочки по сети 220в на pic16F877 и симисторах 26-каналов ? А то нужно схему Новому году состряпать для улицы на работу. Спасибо. Просто вывод логмческих 1 или 0 выводить можно но не будет плавной регулировки освещения.
Может просто есть наработки на любом pic, просто нудно понять принцип регулирования по сети 220в.
если знаешь,помоги.
Сообщение отредактировал
tolyan249 - Сб, 20.10.2012, 13:38
|
|
|
|
shaman |
Дата: Сб, 20.10.2012, 14:56 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
День добрый ,можно попробовать к PIC16F877присоединить нашу микруху К1182ПМ1Р,единственное придется подобрать R2 ,для управления симисторм. Добавлено (20.10.2012, 14:56) --------------------------------------------- http://www.compeljournal.ru/enews/2009/5/10
|
|
|
|
tolyan249 |
Дата: Сб, 20.10.2012, 14:56 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
199
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Да это понятно спасибо за совет,только яркостью управлять нужно с pic ,а на этой микросхеме ставить кнопку нужно.
если знаешь,помоги.
|
|
|
|
shaman |
Дата: Сб, 20.10.2012, 14:58 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Просто нужна разобраться с формой сигнала для управления симистором или тиристором,может тогда придется использовать оператор PWM ,если я не ошибаюсь.
|
|
|
|
tolyan249 |
Дата: Сб, 20.10.2012, 14:59 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
199
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Для изменения мощности, подведенной к нагрузке через симистор, может использоваться фазовое управление (рис. 2). Сущность метода заключается в пропуске части полупериода сетевого напряжения — аналогично широтно-импульсной модуляции. Ток в нагрузке пропорционален интегралу от полученного сигнала. Такой режим используется в регуляторах освещенности — диммерах. Яркость свечения лампы накаливания пропорциональна площади под обрезанной синусоидой.
Рис. 2. Фазовое управление
Преимуществом этого метода является то, что частота пульсаций на нагрузке остается равной сетевой. Это важно для управления осветительными приборами, так как снижение частоты может сказаться на появлении мерцания, заметного глазом.
Обратной стороной являются наводки, которые могут появиться в связи с резким переключением симистора. Эти наводки плохо сказываются на электромагнитной совместимости (EMI) полученного устройства и могут вызвать ненужные переключения симистора.
если знаешь,помоги.
|
|
|
|
shaman |
Дата: Сб, 20.10.2012, 15:03 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Там можно и потенциометр приделать на К1182ПМ1Р. Добавлено (20.10.2012, 15:03) --------------------------------------------- тогда пробовать оператор PWM,Шим сигнал
|
|
|
|
tolyan249 |
Дата: Сб, 20.10.2012, 15:04 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
199
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
ВОТ схема и описания правда исходник на си как переделать на протон пока не знаю.
Во время ремонта лазерного принтера Hewlett-Packard Laser Jet 4 с испорченным блоком управления мощностью нагревателя было необходимо изготовить новую схему управления симистором от постоянного напряжения 0...+5В. Для этих целей я выбрал микроконтроллер PIC12F675, со встроенным 10-разрядным АЦП в 8-ми выводном DIP корпусе. Он не дорогой (до 10 грн в Киеве).
Полученная схема симисторного регулятора c гальванической развязкой цепей регулирования от сетевого напряжения мощности показана ниже:
Диоды VD3-VD6 - защитные (от повышенного напряжения на входе и напряжения обратной полярности).
Цепь на транзисторной оптопаре DA2 предназначена для захвата "нуля" сетевого напряжения и гальванической развязки от нее. При наличии "полуволны" происходит шунтирование вывода 5 микроконтроллера на землю. Диод VD2 защищает оптопару от полуволны обратного напряжения. Резистор R1 - гасящий, мощностью 2Вт для питания светодиода оптопары.
Если Вы хотите применить для регилирования мощности переменный резистор, то включить его можно как указано на схеме R7. Учитывая входное сопротивление АЦП микросхемы преобразователя (10кОм) сопротивление переменного резистора желательно применить в диапазоне от 1 до 10 кОм, при этом ограничительный резистор R5 следует исключить из схемы. Также можно исключить их схемы и защитные диоды.
Вывод 4 микросхемы DD1 используется для включения и выключения микроконтроллера (регулятора). При напряжении +5В микроконтроллер включен. Если отдельный вывод включения не требуется, то правый вывод резистора R6 следует соединить с плюсом питания (+5В), при этом защитные диоды VD5, VD6 можно исключить.
Блокировочные керамические конденсаторы по 0,1мк служат для подавления пульсаций питающего напряжения.
Алгоритм управления симистором - фазоимпульстный, т.е. регирирование мощности на нагрузке выполняется изменением времени открытия симистора от начала полпериода сетевого напряжения. При мощности 100% импульс открывания симистора приходит сразу после появления сигнала от дачика перехода сетевого напряжения через "ноль", что приводит к пропусканию всей полуволны сетевого напряжения (10 мс). При мощности 10% происходит задержка включения симистора на 9 мс и в нагрузку уходит лишь оставшаяся 1 мс сетевого напряжения.
Микроконтроллер PIC12F675 может работать как с внутренним так и внешним кварцевым резонатором. В моем варианте МК работал с внутренним генератором (4МГц). При изменении частоты необходимо подкорректировать константы (ShimShagMax та ShimShagDiv). ShimShagMax указывает количество прерываний таймера на один полупериод при частоте сети 50 Гц - 10мс. Прерывание таймера каждые 256 мкс(при частоте 4МГц), тогда константа будет иметь значение 10мс/256мкс=39. Принимаем 40, на всякий пожарный). ShimShagDiv=255/ShimShagMax=6.375
Ниже представлена программа для PIC12F675, написанная на языке Си:
#include <12F675.h> #device adc=8
#FUSES NOWDT //No Watch Dog Timer //#FUSES INTRC_IO //Внутрішній генератор #FUSES XT //Зовнішній генератор #FUSES NOCPD //No EE protection #FUSES NOPROTECT //Code not protected from reading #FUSES MCLR //Master Clear pin enabled #FUSES PUT //Power Up Timer #FUSES BROWNOUT //Reset when brownout detected
#byte ADCON0 = 0x1F #byte GPIO = 0x05
#use fast_io(A) // Работа с портами без переключения // каждый раз регистров TRIS
#use delay(clock=4000000)
#define ShimShagMax 40 // 255/ShimShagMax #define ShimShagDiv 6.375
unsigned char Shim, ShimVal;
#int_RTCC void RTCC_isr() { Shim++; //Увеличиваем зачения счетчика ШИМ
if (Shim>ShimShagMax) Shim=0;//Период ШИМ порядка 20 мс (50Гц)
if ((ShimShagMax-Shim)<ShimVal) //Провреняем, не пришло ли время OUTPUT_HIGH(PIN_A0);//если да, то лог "1" else OUTPUT_LOW(PIN_A0); //если нет, то "0"
if ((input_a() & 0b00000100)) Shim=0; //Синхронизируем с ~220В. }
void Pause255(unsigned char Ret) { unsigned char Pause=0; while(Ret>0) { while (Pause<255) Pause++; Pause=0; Ret--; } }
void main() { setup_adc_ports(sAN1|VSS_VDD); setup_adc(ADC_CLOCK_DIV_16); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_comparator(NC_NC); setup_vref(FALSE); enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL);
set_adc_channel( 1 );
SET_TRIS_A(0b00000110); ShimVal=0;
{unsigned char InpVolt;
while(1) { Pause255(254); // ADCON0 |= 4; // Начинаем АЦПяпить Pause255(254);
while (ADCON0 & 0b00000010); //Ожидаем завершение преобразования
InpVolt=READ_ADC()/ShimShagDiv; //
//Плавное изменение температуры if ((InpVolt>ShimVal)&&(ShimVal<ShimShagMax)) ShimVal++; if ((InpVolt<ShimVal)&&(ShimVal>0)) ShimVal--;
} } }
Для работы с обеими полупериодами, следует транзисторную оптопару DA2 подключать через диодный мостик, чтобы иметь на выходе импульсы при любой полярности полупериода.
если знаешь,помоги.
|
|
|
|
shaman |
Дата: Сб, 20.10.2012, 15:24 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Так и переделывать на Протон ,брать учебник по СИ и переводить каждый оператор,что и как работает и за что отвечает.
|
|
|
|
Andriy76 |
Дата: Сб, 20.10.2012, 21:56 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
231
Замечания:
±
На сайте с 06.04.2010
Статус:
Offline
|
Quote (tolyan249) if ((InpVolt>ShimVal)&&(ShimVal<ShimShagMax)) ShimVal++; if ((InpVolt<ShimVal)&&(ShimVal>0)) ShimVal--; Похоже что будет выглядеть так If InpVolt > ShimVal And ShimVal < ShimShagMax Then Inc ShimVal If InpVolt < ShimVal And ShimVal > 0 Then Dec ShimVal В своей зарядке так и изменяю значение ШИМ в зависимости от тока заряда
Сообщение отредактировал
Andriy76 - Сб, 20.10.2012, 22:00
|
|
|
|
anatol |
Дата: Сб, 20.10.2012, 22:54 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Quote (tolyan249) 26-каналов Простите сколько каналов? И сколько аппаратных ШИМ есть в контроллере? Про программные не говорю.
|
|
|
|
dimitriy-bc |
Дата: Вс, 21.10.2012, 21:48 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Всем доброго времени суток. Мощность на нагрузке в сети переменного тока можно регулировать с помощью фазоимпульсной модуляции (см. ссылку tolyan249). При использовании этого принципа, особое внимание необходимо обратить на входной фильтр сетевого питания микроконтроллера и привязка к сети, фильтр напоминающий фильтр второго порядка. При подключении лампочек накаливания, сопротивление нагрузки мало (в холодном состоянии 40Вт приблизительно 100 Ом.). Соответственно при использовании этого варианта в сеть, за счет крутого фронта, мы сами вносим импульсную помеху, которая имеет широкий спектр гармонических колебаний, именно они могут бить по мозгам МК. А также могут происходить самопроизвольные срабатывания в других силовых ключах. Тиристоры (симисторы), имеют такой параметр как отношение (дельта U/дельта Т). Если скорость нарастания напряжения приложенного к выводам анод катод тиристора (симистора) превысят его значение, то ключ может открыться без управляющего импульса. Для устранения этой бяки, обычно параллельно выводам анод катод подключается RC цепочка. Для многоканального управления могу предложить Вам следующий алгоритм. Назначается переменная, допустим Х. При прохождении сети через ноль, она обнуляется. После чего происходит инкрементирование данной переменной. Следующий этап, сравнение с переменными Ваших 26и каналов. При совпадении, выдается управляющий импульс на ключ соответствующего канала. После сравнения с последней переменной, программа возвращается в начало и переменная Х инкрементируется еще раз. Этот цикл повторяется до тех пор, пока не произойдет очередной переход сети через ноль. При прохождении через ноль переменная Х опять обнуляется, и программа пошла на следующий виток. Также можно попробовать и другой метод. Для управления тиристорами (семестрами), использовать оптроны типа МОС 3041. У этих оптронов есть встроенная функция переход через ноль. Т.Е. управляющий сигнал на силовой ключ подается только в момент перехода сети через ноль. В результате дополнительных помех в сеть мы не выдаем. Регулировку мощности, выдаваемую в нагрузку, мы регулируем следующим образом. Один период силовой ключ включен, второй выключен. В нагрузке 50% мощности. Два периода силовой ключ включен, один выключен. В нагрузке 2/3 мощности и т.д. Недостаток или преимущество этого варианта в том, что может просматриваться мерцание лампочек. Вам решать, ведь гирлянды для Нового года.
Сообщение отредактировал
dimitriy-bc - Вс, 21.10.2012, 21:52
|
|
|
|
dimitriy-bc |
Дата: Вс, 28.10.2012, 15:58 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Всем доброго времени суток. tolyan249, если Вас еще интересует эта тема, можете взять за основу программу NEW YEAR. Привязка к сети происходит по прерыванию порта А4. Отсчет времени таймером TMR1. Вместо светодиодов, использовать оптроны МОС3051… (без привязки к переходу через ноль). Максимальное значение переменных для гирлянд, подберете экспериментально. В макетной плате, привязку к переходу через ноль, можно взять с диодного моста без конденсатора на выходе.
|
|
|
|
tolyan249 |
Дата: Ср, 31.10.2012, 16:02 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
199
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Огромное спасибо всем за советы и ответы, будем пробовать писать, 24 канала сделаю что бы использовать 3-порта полностью, контроллер PIC16F877A ,использовать МОС3051 , яркость каждого канала должна быть разной в зависимости от программы визуализации, примерно понял принцип, буду пробовать что то писать. что напишу выложу. Добавлено (31.10.2012, 16:02) --------------------------------------------- Пробую пока в протеусе, менять мощность кнопками, проблема в том что не заходит в подпрограмму main где опрашиваються кнопки, что подскажите, если я кнопки опрашиваю в самом прерывании то кнопки работаю как можно сделать что бы кнопки опрашивались в main подпрограмме.
Declare SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные Declare FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR Declare Reminders = OFF ' Выключить напоминания компилятора Declare Warnings = OFF ' Выключить предупреждения компилятора Declare Optimiser_Level 4 ' Включить оптимизацию программы Declare Bootloader = OFF ' Выключить загрузчик ;-------------------------- Общие настройки------------------------------------ Device = 16F877A ' Используемый микроконтроллер Xtal = 20 ' Частота осциллятора 20 МГц '-------------------------- Конфигурация программирования -------------------- Config CP_OFF, DEBUG_OFF, WRT_OFF, CPD_OFF, LVP_OFF, BODEN_OFF, PWRTE_OFF, WDT_OFF, XT_OSC '-------------------------- Настройки портов --------------------------------- PortB_Pullups = OFF ' Выключить подтягивающие резисторы на PORTB Declare All_Digital = On ' Установить все порты цифровыми входами/выходами
'--Определение назначения каналов портов-- TRISA = %00000001 ' Сделать канал PORTA.0 входом для АЦП-мерить напряжение TRISE = %00000011 ' Сделать канал (вывод) AN5 (PORTE.50 выходом, RE1, RE2 входами ADCON1 = %10000010 ' Установить все выводы PORTA в режим АЦП TRISC = %00000000 ' PORTC выход TRISD = %00000000 ' Сделать каналы PORTD выходами TRISB = %00000001 ' Сделать каналы PORTВ.0 входом
'-------------------------- OPTION_REG ---------------------------------------- OPTION_REG.0=0 ' Бит установки предделителя TMR0 OPTION_REG.1=0 ' Бит установки предделителя TMR0 OPTION_REG.2=0 ' Бит установки предделителя TMR0 OPTION_REG.3=1 ' Выбор включения предделителя ,предделитель выключен OPTION_REG.4=1 ' Выбор фронта приращения TMR0 при внешнем тактовом сигнале -выключен OPTION_REG.5=0 ' Выбор тактового сигнала для TMR0-приращение таймера от внутреннего генератора -включен OPTION_REG.6=0 ' Выбор активного фронта сигнала на входе внешнего прерывания INT, PORTB.0 OPTION_REG.7=1 ' Включение подтягивающих резисторов на PORTB -выключен
'-------------------------- INTCON -------------------------------------------- INTCON.0=0 ' Флаг внешнего прерывания по PORTB.4-PORTB.7 -выключен INTCON.1=1 ' Флаг внешнего прерывания по PORTB.0(INT) -включен INTCON.2=1 ' Флаг переполнения TMR0 -включен INTCON.3=0 ' Бит разрешения прерывания по PORTB.4-PORTB.7 -выключен INTCON.4=1 ' Бит разрешения прерывания по PORTB.0(INT) -включен INTCON.5=0 ' Бит разрешения прерывания по переполнению TMR0 -выключен пока INTCON.6=1 ' Бит разрешения прерывания от периферийных устройств -включен INTCON.7=1 ' Бит глобального разрешения прерываний -включен '-------------------------- PIE1, PIR1 ---------------------------------------------- PIE1.0=0 ' Бит разрешения прерывания по переполнению TMR1 -выключен пока PIR1.0=0 ' Флаг прерывания по переполнению TMR1 -выключен пока
'-------------------------- T1CON --------------------------------------------------- T1CON.0=0 ' Бит включения модуля TMR1 T1CON.1=0 ' Выбор источника тактового сигнала для TMR1 T1CON.2=0 ' Синхронизация внешнего тактового сигнала T1CON.3=0 ' Включение тактового генератора TMR1 T1CON.4=0 ' Выбор коэффициента деления предделителя TMR1 T1CON.5=0 ' Выбор коэффициента деления предделителя TMR1
'-------------------------- Настройка TMR1 для прерываний -------------------- TMR1L = $DC ' Значение младшего регистра TMR1 для полусекундных интервалов TMR1H = $0B ' Значение старшего регистра TMR1 для полусекундных интервалов T1CON = %00110000 'Значение регистра T1CON для выбранного режима работы PIE1.0=1 ' Разрешение прерывания при переполнении TMR1 T1CON.0=1 'Запустим TMR1 для формирования полусек. интервалов
TMR0=0 'считать таймер будет до 256
Dim s As Dword Dim s1 As Dword Dim timp As Dword Dim timp1 As Dword Dim result1 As Dword Dim result2 As Dword
Dim tim2 As Word Dim tim3 As Word Dim tim4 As Word Dim tim5 As Word Dim tim6 As Word Dim tim7 As Word Dim tim8 As Word Dim value As Word Dim tim9 As Word Dim tim10 As Word Dim tim11 As Word Dim tim12 As Word Dim tim13 As Word
Dim simp As Word Dim metr As Word Dim km As Word
Dim ml As Word Dim colimp As Word Dim result_colimp As Word Dim f As Byte Dim f1 As Byte Dim q As Byte Dim flg As Byte
Dim sec As Byte Dim minut As Byte Dim chas As Byte
Dim fflg As Byte Dim colicimp As Byte Clear
PORTA=0 PORTB=0 PORTC=0 PORTD=0 PORTE=0
On_Interrupt GoTo te GoTo main main: If PORTE.0=0 Then Inc s1 If s1>200 Then s1=200 If PORTE.1=0 Then Dec s1 If s1<1 Then s1=1 DelayMS 250 GoTo main
te: Context Save If INTCON.1=1 Then 'произошло прерывание по PORTB.0 If PORTE.0=0 Then Inc s1 If s1>200 Then s1=200 If PORTE.1=0 Then Dec s1 If s1<1 Then s1=1 If OPTION_REG.6=0 Then 'если это фронт то делать сдедующие s=0 TMR0=0 OPTION_REG.6=1'переключаем для прерывания по спаду что бы мерить имульс а не период весь Else OPTION_REG.6=0 'возращаем на место что бы прерывание было опять по фронту s=0 TMR0=0 EndIf INTCON.1=0 EndIf If INTCON.2=1 Then 'пришло прерывание от таймера TMR0-что он переполнился Inc s 'переполнение происходит каждые 256мкс-микросекунд If s=1 Then PORTB.1=1 If s=s1 Then PORTB.1=0 INTCON.2=0 'считываем эти переполнения и увеличеваем переменную на 1 EndIf 'что бы знать сколько переполнений было Context Restore
End
если знаешь,помоги.
|
|
|
|
tolyan249 |
Дата: Ср, 31.10.2012, 16:05 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
199
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Вот архив с програмой
если знаешь,помоги.
|
|
|
|
Matrix252005 |
Дата: Ср, 31.10.2012, 16:15 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток!!!
tolyan249, а почему у Вас переменная "s1 As Dword", если она больше 200 (If s1>200 Then s1=200) не "поднимается"??? Назначьте ее Byte, это что сразу кинулось в глаза... Сейчас скачаю весь архив (надеюсь там есть схема в протеусе???) и проверю.
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|