Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Регулятор яркости на pic
Регулятор яркости на pic
tolyan249 Дата: Сб, 20.10.2012, 13:31  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Здраствуйте всем. Вопрос такого характера, есть ли у кого наработки по регулированию яркости лампочки по сети 220в на pic16F877 и симисторах 26-каналов ? А то нужно схему Новому году состряпать для улицы на работу. Спасибо. Просто вывод логмческих 1 или 0 выводить можно но не будет плавной регулировки освещения.

Может просто есть наработки на любом pic, просто нудно понять принцип регулирования по сети 220в.


если знаешь,помоги.
Сообщение отредактировал tolyan249 - Сб, 20.10.2012, 13:38
ЯНДЕКС Дата: 20.10.2012
shaman Дата: Сб, 20.10.2012, 14:56  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

День добрый ,можно попробовать к PIC16F877присоединить нашу микруху К1182ПМ1Р,единственное придется подобрать R2 ,для управления симисторм.

Добавлено (20.10.2012, 14:56)
---------------------------------------------
http://www.compeljournal.ru/enews/2009/5/10

Прикрепления: 7121897.jpg (25.2 Kb)
tolyan249 Дата: Сб, 20.10.2012, 14:56  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Да это понятно спасибо за совет,только яркостью управлять нужно с pic ,а на этой микросхеме ставить кнопку нужно.

если знаешь,помоги.
shaman Дата: Сб, 20.10.2012, 14:58  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Просто нужна разобраться с формой сигнала для управления симистором или тиристором,может тогда придется использовать оператор PWM ,если я не ошибаюсь.
tolyan249 Дата: Сб, 20.10.2012, 14:59  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Для изменения мощности, подведенной к нагрузке через симистор, может использоваться фазовое управление (рис. 2). Сущность метода заключается в пропуске части полупериода сетевого напряжения — аналогично широтно-импульсной модуляции. Ток в нагрузке пропорционален интегралу от полученного сигнала. Такой режим используется в регуляторах освещенности — диммерах. Яркость свечения лампы накаливания пропорциональна площади под обрезанной синусоидой.

Рис. 2. Фазовое управление

Преимуществом этого метода является то, что частота пульсаций на нагрузке остается равной сетевой. Это важно для управления осветительными приборами, так как снижение частоты может сказаться на появлении мерцания, заметного глазом.

Обратной стороной являются наводки, которые могут появиться в связи с резким переключением симистора. Эти наводки плохо сказываются на электромагнитной совместимости (EMI) полученного устройства и могут вызвать ненужные переключения симистора.
Прикрепления: 9513432.gif (20.0 Kb)


если знаешь,помоги.
shaman Дата: Сб, 20.10.2012, 15:03  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Там можно и потенциометр приделать на К1182ПМ1Р.

Добавлено (20.10.2012, 15:03)
---------------------------------------------
тогда пробовать оператор PWM,Шим сигнал

tolyan249 Дата: Сб, 20.10.2012, 15:04  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 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 подключать через диодный мостик, чтобы иметь на выходе импульсы при любой полярности полупериода.
Прикрепления: 7453647.gif (8.5 Kb)


если знаешь,помоги.
shaman Дата: Сб, 20.10.2012, 15:24  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Так и переделывать на Протон ,брать учебник по СИ и переводить каждый оператор,что и как работает и за что отвечает.
Andriy76 Дата: Сб, 20.10.2012, 21:56  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 231
Репутация: 10   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Quote (tolyan249)
26-каналов

Простите сколько каналов? И сколько аппаратных ШИМ есть в контроллере? Про программные не говорю.
dimitriy-bc Дата: Вс, 21.10.2012, 21:48  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток. Мощность на нагрузке в сети переменного тока можно регулировать с помощью фазоимпульсной модуляции (см. ссылку tolyan249). При использовании этого принципа, особое внимание необходимо обратить на входной фильтр сетевого питания микроконтроллера и привязка к сети, фильтр напоминающий фильтр второго порядка.
При подключении лампочек накаливания, сопротивление нагрузки мало (в холодном состоянии 40Вт приблизительно 100 Ом.). Соответственно при использовании этого варианта в сеть, за счет крутого фронта, мы сами вносим импульсную помеху, которая имеет широкий спектр гармонических колебаний, именно они могут бить по мозгам МК. А также могут происходить самопроизвольные срабатывания в других силовых ключах. Тиристоры (симисторы), имеют такой параметр как отношение (дельта U/дельта Т). Если скорость нарастания напряжения приложенного к выводам анод катод тиристора (симистора) превысят его значение, то ключ может открыться без управляющего импульса. Для устранения этой бяки, обычно параллельно выводам анод катод подключается RC цепочка.
Для многоканального управления могу предложить Вам следующий алгоритм.
Назначается переменная, допустим Х. При прохождении сети через ноль, она обнуляется. После чего происходит инкрементирование данной переменной. Следующий этап, сравнение с переменными Ваших 26и каналов. При совпадении, выдается управляющий импульс на ключ соответствующего канала. После сравнения с последней переменной, программа возвращается в начало и переменная Х инкрементируется еще раз. Этот цикл повторяется до тех пор, пока не произойдет очередной переход сети через ноль. При прохождении через ноль переменная Х опять обнуляется, и программа пошла на следующий виток.
Также можно попробовать и другой метод. Для управления тиристорами (семестрами), использовать оптроны типа МОС 3041. У этих оптронов есть встроенная функция переход через ноль. Т.Е. управляющий сигнал на силовой ключ подается только в момент перехода сети через ноль. В результате дополнительных помех в сеть мы не выдаем. Регулировку мощности, выдаваемую в нагрузку, мы регулируем следующим образом. Один период силовой ключ включен, второй выключен. В нагрузке 50% мощности. Два периода силовой ключ включен, один выключен. В нагрузке 2/3 мощности и т.д. Недостаток или преимущество этого варианта в том, что может просматриваться мерцание лампочек. Вам решать, ведь гирлянды для Нового года.

Сообщение отредактировал dimitriy-bc - Вс, 21.10.2012, 21:52
ЯНДЕКС Дата: 21.10.2012
dimitriy-bc Дата: Вс, 28.10.2012, 15:58  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток.
tolyan249, если Вас еще интересует эта тема, можете взять за основу программу NEW YEAR.
Привязка к сети происходит по прерыванию порта А4. Отсчет времени таймером TMR1.
Вместо светодиодов, использовать оптроны МОС3051… (без привязки к переходу через ноль).
Максимальное значение переменных для гирлянд, подберете экспериментально.
В макетной плате, привязку к переходу через ноль, можно взять с диодного моста без конденсатора на выходе.
Прикрепления: NEW_YEAR.rar (70.9 Kb)
tolyan249 Дата: Ср, 31.10.2012, 16:02  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Вот архив с програмой
Прикрепления: 2337327.zip (46.5 Kb)


если знаешь,помоги.
Matrix252005 Дата: Ср, 31.10.2012, 16:15  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

tolyan249, а почему у Вас переменная "s1 As Dword", если она больше 200 (If s1>200 Then s1=200) не "поднимается"??? Назначьте ее Byte, это что сразу кинулось в глаза... Сейчас скачаю весь архив (надеюсь там есть схема в протеусе???) и проверю.


THE TRUTH IS OUT THERE.

С уважением, Николай.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Регулятор яркости на pic
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: