Страница 1 из 1

Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 02:56:31
7seg
Столкнулся с проблемой работы моей программки. Димер Работает отлично если подключен к одной фазе(или просто к сети). Но как только подключению 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
}
Такое ощущение что при нагрузке фаз куда то убегает ноль ) хотя это же не возможно.

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 05:11:19
Z_h_e
Схему приложите.

Добавлено after 3 minutes 23 seconds:
Да и вопрос то Вы задали так, как будто все остальные читали предыдущую тему по Вашему диммеру.

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 05:17:27
7seg
СпойлерИзображение
Схема

Добавлено after 2 minutes 43 seconds:
Вроде нашел помеху которую симистор дает в сеть. походу она и дает сбои.

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 05:38:19
Z_h_e
Детекторы фаз неудачно сделаны. Зачем конденсаторы С1, С2, С3? Кроме того, Вы детектируете переход через ноль от вторичной обмотки трансформаторов, а между первичной и вторичной обмоток может сдвиг фаз быть.

Программа то у Вас далеко не идеальная. Сделайте простейшую тестовую. Без инидкатора и обработки кнопок. Для фиксированного значения диммирования и поглядите что будет.

Я бы вход детектора фазы подтянул к питанию, и оптроном просаживал на общий.

-----------
Схему в чем чертили?

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 06:42:41
7seg
конденсаторы С1, С2, С3 значительно убирают помеху от включения симистора.

Добавлено after 2 minutes 29 seconds:
Самое интересное, что каждый канал по отдельности работает то замечательно )

Добавлено after 58 minutes 32 seconds:
Поставил RC Цепь на выход понижающего транса осциллограмма стала получше. но помеха все еще серьезная.

Осциллограммы.
СпойлерИзображение
Изображение

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 07:43:18
ARV
а сеть у вас хорошая? не перекашивает фазы при несимметричной нагрузке?

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 07:54:22
akl
7seg Можно посоветовать убирать помеху на ВВ входе и отказаться от трансов, которые действительно двигают фазу, причем зависимую от нагрузки на оный. Например, у меня сделано так
СпойлерИзображение
Блок_питания.png
(9.86 КБ) 623 скачивания

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 08:21:21
7seg
Вот насчет сети если честно не знаю.(
А почему трансы должны двигать фазу на вторичной обмотке ?

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 08:51:14
Ivanoff-iv
если есть.возможность — добавь цифровую фильтрацию т.е. не жди сигнала, когда его быть не должно, ну и перепроверяй вход — эти помехи короткие и такая проверка должна помочь.
Кстати RC фильтры двигают фазу.

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 09:24:28
7seg
Ну цифровая фильтрация я не считаю что это хорошая идея.

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 09:44:32
Ivanoff-iv
а зря, у меня в конструкции с тиристорами (попроще конечно, 1фазная) цифровая фильтрация оказалась необходимой и достаточной мерой, из железа остался высокоомный резюк (с фазы на вход) и два диода на плюс и на корпус для защиты ноги от перенапряжения. (конструкция не отвязана от сети)

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 11:38:43
7seg
Хотя кажись понял. цифровой фильтр нужен но всего на 4 момента включения.

Немного посмотрев на работу димера понял в какие моменты включения симистора идет сбой.
Изображение

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 13:36:30
Z_h_e
[uquote="7seg",url="/forum/viewtopic.php?p=3111668#p3111668"]Вот насчет сети если честно не знаю.(
А почему трансы должны двигать фазу на вторичной обмотке ?[/uquote] Потому что в катушке отстает ток (если он есть конечно) от напряжения и сердечник транса тоже не идеальный. Возможно для Вашей схемы этот сдвиг так мал, что не имеет значения , но помнить об этом надо.

Вы наверное не увидели мой вопрос. В какой среде чертили схему? Красиво и аккуратненько получилось.

Re: Межфазные помехи. Димер на тини26.

Добавлено: Вт май 23, 2017 15:06:59
7seg
Z_h_e, Paint из вин хп )

Re: Межфазные помехи. Димер на тини26.

Добавлено: Чт май 25, 2017 03:15:18
7seg
Выкинув некоторые временные промежутки , проблему с мерцанием все таки решил. а проблема все таки в симисторе он охкакуеную помеху в сеть дает на таких мощностях(Смотрел сеть осциллографом через понижающий транс, амплитуда помехи где то равна %70 от амплитуды периода. ) ) Попробую в этом месяце собрать еще прототип регулятора на IGBT транзисторах своять .

Re: Межфазные помехи. Димер на тини26.

Добавлено: Чт май 25, 2017 04:31:13
Ivanoff-iv
угу, попробуй сделать так чтобы ток нарастал помедленнее (небольшую индуктивность в силовую цепь добавь)

Re: Межфазные помехи. Димер на тини26.

Добавлено: Чт май 25, 2017 04:42:31
7seg
Плавное включение сделано программно. а индуктивность при таких токах, я даж хз что туда можно поставить.

Добавлено after 1 minute 3 seconds:
и еще не известно как это повлияет на работу симистора.

Re: Межфазные помехи. Димер на тини26.

Добавлено: Чт май 25, 2017 05:19:58
akl
Вам нужно изменить логику формирования импульса 10 мс как сделано в моей схеме выше. Т.е. 10мс формируется когда входной синус 50Гц переходит через 0 и схема закрывается; все остальное время схема открыта и проглатывает все помехи. В оборудовании, где эта схема работает, вопросов по синхронизации нет.

Re: Межфазные помехи. Димер на тини26.

Добавлено: Чт май 25, 2017 05:34:40
Ivanoff-iv
10-40 витков на ферритовый карандаш, думаю, будет достаточно. Нормально будут работать: открытие - ток плавно (микросекунды) поднимется с 0 до Iном, а закрытиетиристора происходит почти при нуле тока и от выброса на такой маленькой индуктивности ничего не должно пробить (можно R в параллель катушке поставить порядка 100 Ом, тогда бросок U на тиристоре при закрытии будет = Iуд*R примерно, это меньше 10в).

Добавлено after 8 minutes 40 seconds:
почитай про dU/dt фильтры