Группа: Gold Member
Сообщений: 1537
Регистрация: 30.11.06 Авторитет: 13
Вне форума
Предупреждения: (0%)
Стабилизатор собран. Работает, но проблематично. Проверял в нагрузке до 4 киловат все работает. но время от времени в режиме переключения обмоток сгорает один из предохранителей, показанных на рисунке красным.
В чем проблема? Возможно неправильно организовано переключение в прошивке?
Код
void FU(unsigned int v_in) { if (v_in<100) {fout=0b00000000; er=1;} else if (v_in<160) {fout=0b00000001; er=0;} else if (v_in<180) {fout=0b00000010; er=0;} else if (v_in<200) {fout=0b00000100; er=0;} else if (v_in<220) {fout=0b00001000; er=0;} else if (v_in<240) {fout=0b00010000; er=0;} else if (v_in<260) {fout=0b00100000; er=0;} else {fout=0b00000000; er=1;} PORTC=fout; }
Возможно проблема в деталях? Уже перерыл все возможные проблемы, не могу понять из-за чего возникает такой ток? тем более при малых нагрузках (100-200 Ватт), в то время как при больших нагрузках работает.
Проблема именно во время переключения обмоток, но не постоянно дефект проявляется, а примерно 1 раз на 20-50 переключений.
Использованы симисторы ВТА40-800, оптика MOC3061
P.S. Надеюсь поможете разобраться с проблемой
____________________
Двое всегда договорятся, если хотя бы один из них не дурак.
Группа: Silver Member
Сообщений: 850
Регистрация: 02.07.06 Авторитет: 3
Вне форума
Предупреждения: (0%)
Да, походу дело в управлении. Один тиристор включается в тот момент когда предыдущий еще не выключился. Надо следить за переходом через 0 и после этого переключать. Причем этот переход надо ловить не у напряжения а у тока нагрузки.
Группа: Silver Member
Сообщений: 850
Регистрация: 02.07.06 Авторитет: 3
Вне форума
Предупреждения: (0%)
Проблемы возникают при малых мощностях из-за индуктивности трансформатора. Её влияние на общий ток нагрузки становится большим и при переходе сетевогонапряжениячерез 0, ток еще не равен 0. Соответственно, тиристор не успевает закрытся перед тем как откроется другой.
Чем вообще переходчерез 0 измеряется, приведите всю схему.
Группа: Gold Member
Сообщений: 1537
Регистрация: 30.11.06 Авторитет: 13
Вне форума
Предупреждения: (0%)
в оптике MOC3061 встроенный детекторпереходачерезноль. Да я тоже подозреваю что коротят две обмотки, но пробовал во void FU(unsigned int v_in) перед переключением отключать все тиристоры (PORTC=0b00000000;) и делать небольшую задержку - не помогло. Думаю дальше.
____________________
Двое всегда договорятся, если хотя бы один из них не дурак.
Группа: Silver Member
Сообщений: 850
Регистрация: 02.07.06 Авторитет: 3
Вне форума
Предупреждения: (0%)
Цитата(svip @ 18 Декабря, 2008, 10:37)
в оптике MOC3061 встроенный детекторпереходачерезноль.
Это не совсем тот детектор, который нужен. "Zero Crossing Circuit" который там стоит, просто не позволяет включить тиристор, при падении напряжения на нем более 20В.
В вашем случае, надо мерять переходчерез 0 ТОКА нагрузки, а не напряжения! Соответственно "Zero Crossing Circuit" абсолютно бесполезен.
Если нет желания городить детектортока, то надо просто делать паузу между переключениями. Длительность паузы должна равнятся как минимум длительности 2-х полупериодов сетевогонапряжения( 2*10mS для 50Hz), чтобы гарантированно все тиристоры выключились перед включением.
Группа: Silver Member
Сообщений: 850
Регистрация: 02.07.06 Авторитет: 3
Вне форума
Предупреждения: (0%)
Да, еще тут пришло на ум. Неплохо бы сделать небольшой гистерезис для порогов переключения. Сейчас, если напряжение 180В то включена одна обмотка, а если 179 - то другая. Получается, что при небольших колебаниях напряжения около 180В девайс будет постоянно включать то одну то другую обмотки. Лучше сделать так- переключение на 1-ю при Uin<(180-dU), а переключение обратно на вторую при Uin>(180+dU). dU взять примерно 2..3В.
Группа: Gold Member
Сообщений: 1537
Регистрация: 30.11.06 Авторитет: 13
Вне форума
Предупреждения: (0%)
gccrim да так и хотел сделать, но, как не стыдно сказать, ничего толком не получилось. Или мозги кипели или еще что - хз. но так я и не догнал как сделать плавающую точку переключения.
____________________
Двое всегда договорятся, если хотя бы один из них не дурак.
Группа: Silver Member
Сообщений: 850
Регистрация: 02.07.06 Авторитет: 3
Вне форума
Предупреждения: (0%)
Цитата(svip @ 19 Декабря, 2008, 12:29)
но так я и не догнал как сделать плавающую точку переключения
Примерно так:
void FU(unsigned int v_in) { static unsigned char f_out_temp = 0b00000000; static unsigned int v_in_prev = 0; //предыдущее значение v_in
const signed int dU_const = 2; //величина гест. signed int dU;
//Выбираем в какую сторону сдвигать точку перекл. //В зависимости от того, куда меняется входное напряжение if (v_in_prev < v_in) dU = dU_const; else dU = -dU_const;
Группа: Gold Member
Сообщений: 1537
Регистрация: 30.11.06 Авторитет: 13
Вне форума
Предупреждения: (0%)
НЕ прокатил этот вариант. часа два проработал и сдох один из предохранителей. (пробовал разные варинаты задержки) - все равно сдыхает. Нужно будет нарисовать всю схему и прошивку, может где напортачил.
____________________
Двое всегда договорятся, если хотя бы один из них не дурак.
Группа: Silver Member
Сообщений: 850
Регистрация: 02.07.06 Авторитет: 3
Вне форума
Предупреждения: (0%)
О... ну так с этого и надо было начинать.
Частоту тактирования надо устанавливать однозначно, это ведь не операционка.
Библиотечные delay_ms() просто выполняют некоторое кол-во NOPов, при этом полагаясь на "какую-то" константу которая должна соответствовать тактовой частоте. Что то вроде: #define Fclk 1200000 в Libr_Name.h файле.
По опыту знаю, лучше писать процедуру задержки самому используя какой либо таймер.
Что касается фьюс битов, то хоть они и называются битами, физически записываются в контроллер побайтово. И если их писать, то устанавливать надо все. Иначе ХЗ что запишится на место неустановленных. Тем более что фьюсы определяют кучу основных параметров, в том числе и источник тактирования, коэффициент деления тактовой, вотчдог и пр.
Вообщем, нет никакой гарантии, что 20mS пауза действительно длится именно это время.
unsigned int i; unsigned int f1=0; unsigned int f2=0; unsigned int v_in; unsigned int v_out; unsigned int volt; unsigned char fout; unsigned char er=0; unsigned int Vpr=0;
void in(unsigned int v_in) { int temp[4]; if (f2>=10){lcd_clear_my();f2=0;} else f2++; //lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("INPUT "); itoa(v_in,temp); lcd_puts(temp); lcd_putsf(" VOLT"); }
void out(unsigned int v_out) { int temp[4]; if (f1>=10){lcd_clear_my();f1=0;} else f1++; lcd_gotoxy(0,1); if (er==1) lcd_putsf("OUT OF 140-260"); else { itoa(v_out,temp); lcd_putsf("OUTPUT "); lcd_puts(temp); lcd_putsf(" VOLT"); } }
void FU(unsigned int v_in) { if (v_in<100) {fout=0b00000000; er=1;} else if (v_in<160) {fout=0b00000001; er=0;} else if (v_in<180) {fout=0b00000010; er=0;} else if (v_in<200) {fout=0b00000100; er=0;} else if (v_in<220) {fout=0b00001000; er=0;} else if (v_in<240) {fout=0b00010000; er=0;} else if (v_in<260) {fout=0b00100000; er=0;} else {fout=0b00000000; er=1;} PORTC=fout; }
unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; }