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

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 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
}
Такое ощущение что при нагрузке фаз куда то убегает ноль ) хотя это же не возможно.
andrei23061996@gmail.com
.................................................................................................................
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Схему приложите.

Добавлено after 3 minutes 23 seconds:
Да и вопрос то Вы задали так, как будто все остальные читали предыдущую тему по Вашему диммеру.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

СпойлерИзображение
Схема

Добавлено after 2 minutes 43 seconds:
Вроде нашел помеху которую симистор дает в сеть. походу она и дает сбои.
Вложения
для Ф.JPG
схемка
(228.61 КБ) 885 скачиваний
andrei23061996@gmail.com
.................................................................................................................
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

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

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

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

-----------
Схему в чем чертили?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

конденсаторы С1, С2, С3 значительно убирают помеху от включения симистора.

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

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

Осциллограммы.
СпойлерИзображение
Изображение
Вложения
оцил синх2.JPG
(145.96 КБ) 614 скачиваний
оцил синх.JPG
(143.08 КБ) 589 скачиваний
andrei23061996@gmail.com
.................................................................................................................
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а сеть у вас хорошая? не перекашивает фазы при несимметричной нагрузке?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

7seg Можно посоветовать убирать помеху на ВВ входе и отказаться от трансов, которые действительно двигают фазу, причем зависимую от нагрузки на оный. Например, у меня сделано так
СпойлерИзображение
Блок_питания.png
(9.86 КБ) 623 скачивания
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Вот насчет сети если честно не знаю.(
А почему трансы должны двигать фазу на вторичной обмотке ?
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

если есть.возможность — добавь цифровую фильтрацию т.е. не жди сигнала, когда его быть не должно, ну и перепроверяй вход — эти помехи короткие и такая проверка должна помочь.
Кстати RC фильтры двигают фазу.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Ну цифровая фильтрация я не считаю что это хорошая идея.
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а зря, у меня в конструкции с тиристорами (попроще конечно, 1фазная) цифровая фильтрация оказалась необходимой и достаточной мерой, из железа остался высокоомный резюк (с фазы на вход) и два диода на плюс и на корпус для защиты ноги от перенапряжения. (конструкция не отвязана от сети)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Хотя кажись понял. цифровой фильтр нужен но всего на 4 момента включения.

Немного посмотрев на работу димера понял в какие моменты включения симистора идет сбой.
Изображение
Вложения
фазы.JPG
(41.08 КБ) 1216 скачиваний
andrei23061996@gmail.com
.................................................................................................................
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

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

Вы наверное не увидели мой вопрос. В какой среде чертили схему? Красиво и аккуратненько получилось.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Z_h_e, Paint из вин хп )
andrei23061996@gmail.com
.................................................................................................................
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Выкинув некоторые временные промежутки , проблему с мерцанием все таки решил. а проблема все таки в симисторе он охкакуеную помеху в сеть дает на таких мощностях(Смотрел сеть осциллографом через понижающий транс, амплитуда помехи где то равна %70 от амплитуды периода. ) ) Попробую в этом месяце собрать еще прототип регулятора на IGBT транзисторах своять .
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

угу, попробуй сделать так чтобы ток нарастал помедленнее (небольшую индуктивность в силовую цепь добавь)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Плавное включение сделано программно. а индуктивность при таких токах, я даж хз что туда можно поставить.

Добавлено after 1 minute 3 seconds:
и еще не известно как это повлияет на работу симистора.
andrei23061996@gmail.com
.................................................................................................................
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Вам нужно изменить логику формирования импульса 10 мс как сделано в моей схеме выше. Т.е. 10мс формируется когда входной синус 50Гц переходит через 0 и схема закрывается; все остальное время схема открыта и проглатывает все помехи. В оборудовании, где эта схема работает, вопросов по синхронизации нет.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

Добавлено after 8 minutes 40 seconds:
почитай про dU/dt фильтры
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «AVR»