Диммер IGBT или попытка сделать Регулятор мощности

Блоки питания, преобразователи напряжения, UPS'ы - это здесь :)
Ответить
Друг Кота
Аватара пользователя
Сообщения: 20183
Зарегистрирован: Пт фев 04, 2011 17:57:51
Откуда: Рыбинск

Сообщение Martin76 »

Почему, стабилизация по питанию ШИМ, R3, R5 - распространенное решение для этой микросхемы. Тем более с таким количеством выходов их застабилизировать проблематично.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

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

Так как сегодня не успел дорисовать всю схему целиком(очень мало свободного времени) пока допиливаю прошивку и вытравил плату.
Завтра продолжу.
Насчет ОС предполагаю сопротивлением R3 выставить нужное мне напряжение т.к ток потребление по 15V очень малый 1-2ма. а по 5вольтам это 7мая вторичная обмотка пусть будет завышена по напряжению а роль стабилизации отвел для L7805.
andrei23061996@gmail.com
.................................................................................................................
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

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

Прошивка дописана)
Реализовано:
-Сохранение данных в ЕПРОМ
-Плавный пуск.
Спойлер

Код: Выделить всё

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>

//-------------------------------------------///init_pwm///-----------------------------------------------------------------//
void init_pwm()
{
	TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
	TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
	OCR0A=0x00;
	OCR0B=0x00;
	
	TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
	TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
	OCR1AL=0x00;
	OCR1BL=0x00;

	TCCR2A=(1<<COM2A1) | (0<<COM2A0) | (1<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (1<<WGM20);
	TCCR2B=(0<<WGM22) | (0<<CS22) | (1<<CS21) | (0<<CS20);
	OCR2A=0x00;
	OCR2B=0x00;
}
//--------------------------------------------------------------------------------------------------------------------------//
void init_int0()
{
	//настраиваем на срабатывание INT0 по переднему фронту
	EICRA |= (1<<ISC01)|(0<<ISC00);
	//разрешаем внешнее прерывание INT0
	EIMSK |= (1<<INT0);
}
//--------------------------------------------------------------------------------------------------------------------------//
void init_io()
{
	DDRB=(0<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(0<<PB5)|(0<<PB6)|(0<<PB7);
	PORTB=0x00;
	DDRC=(1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(1<<PC6);
	PORTC=0x00;
	DDRD=(1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
	PORTD=0x00;
}
//--------------------------------------------------------------------------------------------------------------------------//
//настройка параметров работы функций
#define BTN_LOCK_TIME		30					/*время обработки дребезга в милисекундах (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<<7)
#define BTN_LINE_DN		(1<<6)
#define BTN_LINE_POWER	(1<<5)
#define BTN_LINE_SW		(1<<0)
//глобальные переменные
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_SHRT_SW			(1<<3)			/*бит короткого нажатия кнопки SW*/
#define BTN_LONG_UP			(1<<4)			/*бит длинного нажатия кнопки up*/
#define BTN_LONG_DN			(1<<5)			/*бит длинного нажатия кнопки dn*/
#define BTN_LONG_SW			(1<<6)			/*бит короткого нажатия кнопки SW*/
//-------------------------------------------------------------------------------------------------------------------
//Функция настройки библиотеки работы с кнопками
void BtnInit (void)
{
	BTN_DDR &= ~(BTN_LINE_UP| BTN_LINE_DN| BTN_LINE_POWER|BTN_LINE_SW);//на ввод
	BTN_PORT |= (BTN_LINE_UP| BTN_LINE_DN| BTN_LINE_POWER|BTN_LINE_SW);//подтяжка вкл
}
//--------------------------------------------------------------------------------------------------------------------
//Функция чтения данных о нажатии кнопок
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 (! (BTN_PIN & BTN_LINE_SW))		mask = BTN_SHRT_SW;

	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;					//сброс счетчика длительности нажатия
	}
}
//------------------------------------------------------****7SEG****----------------------------------------------------------
#define SEGA 6
#define SEGB 5
#define SEGC 1
#define SEGD 2
#define SEGE 3
#define SEGF 4
#define SEGG 0

#define ANOD1 4
#define ANOD2 7
#define ANOD3 4
//-------------------------------------------------------------------------------------------------------------------------
void segchar (unsigned char seg)
{
	switch (seg)
	{
		case 0:
		PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(0<<SEGD)|(0<<SEGE)|(0<<SEGF)|(1<<SEGG);break;
		case 1:
		PORTC=(1<<SEGA)|(0<<SEGB)|(0<<SEGC)|(1<<SEGD)|(1<<SEGE)|(1<<SEGF)|(1<<SEGG);break;
		case 2:
		PORTC=(0<<SEGA)|(0<<SEGB)|(1<<SEGC)|(0<<SEGD)|(0<<SEGE)|(1<<SEGF)|(0<<SEGG);break;
		case 3:
		PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(0<<SEGD)|(1<<SEGE)|(1<<SEGF)|(0<<SEGG);break;
		case 4:
		PORTC=(1<<SEGA)|(0<<SEGB)|(0<<SEGC)|(1<<SEGD)|(1<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
		case 5:
		PORTC=(0<<SEGA)|(1<<SEGB)|(0<<SEGC)|(0<<SEGD)|(1<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
		case 6:
		PORTC=(0<<SEGA)|(1<<SEGB)|(0<<SEGC)|(0<<SEGD)|(0<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
		case 7:
		PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(1<<SEGD)|(1<<SEGE)|(1<<SEGF)|(1<<SEGG);break;
		case 8:
		PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(0<<SEGD)|(0<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
		case 9:
		PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(0<<SEGD)|(1<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
		case 99: //OFF Все сегменты
		PORTC=(1<<SEGA)|(1<<SEGB)|(1<<SEGC)|(1<<SEGD)|(1<<SEGE)|(1<<SEGF)|(1<<SEGG);break;
	}
}

#define CONFIG_AMOUNT 6
typedef struct
{
	char FlagPower;
	char ValuePWM;
}ConfigurationLamp;

EEMEM ConfigurationLamp E_ConfigLamp[CONFIG_AMOUNT];
ConfigurationLamp ConfigLamp[CONFIG_AMOUNT];
//-----------------------------------------------------------------------------------------------------

void LoadingEEPROM()
{
	eeprom_read_block((void*)ConfigLamp, (void*)E_ConfigLamp, sizeof(ConfigLamp));
}

void SaveEEPROM()
{
	eeprom_update_block((void*)ConfigLamp, (void*)E_ConfigLamp, sizeof(ConfigLamp));
}
//Функция записи значения PWM
void WriteValue(unsigned char Zona,unsigned char ValuePWM)
{
	switch (Zona)
	{
		case 0:OCR0A=ValuePWM*2.56;break;
		case 1:OCR0B=ValuePWM*2.56;break;
		case 2:OCR1AL=ValuePWM*2.56;break;
		case 3:OCR1BL=ValuePWM*2.56;break;
		case 4:OCR2A=ValuePWM*2.56;break;
		case 5:OCR2B=ValuePWM*2.56;break;
	}
}
//Функция считывания значения PWM
char ReadValue(unsigned char Zona)
{
	static unsigned char ValuePWM=0;
	switch (Zona)
	{
		case 0:ValuePWM=OCR0A;break;
		case 1:ValuePWM=OCR0B;break;
		case 2:ValuePWM=OCR1AL;break;
		case 3:ValuePWM=OCR1BL;break;
		case 4:ValuePWM=OCR2A;break;
		case 5:ValuePWM=OCR2B;break;
	}
	return(ValuePWM/2.56);
}
//Функция вывода значений на 7SEG индикатор. 
unsigned char ZoneNumber=0;
unsigned char count = 0;
void WriteSeg(unsigned char NumberZon,unsigned char ValuePWM)
{
	
	unsigned char data1=ValuePWM%10;
	unsigned char data2=ValuePWM/10;
	PORTB |=(1<<ANOD1);
	PORTD |=(1<<ANOD2);
	PORTD |=(1<<ANOD3);
	segchar(99);
	if(ConfigLamp[NumberZon].FlagPower==1)
	{
		count++;
		if (count==1){
			PORTB &= ~(1<<ANOD1);
			segchar(data1);
			PORTD |=(1<<ANOD2);
			PORTD |=(1<<ANOD3);
		}
		if (count==2){
			PORTD &= ~(1<<ANOD2);
			segchar(data2);
			PORTB |=(1<<ANOD1);
			PORTD |=(1<<ANOD3);
		}
		if (count==3){
			PORTD &= ~(1<<ANOD3);
			segchar(NumberZon+1);
			PORTB |=(1<<ANOD1);
			PORTD|=(1<<ANOD2);
		}
		if (count==3){count=0;}
	}
}

/*****************************************Обновление Значений PWM********************************************************/
float TempValuePWM=0;
void UpdateValue()
{
	for (unsigned char ZonaCount = 0; ZonaCount < CONFIG_AMOUNT; ZonaCount++)
	{
		TempValuePWM=ReadValue(ZonaCount);
		if (ConfigLamp[ZonaCount].FlagPower==1)
		{
			if (TempValuePWM==0)
			{
				//Плавный Запуск
				TempValuePWM=1;
				while(TempValuePWM<ConfigLamp[ZonaCount].ValuePWM)
				{
					TempValuePWM=TempValuePWM+TempValuePWM/40;
					WriteValue(ZonaCount,TempValuePWM);
					WriteSeg(ZonaCount,TempValuePWM);
					_delay_ms(13);
				}
			}
			WriteValue(ZonaCount,ConfigLamp[ZonaCount].ValuePWM);
		}
		else
		{
			WriteValue(ZonaCount,0);
		}
		
	}
}

char Stop=1;
ISR(INT0_vect)
{
	WriteSeg(ZoneNumber,ConfigLamp[ZoneNumber].ValuePWM);
	UpdateValue();
	BtnExe();
}
void BtnUpdate(void)
{
	char BtnMask = BtnGet ();
	if (BtnMask == BTN_SHRT_POWER)
	{
		ConfigLamp[ZoneNumber].FlagPower++;
		if (ConfigLamp[ZoneNumber].FlagPower>1)
		{
			ConfigLamp[ZoneNumber].FlagPower=0;
		}
		SaveEEPROM();
	}
	if ((BtnMask == BTN_SHRT_SW))
	{
		ZoneNumber++;
		if (ZoneNumber==6)
		{
			ZoneNumber=0;
		}
	}
	//одиночное нажатие +
	if ((BtnMask == BTN_SHRT_UP)& (ConfigLamp[ZoneNumber].ValuePWM < 99)&(ConfigLamp[ZoneNumber].FlagPower==1))
	{
		ConfigLamp[ZoneNumber].ValuePWM++;
		SaveEEPROM();
	}
	//одиночное нажатие -
	if ((BtnMask == BTN_SHRT_DN)& (ConfigLamp[ZoneNumber].ValuePWM > 0)&(ConfigLamp[ZoneNumber].FlagPower==1))
	{
		ConfigLamp[ZoneNumber].ValuePWM--;
		SaveEEPROM();
	}
	//Удержание +
	if ((BtnMask == BTN_LONG_UP) & (ConfigLamp[ZoneNumber].ValuePWM < 99)&(ConfigLamp[ZoneNumber].FlagPower==1))
	{
		while ((!(PINB&0b10000000))& (ConfigLamp[ZoneNumber].ValuePWM < 99))
		{
			ConfigLamp[ZoneNumber].ValuePWM++;
			_delay_ms(50);
		}
		SaveEEPROM();
	}
	//Удержание -
	if ((BtnMask == BTN_LONG_DN) & (ConfigLamp[ZoneNumber].ValuePWM > 0)&(ConfigLamp[ZoneNumber].FlagPower==1))
	{
		while ((!(PINB&0b01000000))& (ConfigLamp[ZoneNumber].ValuePWM > 0))
		{
			ConfigLamp[ZoneNumber].ValuePWM--;
			_delay_ms(50);
		}
		SaveEEPROM();
	}
}

int main(void)
{
	cli();
	LoadingEEPROM();
	init_io();
	BtnInit();
	init_int0();
	init_pwm();
	sei();
    while(1)
    {
		BtnUpdate();
	}
	return 0;
}
А вот и схемки.
Изображение
Изображение

Добавлено after 5 minutes 23 seconds:
Уважаемые модераторы форма, если есть возможность скопировать данный пост в первый, был бы благодарен вам.
Последний раз редактировалось 7seg Пн окт 23, 2017 10:40:19, всего редактировалось 1 раз.
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

МОИ ПОЗДРАВЛЕНИЯ похоже всеже довели проект ДО УМА имено КАК ХОТЕЛИ и не долго мало кто может этим похвастатся
обычно хотят одно, а получается ..."НУ КАК ВСЕГДА"
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

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

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

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

В схему пришлось внести изменения)
По питанию драйверов были поставлены 7815. Также был исключен детектор нуля , в место него внешний тактовый генератор на 150Hz.

Добавлено after 3 minutes 30 seconds:
Испытания с нагрузкой 21КВт еще не проводились , пока нет подходящей сети под рукой (
andrei23061996@gmail.com
.................................................................................................................
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

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

Провел первые испытания с мощной нагрузкой.
Схема включения:

И заметил странную вещь греются кондеры С9,C10,С11(они стоят по питанию). они на 630V.Может быть подскажет кто почему ?
Схема включения:
СпойлерИзображение
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 36290
Зарегистрирован: Чт июн 04, 2009 21:06:49
Откуда: г.Мариинск

Сообщение Телекот »

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

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

а как узнать(рассчитать) какой макс ток может пропустить через себя кондер, просто раньше не было даже причин этим интересоваться.
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

вабщето там должны стоять кондеры спецовые расчитаные на реактиф постояно...( бумага в масле) пленка не рулит-выгорает быстро
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

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

Первые запуски делал без этих кондеров, кондеры решил поставить для подавления помех.
А если совсем без кондеров при нагрузки 6-7.2кВт чем данное решения может осложнить жизнь (кроме грязной сети)
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 36290
Зарегистрирован: Чт июн 04, 2009 21:06:49
Откуда: г.Мариинск

Сообщение Телекот »

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

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

Пока оставлю этот проект до внедрения в прошивку модбаза.
Транзисторы слава богу от перенапруги не пробивает))

Добавлено after 1 hour 23 minutes 14 seconds:
добавлю еще при мощности 22кВт (12 транзисторов) водяное охлаждение радиатора обязательно.

Добавлено after 4 minutes 17 seconds:
В сумме получается что помех на соседню фазу 0, а в сети(по фазе) не так много как при использовании симисторов.
Мб кто подскажет какие транзисторы лучше использовать нагрузка на канал 3.6кВт 220В ,Чтоб поменьше грелись.
Частота ШИМ 4kHz хочу поднять до 20( что бы не было слышно свиста).
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 36290
Зарегистрирован: Чт июн 04, 2009 21:06:49
Откуда: г.Мариинск

Сообщение Телекот »

Что бы меньше грелись надо использовать симисторы, я об этом говорил в начале темы. Помех от них не может быть больше, они открываются с частотой 100Гц. А ваши транзисторы открываются 4000 раз в секунду и столько же раз закрываются. Значит излучают пачки помех 8000 раз в секунду, они просто менее заметны так как сливаются в общий фон.
Тем кого не устаревает наличия ошибок в моем тексте, оставляю права не пользоваться моими советами или просто не читать мои сообщения.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

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

У симисторов есть проблема они ограничиваются 40А (BTA41-800).
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 36290
Зарегистрирован: Чт июн 04, 2009 21:06:49
Откуда: г.Мариинск

Сообщение Телекот »

:))
http://asenergi.com/catalog/tiristory-silovye/t151.html
http://asenergi.com/catalog/tiristory-s ... 1-200.html
Который может выдержать ударный ток в 2 000 Ампер.
Есть и мощнее.
Тем кого не устаревает наличия ошибок в моем тексте, оставляю права не пользоваться моими советами или просто не читать мои сообщения.
Ответить

Вернуться в «Питание»