Модернизация скоростного счётчика для трёхфазного выпрямителя

Создание трёхфазного выпрямителя.

Хотел бы вот такое устройство и программу...
Ответить
Elektromehanic
Рядовой
Сообщения: 7
Зарегистрирован: 14.11.2023{, 09:06}
Репутация: 3
Откуда: Люберцы
Имя: Владимир

Модернизация скоростного счётчика для трёхфазного выпрямителя

#1

Сообщение Elektromehanic » 28.12.2023{, 12:21}

Если возможно, нужно модернизировать блок скоростного счётчика. Нужно это для создания трёхфазного тиристорного выпрямителя. С однофазным выпрямителем (регулятором) всё получается. Суть вот в чём. После сигнала с детектора нуля (переход синусоиды через ноль), с помощью скоростного счётчика формируется импульс длительностью, скажем, 32 микросекунды, чего более, чем достаточно для открывания любого тиристора (симистора). Задержка импульса, после перехода через ноль, осуществляется также с помощью скоростного счётчика. Задержка должна быть, в идеале, от 0 до 10 миллисекунд (время одного полупериода сетевого напряжения 50 герц). Регулировка осуществляется потенциометром. Это для однофазного выпрямителя (регулятора). Но нужен ещё один такой же импульс (для отрицательного полупериода). В блоке скоростного счётчика возможно задать только один пин контроллера для выхода. Я выходил из положения следующим образом. Находил в коде строки с выходом, который указывал в блоке скоростного счётчика, и подставлял строку с номером пина, который мне нужен. Например. В блоке я указал выход контроллера «9». В коде встречается:
pinMode(9, OUTPUT); далее digitalWrite(9, 0); далее digitalWrite(9, 1); и после этих строк вставлял:
pinMode(10, OUTPUT); digitalWrite(10, 0); digitalWrite(10, 1);
Так вот, в блоке скоростного счётчика для трёхфазного выпрямителя надо создать: 1. Возможность задавать ещё один пин выхода. 2. Задавать задержку импульса на этом пине. Задержка должна составлять 3333 микросекунды. Но так как детектор нуля у нас не идеальный должна быть возможность изменять эту задержку. (Определяется при отладке).
В прикреплённом файле "Трёхфазный", скетч можно использовать для однополупериодного трёхфазного выпрямителя. Для двухполупериодного нужна модернизация скоростного счётчика.
P.S. За выполнение заказа готов предоставить вознаграждение.
Вложения
Трёхфазный.flp
(101.08 КБ) 25 скачиваний
Однофазный.flp
(58.16 КБ) 23 скачивания

XENOMAN
Рядовой
Сообщения: 49
Зарегистрирован: 05.10.2015{, 18:03}
Репутация: 6

Модернизация скоростного счётчика для трёхфазного выпрямителя

#2

Сообщение XENOMAN » 28.12.2023{, 23:11}

Здрасте, в свое время тоже пытался делать СИФУ(УПП) на основе АТМег - успехом не увенчалось(нагрузка была подключена треугольником), возможно знаний не хватило или терпения, вот пара кусков кода, может поможет -
ATmega32u4 ArduinoIDEПоказать

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

/* ------------*/
/* INPUTS PINS */
/* ------------*/
const byte L1_ZC_Pin  = 2;
const byte L2_ZC_Pin  = 3;
const byte L3_ZC_Pin  = 7;

const byte L1_SCR_Pin = 4;
const byte L2_SCR_Pin = 5;
const byte L3_SCR_Pin = 6;

const byte pot_pin    = A5;
const byte enable_pin = 12;
const byte lamp_pin   = 11;

/* ----------*/
/* CONSTANTS */
/* ----------*/
const long iDelay         = 1000;  // Sampling delay/interval [µs]
const int SCR_Pulse_Width = 100;    // SCR Pulse-width [µs]
const int minimumDelay    = 300;    // Minimum firing-delay at max power [µs]
const float smoothFactor  = 0.95;   // Smoothing value for fire delay [0-1].
const long iLamp          = 500000; // Blink-intervall for errorlamp

/* ----------*/
/* VARIABLES */
/* ----------*/
int potValue;             // Raw value of the potentiometer
int enableState;          // State of the enable-switch
int pEnableState;         // Previous state of the enable-switch
int enable = 1;           // Variable for enabling firing
int errorLampState;       // State of error-lamp
int error;                // Error-state

volatile byte L1_ZC_Trg;  // Variable triggered by ISR for Zero Cross
volatile byte L2_ZC_Trg;  // Variable triggered by ISR for Zero Cross
volatile byte L3_ZC_Trg;  // Variable triggered by ISR for Zero Cross

float frequency;
float delayValAvg;        // Smoothed fire delay from measured samples
int rawFireDelay;         // Fire delay mapped from potmeter value and delta time for ZC

volatile unsigned long dT_ZC_INT;  // time between zero crosses
unsigned long pDelay;              // Previous time a sample happened
volatile unsigned long pL1_ZC;     // Previous time zero cross phase L1
volatile unsigned long pL2_ZC;     // Previous time zero cross phase L2
volatile unsigned long pL3_ZC;     // Previous time zero cross phase L3
unsigned long pL1_SCR;             // Previous time L1 SCR was fired
unsigned long pL2_SCR;             // Previous time L2 SCR was fired
unsigned long pL3_SCR;             // Previous time L3 SCR was fired
unsigned long microsNow;           // Time now

unsigned long pErrorLamp;           // Previous state change of error-lamp


void setup() {
  // Initialize IO-Pins
  pinMode(L1_ZC_Pin, INPUT);
  pinMode(L2_ZC_Pin, INPUT);
  pinMode(L3_ZC_Pin, INPUT);

  pinMode(L1_SCR_Pin, OUTPUT);
  pinMode(L2_SCR_Pin, OUTPUT);
  pinMode(L3_SCR_Pin, OUTPUT);

  // Activate interrupt routines
  attachInterrupt(digitalPinToInterrupt(L1_ZC_Pin), L1_ZC, RISING);
  attachInterrupt(digitalPinToInterrupt(L2_ZC_Pin), L2_ZC, RISING);
  attachInterrupt(digitalPinToInterrupt(L3_ZC_Pin), L3_ZC, RISING);

  Serial.begin(9600);
}

void loop() {
  while(1) {
    microsNow = micros(); // Save current time
    enableState = digitalRead(enable_pin); // Read pin state of enable-switch
   
    // Sample potmeter and time for zero-cross
    if ( microsNow - pDelay >= iDelay ) {
      pDelay = microsNow;
   
      potValue = analogRead(pot_pin); // Read value from potensiometer

      // Map the delay time from the potentiometer
      // from "minimumDelay" to "zero-cross delta time"
      // Unit: µseconds
      rawFireDelay = map(potValue, 1023, 0, minimumDelay, dT_ZC_INT);
 
      // Low Pass filtering of raw values
      delayValAvg = delayValAvg * smoothFactor + rawFireDelay * (1-smoothFactor);
    }
 
    // Firing-algorithm
    if ( enable ) {
      digitalWrite(lamp_pin, HIGH); // Turn on indicator
     
      // Firing L1 SCR if trig'd
      if ( L1_ZC_Trg && (microsNow - pL1_ZC) >= (int)delayValAvg ) {
        L1_ZC_Trg = 0; // Disable bit for L1 Trigger
        digitalWrite(L1_SCR_Pin, HIGH);
      }
 
      if ( L2_ZC_Trg && (microsNow - pL2_ZC) >= (int)delayValAvg ) {
        L2_ZC_Trg = 0; // Disable bit for L2 Trigger
        digitalWrite(L2_SCR_Pin, HIGH);
      }
 
      if ( L3_ZC_Trg && (microsNow - pL3_ZC) >= (int)delayValAvg ) {
        L3_ZC_Trg = 0; // Disable bit for L3 Trigger
        digitalWrite(L3_SCR_Pin, HIGH);
      }
    } else {
      digitalWrite(lamp_pin, HIGH);
    }
 
    // Error-function. Blinking if error-bit is enabled
    if ( error && (microsNow - pErrorLamp) >= iLamp ){
      errorLampState = !errorLampState;
      digitalWrite(lamp_pin, errorLampState);
    }
  }
}

// ISR for Phase L1
void L1_ZC () {
  digitalWrite(L1_SCR_Pin, LOW);
  L1_ZC_Trg = 1;                    // Enable bit for L1 Trigger
  dT_ZC_INT = microsNow - pL1_ZC;   // Calculate current zero cross delta time
  pL1_ZC = microsNow;               // Set previous zero cross to "now"
}

// ISR for Phase L2
void L2_ZC () {
  digitalWrite(L2_SCR_Pin, LOW);
  L2_ZC_Trg = 1;                    // Enable bit for L2 Trigger
  pL2_ZC = microsNow;               // Set previous zero cross to "now"
}

// ISR for Phase L1
void L3_ZC () {
  digitalWrite(L3_SCR_Pin, LOW);
  L3_ZC_Trg = 1;                    // Enable bit for L3 Trigger
  pL3_ZC = microsNow;               // Set previous zero cross to "now"
}
ATmega16 АссемблерПоказать

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

;***************************************************
;Автор
;Дата
;Версия
;Имя файла
;Для AVR:
;Тактовая частота 4МГЦ
;**************************************

; SUT =0 CKsel =1
;Выполняемые функции:
; 
.device ATmega16
.Include "m16def.inc"
.List
;===================================
;Объявления:
.Def Temp =r16
.Def Gener =r17
.Def OnImpulsABC =r18
.Def CounterA =r19           
.Def CounterB =r20
.Def CounterC =r21
.Def Alfa = r22


.Equ AlfaNach = 100
.Equ ConstGener = 180

.Equ OnA = 1
.Equ OnB = 2
.Equ OnC = 4
 
.Equ OffA = 6
.Equ OffB = 5
.Equ OffC = 3



;===================================
;Начало программы
.Cseg
.org LARGEBOOTSTART
        jmp Init

.ORG OVF0AddR
        Rjmp IntTimer0 

.ORG OVF1AddR
        Rjmp IntTimer1 

.ORG OVF2AddR
        Rjmp IntTimer2 


.org AdccAddr 
        RJmp AdcDataOk


.Org ErdyAddr
        RetI

.Org Int0Addr
      ; jmp Init
    Rjmp Int_0 

.Org Int1Addr
        Rjmp Int_1 

.Org Int2Addr
        Rjmp Int_2 






; НАЧАЛО ПРОЦЕДУР
;===================================
.Org $100




;инициализация чипа 
;======================================================================
Init:
				
				Ldi Temp,0
				Out PortA,Temp
    			Ldi Temp,(1<<PA0)|(1<<PA1)|(1<<PA2) ;импульсные трансфораоры фаз А В С
                Out DdrA, Temp ;направление порта A 
        
				Ldi Temp,(1<<PB2);  прерывание от фазы С - INT 2 
				Out PortB,Temp				
				Ldi Temp,0
				Out DdrB, Temp ;направление порта B 

				Ldi Temp,(1<<PC0) ;С0 - выход вкл пускаеля   ON = "0"
				Out PortC,Temp				
				Ldi Temp,(1<<PC0)
	            Out DdrC, Temp ;направление порта C Out24V                              

				Ldi Temp,(1<<PD2)|(1<<PD3) ;прерывание от фазы A - INT 0    и  от фазы B - INT 1
				Out PortD,Temp								
				Ldi Temp,0
                Out DdrD, Temp ;направление порта D 
								

				In Temp,Sfior
				Cbr Temp,Pud
				Out Sfior,Temp
				
				Ldi Temp,(1<<WDE)|(1<<WDToe) 
                Ldi r17,16
                Out Wdtcr,Temp ;сторожевой таймер
                Out Wdtcr,r17

                ldi Temp,low(RamEnd)
				Out Spl,Temp         ;указатель стёка
                ldi Temp,high(RamEnd)
				Out Sph,Temp         ;указатель стёка

                Ldi Temp,ConstGener
				Out TcNt0,Temp ;регистр счета таймера 0
				Ldi Temp,(0<<Cs02)|(0<<Cs01)|(1<<Cs00);1<<Cs00 выбрать предделитель таймера 1
				Out Tccr0,Temp;


				Ldi Temp,255
				Out Tcnt1H,Temp;регистр счета таймера 1
				Ldi Temp,100
				Out Tcnt1L,Temp
    			Ldi Temp,(0<<Cs12)|(1<Cs11)|(1<<Cs10); выбрать предделитель таймера 1
				Out Tccr1B,Temp	  ;регистр управления таймер 1				
	
	            Ldi Temp,0
				Out TcNt2,Temp ;регистр счета таймера 2
						        
				Ldi Temp,(1<<Toie0)|(1<<Toie1)|(0<<Toie2) ;прерывание таймера 0, таймера 1
                Out Timsk,Temp ;регистр прерываний от таймеров

				Ldi Temp,(1<<int1)|(1<<Int0)|(1<<Int2)
				Out Gimsk,Temp ; рег разрешения внешних прерываний 
				               ; INT0 ПО СПАДУ  INT1 ПО СПАДУ          управление спящим режимом   
				Ldi Temp,(1<<ISC01)|(0<<Isc00)|(1<<Isc11)|(0<<Isc10) ;прерывание по Cпаду это начало полуволны
				Out Mcucr,Temp ;Рег генерации внешних прерываний
				
				Ldi Temp,(0<<ISC2);прерывание по Cпаду это начало полуволны
				Out McucSr,Temp ;Рег генерации внешних прерываний
                            ; асп привязоно к INT0
				Ldi Temp,(1<<AdpS2)|(1<<AdpS1)|(0<<AdpS0)|(1<<AdIe)|(1<<AdEn)|(0<<AdSc)|(1<<ADate)
				Out AdcSr,Temp 
 				Ldi Temp,(0<<Mux3)|(1<<Mux2)|(1<<Mux1)|(0<<Mux0)|(0<<Refs1)|(1<<Refs0)|(0<<Adlar) 
				Out AdMux,Temp            ; асп привязоно к INT0
				Ldi Temp,(0<<AdTs2)|(1<<AdTs1)|(0<<AdTs0)
				Out SfIor,Temp


                SbI AdcSr,AdSc

                Ldi Alfa,AlfaNach
                Clr OnImpulsABC
				Clr Zh ;счетчик для выдержки времени
				CLr Zl
				Clr Gener

                
				Sei				
                            
				

                
;*********************************************************************
;*********************************************************************
;*********************************************************************
Loop:				
 				Wdr ;сброс сторожевого таймера
 ;Проверяем если фаза А,В,С Проходит Через '0' что соответсвует PinD2 = 1,  PinD3 = 1, PinB2 = 1  
 ;   то отключаем соответствующую фазу 

			



				Rjmp Loop
 



 


  







;===================================
;ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 0 
IntTimer0:

			    Push Temp							    
				In Temp,Sreg
				Push Temp

                Ldi Temp,ConstGener
				Out TcNt0,Temp ;регистр счета таймера 0				
				
                SbiC PinD,PD2 ;A				
                AnDi OnImpulsABC,OffA				
				
				SbiC PinD,PD3  ;B				
                AnDi OnImpulsABC,OffB								
				
				SbiC PinB,PB2	;C			
                AnDi OnImpulsABC,OffC												

  				And Gener,OnImpulsABC
			    
				Eor Gener,OnImpulsABC

    			Out PortA,Gener								
				
				Pop Temp
                Out Sreg,Temp
			    Pop Temp				
				RetI




;===================================
;ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 1 
IntTimer1:
			    Push Temp
				In Temp,Sreg
				Push Temp
				
    			Ldi Temp,255
				Out Tcnt1H,Temp;регистр счета таймера 1
				Ldi Temp,100
				Out Tcnt1L,Temp   
                
				Out PortC,OnImpulsABC

				Cpi CounterA,0
				BrEq TestFazeBC

				Cpi CounterA,1
				BrNe Desale_A
				Ori OnImpulsABC,OnA
Desale_A:
				Dec CounterA 							

               

TestFazeBC:                				

                Cpi CounterB,0
				BrEq TestFazeC

				Cpi CounterB,1
				BrNe Desale_B
				Ori OnImpulsABC,OnB
Desale_B:
				Dec CounterB 




TestFazeC:
                Cpi CounterC,0
				BrEq ExitTimer1
                
				Cpi CounterC,1
				BrNe Desale_C
				Ori OnImpulsABC,OnC
Desale_C:
				Dec CounterC 


ExitTimer1:
				Pop	Temp
				Out Sreg,Temp		
				Pop Temp
        	    RetI

;===================================
;ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 2 
IntTimer2:
			    Push Temp
				In Temp,Sreg
				Push Temp
				
				Pop	Temp
				Out Sreg,Temp		
				Pop Temp
        	    RetI






;===================================
;ПРЕРЫВАНИЯ синхронизация фаза А 
Int_0: 

			    Push Temp
				In Temp,Sreg
				Push Temp

                Mov CounterA,Alfa 
                AndI OnImpulsABC,OffA
 		
				Pop	Temp
				Out Sreg,Temp		
				Pop Temp
        	    RetI




;ПРЕРЫВАНИЯ синхронизация фаза В 
Int_1: 

			    Push Temp
				In Temp,Sreg
				Push Temp

                Mov CounterB,Alfa 
                AndI OnImpulsABC,OffB				

				Pop	Temp
				Out Sreg,Temp		
				Pop Temp
        	    RetI


;ПРЕРЫВАНИЯ синхронизация фаза С 
Int_2: 

			    Push Temp
				In Temp,Sreg
				Push Temp

                Mov CounterC,Alfa 
                AndI OnImpulsABC,OffC
				
				Pop	Temp
				Out Sreg,Temp		
				Pop Temp
        	    RetI


;===================================
;ПРЕРЫВАНИЯ ОТ АСП ПО ПРЕОБРАЗОВАНИЮ
AdcDataOk:
			    Push Temp
				In Temp,Sreg
				Push Temp

			    In Alfa,Adcl 
    		    In Temp,Adch 
				Clc
				Ror Temp
				Ror Alfa
				Ror Temp
				Ror Alfa ; код АСП
				
				Ser Temp                   
				Eor  Alfa,Temp

				Pop	Temp
				Out Sreg,Temp		
				Pop Temp
				RetI 
Я выходил из положения следующим образом. Находил в коде строки с выходом, который указывал в блоке скоростного счётчика, и подставлял строку с номером пина, который мне нужен.
Неужели работало?

p.s. ИМХО для подобных задач нужна железка посерьезнее.

Elektromehanic
Рядовой
Сообщения: 7
Зарегистрирован: 14.11.2023{, 09:06}
Репутация: 3
Откуда: Люберцы
Имя: Владимир

Модернизация скоростного счётчика для трёхфазного выпрямителя

#3

Сообщение Elektromehanic » 29.12.2023{, 07:18}

И работало и работает. Однофазный регулятор со стабилизацией или по току или по напряжению успешно трудится на ардуинке нано. Проект полностью реализован мною, если интересно, - расскажу и покажу.
В коде, к сожалению мало, что понимаю (самые азы), благо что есть FLpog!!! Также есть трёхфазный выпрямитель для гальваники со стабилизацией по току на меге. Код писал не я, а хотелось бы самому в FLpog. Если интересно, - спршивайте.
С уважением, Владимир.

Отправлено спустя 41 минуту 51 секунду:
Да, и ещё. Я так понял, что вам нужен не выпрямитель, а регулятор. С этим я думаю проще. На каждую фазу по два тиристора, включённые встречно-параллельно. Тогда можно использовать программку "Трёхфазный.flp" (во вложениях). И ручной правкой кода продублировать каждый из трёх выходов. Или использовать симисторы, тогда ничего править не надо. Пока суть да дело, начну собирать однополупериодный выпрямитель, за одно проверю своё предположение на счёт регулятора. Я думаю, что в конце января будут результаты.

Отправлено спустя 18 минут 22 секунды:
К сожалению ещё плохо ориентируюсь на форуме. Ответил вам, но не знаю увидите ли вы мой ответ.

XENOMAN
Рядовой
Сообщения: 49
Зарегистрирован: 05.10.2015{, 18:03}
Репутация: 6

Модернизация скоростного счётчика для трёхфазного выпрямителя

#4

Сообщение XENOMAN » 29.12.2023{, 10:05}

Elektromehanic писал(а):
29.12.2023{, 08:18}
Также есть трёхфазный выпрямитель для гальваники со стабилизацией по току на меге. Код писал не я, а хотелось бы самому в FLpog. Если интересно, - спрашивайте.
Очень интересно, есть исходники?
По сути что выпрямитель, что регулятор - принцип управления тот же, было бы интересно посмотреть код.

Elektromehanic
Рядовой
Сообщения: 7
Зарегистрирован: 14.11.2023{, 09:06}
Репутация: 3
Откуда: Люберцы
Имя: Владимир

Модернизация скоростного счётчика для трёхфазного выпрямителя

#5

Сообщение Elektromehanic » 29.12.2023{, 10:52}

Принцип управления тот же. Но в нюансах большая разница. Если трёхфазный регулятор можно рассматривать, как 3 однофазных и угол открывания тиристоров (симисторов) будет (в идеале) от 0 до 180 градусов (0 - 10 миллисекунд), то в трёхфазном выпрямителе используются только тиристоры и угол открытия тиристоров лежит между, так называемыми, естественными точками открывания тиристоров (диодов в неуправляемом выпрямителе) на пересечении синусоид. И точки подачи открывающих импульсов существенно отличаются. Не уверен, что этот принцип правильно реализован в моём выпрямителе. (Я писал, что в коде мало, что понимаю). Выпрямитель стоит у меня в мастерской. Протестирован и "в хвост и в гриву"! Всё работает отлично (стабилизация в том числе) Единственно, что где то в середине регулировки наблюдается дёргание стрелки вольтметра. Схему и прошивку прилагаю.

Отправлено спустя 7 минут 10 секунд:
Схему послал в spl7. Посылаю, на всякия случай, в JPG.
Вложения
Схема.jpg
РабочийВариант.rar
(49.19 КБ) 19 скачиваний

XENOMAN
Рядовой
Сообщения: 49
Зарегистрирован: 05.10.2015{, 18:03}
Репутация: 6

Модернизация скоростного счётчика для трёхфазного выпрямителя

#6

Сообщение XENOMAN » 29.12.2023{, 14:31}

Спасибо что поделились, мельком пробежался по коду, вряд-ли удастся повторить подобное в flprog, даже с другим блоком скоростного счетчика, как я понял в этом регуляторе используются 4 аппаратных таймера меги 2560 каждый для своей фазы + считывание задания. Ещё раз спасибо и удачи.

Vasiliy0000
Рядовой
Сообщения: 44
Зарегистрирован: 22.09.2018{, 11:19}
Репутация: 1
Имя: Василий

Модернизация скоростного счётчика для трёхфазного выпрямителя

#7

Сообщение Vasiliy0000 » 03.01.2024{, 00:52}

мне вот тоже нужен 1 фазный стабилизатор-выпрямитель тока
310 в
а ток нужно регулировать от 1 до 1.5 ампера

после выпрямителя ставится частотник
и получается аппарат оглушения

400 гц 1.5 ампера в голову хрюшке
потом 100 гц 1.3 ампера в сердце

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

думал и полностью с нуля слепить на ардуинке, к тому же синусоида и не нужна. но времени на это надо уйму.

а фашисты садюги которые производили эти аппараты прикрылись походу
http://www.fuhrmann-elektrotechnik.de/

Ответить

Вернуться в «Прием заказов»