Форум РадиоКот https://radiokot.ru/forum/ |
|
Межфазные помехи. Димер на тини26. https://radiokot.ru/forum/viewtopic.php?f=57&t=145454 |
Страница 1 из 1 |
Автор: | 7seg [ Вт май 23, 2017 02:56:31 ] |
Заголовок сообщения: | Межфазные помехи. Димер на тини26. |
Столкнулся с проблемой работы моей программки. Димер Работает отлично если подключен к одной фазе(или просто к сети). Но как только подключению 3 канала димера к 3х-фазной сети (т.е по одному каналу на фазу), то лампы начинают мигать. Есть у кого какие мысли как обойти эту проблему ? Мигание замечено когда на 2ух каналах есть нагрузка ( на одном из них значение в районе 14-16) Код: СпойлерКод: //*************************************************************************** // Author(s)...: Плотников Андрей Игоревич // Target(s)...: IDE: AVR AtmelStudio 6.2 MC:Attiny26L // Data........: 15.05.17 //*************************************************************************** #define F_CPU 8000000 //Hz #include <util/delay.h> #include <avr/interrupt.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/eeprom.h> //---------- volatile unsigned char timer_save=0; volatile unsigned char savePower=0; volatile unsigned char saveValue=0; volatile unsigned char fBtPower=1; // Состояние кнопки volatile unsigned char fPower = 0; //EEPROM uint16_t power_var = 0; uint16_t value_var = 0; uint16_t eeprom_power EEMEM; uint16_t eeprom_value EEMEM; //---------- //настройка параметров работы функций #define BTN_LOCK_TIME 20 /*время обработки дребезга в милисекундах (10-100)*/ #define BTN_LONG_TIME 1000 /*время фиксации длинного нажатия в милисекундах (1000 - 2500)*/ //настройки портов /*порт чтения кнопок*/ #define BTN_PORT PORTB #define BTN_DDR DDRB #define BTN_PIN PINB /*пины чтения кнопок*/ #define BTN_LINE_UP (1<<4) #define BTN_LINE_DN (1<<3) #define BTN_LINE_POWER (1<<5) //глобальные переменные volatile uint8_t BtnFlags; //байт флагов нажатия кнопки #define BTN_SHRT_UP (1<<0) /*бит короткого нажатия кнопки up*/ #define BTN_SHRT_DN (1<<1) /*бит короткого нажатия кнопки dn*/ #define BTN_SHRT_POWER (1<<2) /*бит короткого нажатия кнопки POWER */ #define BTN_LONG_UP (1<<4) /*бит длинного нажатия кнопки up*/ #define BTN_LONG_DN (1<<5) /*бит длинного нажатия кнопки dn*/ //---------- #define En_INT0 GIMSK|= (1<<6); #define Dis_INT0 GIMSK&= ~(1<<6); //---------- volatile unsigned char data1 = 0; //Младший разряд индикатора volatile unsigned char data2 = 0; //Старший разряд индикатора volatile unsigned char cValue = 0; //Значения нагрева лампы от 0 до 99 //---------- static void init_io(); static void segchar(unsigned char seg); //Значения для срабатывание триака. const unsigned char TRIAK[]PROGMEM = { 160,156,155,154,150,148,146,144,142,140, 139,137,135,131,129,127,125,123,122,120, 119,118,117,116,115,114,113,112,111,110, 109,108,107,106,105,104,103,102,101,100, 99,98,97,96,95,94,93,92,91,90, 89,88,87,86,85,84,83,82,81,80, 79,78,77,76,75,74,73,72,71,70, 69,68,67,66,65,64,63,62,61,60, 59,58,57,56,55,54,53,52,51,50, //мигания на 14-16 элементе 49,48,47,45,43,41,40,37,35,31}; //---------- ISR(TIMER1_CMPA_vect) { cli(); PORTB |= (1<<1); _delay_us(9); PORTB &= ~(1<<1); _delay_us(1); PORTB |= (1<<1); _delay_us(9); PORTB &= ~(1<<1); sei(); } //---------- //Функция настройки библиотеки работы с кнопками void BtnInit (void) { BTN_DDR &= ~(BTN_LINE_UP| BTN_LINE_DN| BTN_LINE_POWER);//на ввод BTN_PORT |= (BTN_LINE_UP| BTN_LINE_DN| BTN_LINE_POWER);//подтяжка вкл } //---------- //Функция чтения данных о нажатии кнопок char BtnGet (void) { cli(); char temp = BtnFlags; BtnFlags = 0; sei(); return temp; } //---------- //ФУНКЦИЯ ОБРАБОТКИ НАЖАТИЙ КЛАВИШ (вызывать в прерывании с частотой 100 Гц) //короткое нажатие устанавливает бит BTN_SHRT_X глобальной переменной BtnFlags //длинное нажатие устанавливает бит BTN_LONG_X глобальной переменной BtnFlags void BtnExe (void) { static unsigned char BtnLockBit; //ащелка (защита от дребезга) static unsigned char BtnLockCoun; //счетчик защелки (защита от дребезга) static unsigned char BtnLongCoun; //счетчик длинного нажатия static unsigned char BtnLastState; //последнее состояние кнопок перед отпусканием char mask = 0; if (! (BTN_PIN & BTN_LINE_UP)) mask = BTN_SHRT_UP; if (! (BTN_PIN & BTN_LINE_DN)) mask = BTN_SHRT_DN; if (! (BTN_PIN & BTN_LINE_POWER)) mask = BTN_SHRT_POWER;; if (mask){ //опрос состояния кнопки if (BtnLockCoun < (BTN_LOCK_TIME/10)){ //клавиша нажата BtnLockCoun++; return; //защелка еще не дощитала - возврат } BtnLastState = mask; BtnLockBit =1; //нажатие зафиксировано if (BtnLongCoun >= (BTN_LONG_TIME/10)) return; //возврат, т.к. счетчик длинн нажат досчитал до максимума еще раньше if (++BtnLongCoun >= (BTN_LONG_TIME/10)) BtnFlags |= (BtnLastState<<4); //счетчик досчитал до максимума - устанавливаем биты длинного нажатия } else{ //клавиша отжата if (BtnLockCoun){ BtnLockCoun --; return; //защелка еще не обнулилась - возврат } if (! BtnLockBit) //СТАТИЧЕСКИЙ ВОЗВРАТ return; BtnLockBit =0; //отжатие зафиксировано if (BtnLongCoun < (BTN_LONG_TIME/10)) BtnFlags |= BtnLastState; //установка бита короткого нажатия BtnLongCoun = 0; //сброс счетчика длительности нажатия } } //---------- //Прерывания по ИНТ0 от синхра импулса volatile unsigned char count = 0; ISR(INT0_vect) { if (fPower==1) { OCR1A = pgm_read_byte(&(TRIAK[cValue])); TCNT1 = 0; data1 = cValue % 10; data2= cValue/10; //гасим оба разряда PORTB |=(1<<PB0); PORTB |=(1<<PB2); PORTA = 0b11111110; //зажигаем следующий разряд if (count == 0) { if (data2>0) //Пропускаем старший разряд , если он == 0 . { segchar(data2); PORTB &= ~(1<<2); } else { PORTB |=(1<<PB2); } } if (count == 1) { segchar(data1); PORTB &= ~(1<<0); } count++; if (count == 2) {count = 0;} } else { PORTB |=(1<<PB0); PORTB |=(1<<PB2); PORTA = 0b11111110; OCR1A = pgm_read_byte(&(TRIAK[0])); TCNT1 = 0; } BtnExe(); } //---------- int main(void) { //читаем байт из eeprom value_var= eeprom_read_word(&eeprom_value); _delay_ms(100); power_var=eeprom_read_word(&eeprom_power); _delay_ms(100); fBtPower=power_var; if (fBtPower==2) { fPower=1; } if (fBtPower==1) { fPower=0; } saveValue=value_var; init_io(); BtnInit(); unsigned char OneEn=0; _delay_ms(800); sei(); while(1) { if (OneEn==0) { OneEn=1; } if ((fPower == 1)&(OneEn==1)) { while ((cValue<saveValue)& (cValue < 99)) { cValue++; _delay_ms(100); } OneEn=2; } char BtnMask = BtnGet (); //одиночное нажатие + if ((BtnMask == BTN_SHRT_UP) & (cValue < 99)&(fPower==1)) { cValue++; saveValue=cValue; value_var=saveValue; eeprom_update_word (&eeprom_value, value_var); } //одиночное нажатие - if ((BtnMask == BTN_SHRT_DN) & (cValue > 0)&(fPower==1)) { cValue--; saveValue=cValue; value_var=saveValue; eeprom_update_word (&eeprom_value, value_var); } //одиночное нажатие Power if (BtnMask == BTN_SHRT_POWER) { fBtPower++; if (fBtPower==2) { fPower=1; savePower=fBtPower; } if (fBtPower==3) { OneEn=1; cValue=0; savePower=(fBtPower-2); fPower=0; } if (fBtPower==3) { fBtPower=1; } power_var=savePower; eeprom_update_word (&eeprom_power, power_var); } //Удержание + if ((BtnMask == BTN_LONG_UP) & (cValue < 99)&(fPower==1)) { while ((!(PINB&0b00010000))& (cValue < 99)) { cValue++; _delay_ms(100); } saveValue=cValue; value_var=saveValue; eeprom_update_word (&eeprom_value, value_var); } //Удержание - if ((BtnMask == BTN_LONG_DN) & (cValue > 0)&(fPower==1)) { while ((!(PINB&0b00001000))& (cValue > 0)) { cValue--; _delay_ms(100); saveValue=cValue; value_var=saveValue; eeprom_update_word (&eeprom_value, value_var); } } } return 0; } //---------- //Функция включения сегментов + кодировка. static void segchar (unsigned char seg) { switch (seg) { case 1: PORTA = 0b01111100; break; case 2: PORTA = 0b10000100; break; case 3: PORTA = 0b01000100; break; case 4: PORTA = 0b01101000; break; case 5: PORTA = 0b01000010; break; case 6: PORTA = 0b00000010; break; case 7: PORTA = 0b01110100; break; case 8: PORTA = 0b00000000; break; case 9: PORTA = 0b01000000; break; case 0: PORTA = 0b00010000; break; } } //---------- static void init_io() { //порт, к которому подкл. сегменты PORTA = 0xff; DDRA = 0xff; //порт, к которому подкл. катод DDRB |=(1<<0)|(1<<1)|(1<<2); PORTB =0x00; //Иницилизация прерываний по совпадению Т1. TIMSK |=(1<<OCIE1A); TCCR1B |=/*(1<<CTC1)*/(0<<CS10)|(1<<CS11)|(0<<CS12)|(1<<CS13); OCR1A=0xFF; //настраиваем на срабатывание INT0 по переднему фронту MCUCR |= (1<<ISC01)|(0<<ISC00); //разрешаем внешнее прерывание INT0 En_INT0 } Такое ощущение что при нагрузке фаз куда то убегает ноль ) хотя это же не возможно. |
Автор: | Z_h_e [ Вт май 23, 2017 05:11:19 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Схему приложите. Добавлено after 3 minutes 23 seconds: Да и вопрос то Вы задали так, как будто все остальные читали предыдущую тему по Вашему диммеру. |
Автор: | 7seg [ Вт май 23, 2017 05:17:27 ] | ||
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. | ||
СпойлерДобавлено after 2 minutes 43 seconds: Вроде нашел помеху которую симистор дает в сеть. походу она и дает сбои.
|
Автор: | Z_h_e [ Вт май 23, 2017 05:38:19 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Детекторы фаз неудачно сделаны. Зачем конденсаторы С1, С2, С3? Кроме того, Вы детектируете переход через ноль от вторичной обмотки трансформаторов, а между первичной и вторичной обмоток может сдвиг фаз быть. Программа то у Вас далеко не идеальная. Сделайте простейшую тестовую. Без инидкатора и обработки кнопок. Для фиксированного значения диммирования и поглядите что будет. Я бы вход детектора фазы подтянул к питанию, и оптроном просаживал на общий. ---------- Схему в чем чертили? |
Автор: | 7seg [ Вт май 23, 2017 06:42:41 ] | |||
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. | |||
конденсаторы С1, С2, С3 значительно убирают помеху от включения симистора. Добавлено after 2 minutes 29 seconds: Самое интересное, что каждый канал по отдельности работает то замечательно ) Добавлено after 58 minutes 32 seconds: Поставил RC Цепь на выход понижающего транса осциллограмма стала получше. но помеха все еще серьезная. Осциллограммы. Спойлер
|
Автор: | ARV [ Вт май 23, 2017 07:43:18 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
а сеть у вас хорошая? не перекашивает фазы при несимметричной нагрузке? |
Автор: | akl [ Вт май 23, 2017 07:54:22 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
7seg Можно посоветовать убирать помеху на ВВ входе и отказаться от трансов, которые действительно двигают фазу, причем зависимую от нагрузки на оный. Например, у меня сделано так СпойлерВложение:
|
Автор: | 7seg [ Вт май 23, 2017 08:21:21 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Вот насчет сети если честно не знаю.( А почему трансы должны двигать фазу на вторичной обмотке ? |
Автор: | Ivanoff-iv [ Вт май 23, 2017 08:51:14 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
если есть.возможность — добавь цифровую фильтрацию т.е. не жди сигнала, когда его быть не должно, ну и перепроверяй вход — эти помехи короткие и такая проверка должна помочь. Кстати RC фильтры двигают фазу. |
Автор: | 7seg [ Вт май 23, 2017 09:24:28 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Ну цифровая фильтрация я не считаю что это хорошая идея. |
Автор: | Ivanoff-iv [ Вт май 23, 2017 09:44:32 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
а зря, у меня в конструкции с тиристорами (попроще конечно, 1фазная) цифровая фильтрация оказалась необходимой и достаточной мерой, из железа остался высокоомный резюк (с фазы на вход) и два диода на плюс и на корпус для защиты ноги от перенапряжения. (конструкция не отвязана от сети) |
Автор: | 7seg [ Вт май 23, 2017 11:38:43 ] | ||
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. | ||
Хотя кажись понял. цифровой фильтр нужен но всего на 4 момента включения. Немного посмотрев на работу димера понял в какие моменты включения симистора идет сбой.
|
Автор: | Z_h_e [ Вт май 23, 2017 13:36:30 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Вот насчет сети если честно не знаю.( Потому что в катушке отстает ток (если он есть конечно) от напряжения и сердечник транса тоже не идеальный. Возможно для Вашей схемы этот сдвиг так мал, что не имеет значения , но помнить об этом надо.А почему трансы должны двигать фазу на вторичной обмотке ? Вы наверное не увидели мой вопрос. В какой среде чертили схему? Красиво и аккуратненько получилось. |
Автор: | 7seg [ Вт май 23, 2017 15:06:59 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Z_h_e, Paint из вин хп ) |
Автор: | 7seg [ Чт май 25, 2017 03:15:18 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Выкинув некоторые временные промежутки , проблему с мерцанием все таки решил. а проблема все таки в симисторе он охкакуеную помеху в сеть дает на таких мощностях(Смотрел сеть осциллографом через понижающий транс, амплитуда помехи где то равна %70 от амплитуды периода. ) ) Попробую в этом месяце собрать еще прототип регулятора на IGBT транзисторах своять . |
Автор: | Ivanoff-iv [ Чт май 25, 2017 04:31:13 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
угу, попробуй сделать так чтобы ток нарастал помедленнее (небольшую индуктивность в силовую цепь добавь) |
Автор: | 7seg [ Чт май 25, 2017 04:42:31 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Плавное включение сделано программно. а индуктивность при таких токах, я даж хз что туда можно поставить. Добавлено after 1 minute 3 seconds: и еще не известно как это повлияет на работу симистора. |
Автор: | akl [ Чт май 25, 2017 05:19:58 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
Вам нужно изменить логику формирования импульса 10 мс как сделано в моей схеме выше. Т.е. 10мс формируется когда входной синус 50Гц переходит через 0 и схема закрывается; все остальное время схема открыта и проглатывает все помехи. В оборудовании, где эта схема работает, вопросов по синхронизации нет. |
Автор: | Ivanoff-iv [ Чт май 25, 2017 05:34:40 ] |
Заголовок сообщения: | Re: Межфазные помехи. Димер на тини26. |
10-40 витков на ферритовый карандаш, думаю, будет достаточно. Нормально будут работать: открытие - ток плавно (микросекунды) поднимется с 0 до Iном, а закрытиетиристора происходит почти при нуле тока и от выброса на такой маленькой индуктивности ничего не должно пробить (можно R в параллель катушке поставить порядка 100 Ом, тогда бросок U на тиристоре при закрытии будет = Iуд*R примерно, это меньше 10в). Добавлено after 8 minutes 40 seconds: почитай про dU/dt фильтры |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |