Обсуждаем контроллеры компании Atmel.
Ответить

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

Вт май 23, 2017 02:56:31

Столкнулся с проблемой работы моей программки. Димер Работает отлично если подключен к одной фазе(или просто к сети). Но как только подключению 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

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

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

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

Вт май 23, 2017 05:17:27

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

Добавлено after 2 minutes 43 seconds:
Вроде нашел помеху которую симистор дает в сеть. походу она и дает сбои.
Вложения
для Ф.JPG
схемка
(228.61 KiB) Скачиваний: 799

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

Вт май 23, 2017 05:38:19

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

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

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

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

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

Вт май 23, 2017 06:42:41

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

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

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

Осциллограммы.
СпойлерИзображение
Изображение
Вложения
оцил синх2.JPG
(145.96 KiB) Скачиваний: 533
оцил синх.JPG
(143.08 KiB) Скачиваний: 527

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

Вт май 23, 2017 07:43:18

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

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

Вт май 23, 2017 07:54:22

7seg Можно посоветовать убирать помеху на ВВ входе и отказаться от трансов, которые действительно двигают фазу, причем зависимую от нагрузки на оный. Например, у меня сделано так
СпойлерИзображение
Блок_питания.png
(9.86 KiB) Скачиваний: 555

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

Вт май 23, 2017 08:21:21

Вот насчет сети если честно не знаю.(
А почему трансы должны двигать фазу на вторичной обмотке ?

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

Вт май 23, 2017 08:51:14

если есть.возможность — добавь цифровую фильтрацию т.е. не жди сигнала, когда его быть не должно, ну и перепроверяй вход — эти помехи короткие и такая проверка должна помочь.
Кстати RC фильтры двигают фазу.

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

Вт май 23, 2017 09:24:28

Ну цифровая фильтрация я не считаю что это хорошая идея.

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

Вт май 23, 2017 09:44:32

а зря, у меня в конструкции с тиристорами (попроще конечно, 1фазная) цифровая фильтрация оказалась необходимой и достаточной мерой, из железа остался высокоомный резюк (с фазы на вход) и два диода на плюс и на корпус для защиты ноги от перенапряжения. (конструкция не отвязана от сети)

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

Вт май 23, 2017 11:38:43

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

Немного посмотрев на работу димера понял в какие моменты включения симистора идет сбой.
Изображение
Вложения
фазы.JPG
(41.08 KiB) Скачиваний: 1127

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

Вт май 23, 2017 13:36:30

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

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

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

Вт май 23, 2017 15:06:59

Z_h_e, Paint из вин хп )

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

Чт май 25, 2017 03:15:18

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

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

Чт май 25, 2017 04:31:13

угу, попробуй сделать так чтобы ток нарастал помедленнее (небольшую индуктивность в силовую цепь добавь)

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

Чт май 25, 2017 04:42:31

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

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

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

Чт май 25, 2017 05:19:58

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

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

Чт май 25, 2017 05:34:40

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

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