Atmega328 pvm tmr

serega-4789
Offline
Зарегистрирован: 06.05.2020

доброе утро всем! Помогите разобраться с проблемой настройки таймеров и Шима вот скетч

serega-4789
Offline
Зарегистрирован: 06.05.2020
добрый день всем! помогите решить проблему с реализацией 3 х шим сигналов а точнее пачка сигналов в определенный период времени

[code=cpp]//#include <TimerOne.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
//выход импульсов.........................................
  #define dimPinA  5
  #define dimPinB  6
  #define dimPinC  7
//вход детекторов .........................................
  const int POT=0; // Аналоговый вход A0 для подключения потенциометр
//..........................................................



volatile int ticA=0,ticB=0,ticC=0;
bool f2=0, q=0,f1=0,f3=0,t=0,flagfasa=0;// f1-f3 флаги таймеров задержки вентелей, q разрешение кнопки, t флаг пуск осчета угла , с стоп отсчетов

int Dimmer=130,UgolAC_BC=0,F=0; //T ТАЙМЕР УГЛА ФАЗ, TX УГОЛ ФАЗ , x таймер увеличения напруги,
//unsigned long timing;
//LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
byte a=0,b=0,c=0;
int valpot = 0;byte d=0;
void setup() {

  Serial.begin(9600);

  TCCR2A = 0b00000010;  //таймер 2 от пинов отключен, режим СТС, предделитеь = 32
  TCCR2B = 0b00000011;  //итого частота 16М/32 = 500К
  OCR2A  = 20;         //регистр стравнения 20, частота = 500К/20 = 25К
  TIMSK2 = 0b00000010;  //разрешаем прерывание по сравнению

/*/
// Пины D3 и D11 - 31.4 кГц
TCCR2B = 0b00000001;  // x1
TCCR2A = 0b00000001;  // phase correct

// Пины D5 и D6 - 31.4 кГц
TCCR0B = 0b00000001;  // x1
TCCR0A = 0b00000001;  // phase correct

// Пины D9 и D10 - 31.4 кГц
TCCR1A = 0b00000001;  // 8bit
TCCR1B = 0b00000001;  // x1 phase correct
/*/


//
  pinMode(dimPinA, OUTPUT);
  pinMode(dimPinB, OUTPUT);
  pinMode(dimPinC, OUTPUT);
  digitalWrite(dimPinA, 0);
  digitalWrite(dimPinB, 0);
  digitalWrite(dimPinC, 0);
//
   pinMode(2, INPUT_PULLUP);
   pinMode(3, INPUT_PULLUP);



  attachInterrupt(digitalPinToInterrupt (2), detect_downBC, RISING );
  attachInterrupt(digitalPinToInterrupt (3), detect_downAC, RISING);


  //Timer1.initialize(40);
  //Timer1.attachInterrupt(timer_interrupt);
/*/
  lcd.init();                      // initialize the lcd
  lcd.backlight();

   lcd.setCursor(0, 0);
   lcd.print("init");                  

  lcd.setCursor(0, 0);
   lcd.print("speed=");
lcd.setCursor(0, 1);
   lcd.print("Tx=");
/*/
}

void loop() {
   valpot = analogRead(POT);
   Dimmer=map(valpot,0,1023,17,255);
   // lcd.setCursor(7, 0);
   // lcd.print(Dimmer);
Serial.println(Dimmer);

}

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
  //void timer_interrupt() {
  ISR(TIMER2_COMPA_vect) {                            // прерывания таймера срабатывают каждые 40 мкс
   if(flagfasa==1){F++;}
     if(F==83 ){f3=1;flagfasa=0;ticB=0; digitalWrite(dimPinB, 0); F=0; }
   //  if(F==83 ){f3=1;flagfasa=0;ticB=0; OCR1A = 0; F=0; }


                        


   //..............AC
  if(f1==1){ticA++;if (ticA== Dimmer){f1=0;digitalWrite(dimPinA, 1);}}
//if(f1==1){ticA++;if (ticA== Dimmer){f1=0;OCR0A = 128;}}
  //...............BC
  if(f2==1){ticC++;if (ticC== Dimmer){digitalWrite(dimPinC, 1);f2=0;}}
// if(f2==1){ticC++;if (ticC== Dimmer){OCR2A = 128;f2=0;}}

  //...............AB
  if(f3==1){ticB++; if (ticB== Dimmer){digitalWrite(dimPinB,1); f3=0;}}
  //if(f3==1){ticB++; if (ticB== Dimmer){OCR1A = 128; f3=0;}}

  // поиск угла фаз AC BC пересечений
  if(t==1){UgolAC_BC++;}

}


//контроль фаз AB АС ВС......................................................................

       

// AC пересечение фаз
void  detect_downAC() {
  if(c==0){ t=1;}      // пуск стоп таймера угла фаз Tx       
  f1=1;ticA=0;
  digitalWrite(dimPinA, 0);
  //  OCR0A = 0;
  }

// BC пересечение фаз
void detect_downBC() {       
  if(t==1){ c=1;t=0;}
  if( flagfasa==0 ){f2=1; flagfasa=1;ticC=0;}
  digitalWrite(dimPinC, 0);
  //OCR2A = 0;
   }
// AB пересечение фаз
void  detect_downAB(){f1=1;ticB=0;}
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------[/code]


В место digitalWrite(dimPinA, 0);digitalWrite(dimPinC, 0);digitalWrite(dimPinB, 0); нужен шим сигнал

добрый день всем! помогите решить проблему с реализацией 3 х шим сигналов а точнее пачка сигналов в определенный период времени

serega-4789
Offline
Зарегистрирован: 06.05.2020

В настройках ошибка ,настройки шимвзял с сайта там все варианты частот ШИМ , полно в них ошибок , но уже переделал по даташиту , суть такая мне нужно запустить таймер чтобы считать угол открытия тиристоров от прерывания на портах 2 и 3 ардуино по углу запускать ШИМ частотой 20 -25 кГц длительность паузы надо ещё подобрать пока лажа на осциллографе сапроизвольные всплески ШИМ,
Есть такая же программа но без ШИМ управляю 3 модулями оптосимисторов, работает ,мотор 3 фазы асинхронный 2,5 квт плавно запускается но в определенный момент напряжение быстро растет и управление теряется , поэтому используется ШИМ , ещё не решил будет это пачка импульсов 75 градусов или сплошное заполнение угла открытия .
Главная задача обуздать аппаратный ШИМ, есть ещё возможность сделать таймер с 2 мя прерываниями по oce и toe пока не догнал как вечером скину скетч все настройки из даташита прописал кроме маски прерываний , и как тут текст программы правильно оформлять на сайте ???

serega-4789
Offline
Зарегистрирован: 06.05.2020

С телефона не удобно код вставлять

NikShel
Offline
Зарегистрирован: 21.01.2018

serega-4789 пишет:
как тут текст программы правильно оформлять на сайте ???

вставка программного кода

SLKH
Offline
Зарегистрирован: 17.08.2015

serega-4789 пишет:
В настройках ошибка ,настройки шимвзял с сайта там все варианты частот ШИМ , полно в них ошибок , но уже переделал по даташиту , суть такая мне нужно запустить таймер чтобы считать угол открытия тиристоров от прерывания на портах 2 и 3 ардуино по углу запускать ШИМ частотой 20 -25 кГц длительность паузы надо ещё подобрать пока лажа на осциллографе сапроизвольные всплески ШИМ, Есть такая же программа но без ШИМ управляю 3 модулями оптосимисторов, работает ,мотор 3 фазы асинхронный 2,5 квт плавно запускается но в определенный момент напряжение быстро растет и управление теряется , поэтому используется ШИМ , ещё не решил будет это пачка импульсов 75 градусов или сплошное заполнение угла открытия . Главная задача обуздать аппаратный ШИМ, есть ещё возможность сделать таймер с 2 мя прерываниями по oce и toe пока не догнал как вечером скину скетч все настройки из даташита прописал кроме маски прерываний , и как тут текст программы правильно оформлять на сайте ???

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

например, куда в тиристор пихается 25 кгц? 

b707
Offline
Зарегистрирован: 26.05.2017

serega-4789 пишет:
В настройках ошибка ,настройки шимвзял с сайта там все варианты частот ШИМ , полно в них ошибок , но уже переделал по даташиту , суть такая мне нужно запустить таймер чтобы считать угол открытия тиристоров от прерывания на портах 2 и 3 ардуино по углу запускать ШИМ частотой 20 -25 кГц длительность паузы надо ещё подобрать пока лажа на осциллографе сапроизвольные всплески ШИМ???

Частота переключения таймера 25К и частота ШИМ 25к? - и вы удивляетесь. что у вас "всплески"?

serega-4789
Offline
Зарегистрирован: 06.05.2020

А по подробнее пожалуйста , я даже и не думал что это может повлиять на работу, какую тогда частоту для таймера выбрать ? Нужно 40- 55  мкс прерывания , 55,55 это один градус 

b707
Offline
Зарегистрирован: 26.05.2017

serega-4789 пишет:

А по подробнее пожалуйста , я даже и не думал что это может повлиять на работу

Ну вы сами подумайте, если вы внешне перезаписываете OCR в случайный момент - иногда до совпадения, иногда после... у вас в некоторых циклах совпадения вообще не будет... а в некоторых оно будет несколько раз. И что будет с PWM?

А с учетом того, что у вас частота внешнего прерывания и частота PWM примерно равны - у вас искажения возникают практически в каждом цикле. Чтобы уменьшить число выбросов - перезапускайте счетчик при смене OCR и выберите частоты так, чтобы частота PWM была примерно на порядок больше частоты таймера. Лучше это сделать понизив частоту таймера, при управлении мотором разрешение в 1 градус - это слишком, 6-10 градусов вполне достаточно

serega-4789
Offline
Зарегистрирован: 06.05.2020
//#include <TimerOne.h>
#include <Wire.h>
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 
//#include <LiquidCrystal_I2C.h>

  const int POT=0; // Аналоговый вход A0 для подключения потенциометр
//..........................................................



volatile int ticA=0,ticB=0,ticC=0;
bool f2=0, q=0,z=0,f1=0,f3=0,t=0,flagfasa=0;// f1-f3 флаги таймеров задержки вентелей, q разрешение кнопки, t флаг пуск осчета угла , с стоп отсчетов

int Dimmer=255,Dimm_set,UgolAC_BC=0,F=0; //T ТАЙМЕР УГЛА ФАЗ, TX УГОЛ ФАЗ , x таймер увеличения напруги, 
//unsigned long timing;
//LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
byte a=0,b=0,c=0;
int valpot = 0,count=0; 
byte d=0;
bool buttonState;
void setup() {
  // DDRD = 0b01100000; // PIN5 
 //  DDRD |=  (1<<6); //PIN6
 //  DDRB =0b00000110; //PIN9 
  Serial.begin(9600);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
   pinMode(9, OUTPUT);
  Setup_timer();
   pinMode(2, INPUT_PULLUP);
   pinMode(3, INPUT_PULLUP); 
   pinMode(4, INPUT_PULLUP); 
  
  
  attachInterrupt(digitalPinToInterrupt (2), detect_downBC, RISING );
  attachInterrupt(digitalPinToInterrupt (3), detect_downAC, RISING);
 
/*/   
  lcd.init();                      // initialize the lcd 
  lcd.backlight();

   lcd.setCursor(0, 0);
   lcd.print("init");                     
  
  lcd.setCursor(0, 0);
   lcd.print("speed=");
 lcd.setCursor(0, 1);
   lcd.print("Tx=");
/*/

}
void Setup_timer() {

   // TIMER0
   TCCR0A |=  (1<<COM0A1); // COM0A1, COM0A0: 1 0 - None-inverted mode для OC0A, для инверсного режима ШИМ нужно 1 1
   TCCR0A &= ~(1<<COM0A0); 
   TCCR0A |=  (1<<COM0B1); // COM0B1, COM0B0: 1 0 - None-inverted mode для OC0B, для инверсного режима ШИМ нужно 1 1
   TCCR0A &= ~(1<<COM0B0); 
// TCCR0A &= ~(1<<WGM01);  // WGM02, WGM01, WGM00: 0 1 1 - Fast PWM    
   TCCR0A |=  (0<<WGM01);  // WGM02, WGM01, WGM00: 0 1 1 - Fast PWM 
// TCCR0A &= ~(1<<WGM00);
   TCCR0A |=  (1<<WGM00);
 
 
   TCCR0B &= ~(1<<CS02); //CS02 0      CS02, CS01, CS00: 0 0 1 - тактовый генератор CLK   
// TCCR0B |=  (1<<CS02); //CS02 1
// TCCR0B &= ~(1<<CS00); //CS00 0
   TCCR0B |=  (1<<CS00); //CS00 1 
// TCCR0B |=  (1<<CS01); //CS01 1
   TCCR0B &= ~(1<<CS01); //CS01 0   
   TCCR0B &= ~(1<<WGM02);//WGM02 0
// TCCR0B |=  (1<<WGM02);//WGM02 1

   // TIMER1
   TCCR1A |=  (1<<COM1A1); //COM1A1 1   COM1A1, COM1A0: 1 0 - None-inverted mode для OC1A, для инверсного режима ШИМ нужно 1 1
// TCCR1A &= ~(1<<COM1A1); //COM1A1 0
   TCCR1A &= ~(1<<COM1A0); //COM1A0 0
// TCCR1A |=  (1<<COM1A0); //COM1A0 1
// TCCR1A |=  (1<<COM1B1); //COM1B1 1   COM1B1, COM1B0: 1 0 - None-inverted mode для OC1B, для инверсного режима ШИМ нужно 1 1
// TCCR1A &= ~(1<<COM1B1); //COM1B1 0 
// TCCR1A &= ~(1<<COM1B0); //COM1B0 0
// TCCR1A |=  (1<<COM1B0); //COM1B0 1
   TCCR1A &= ~(0<<WGM11);  //WGM11 0    WGM13, WGM12, WGM11, WGM10: 0 1 0 1 - Fast PWM, 8bit 
// TCCR1A |=  (0<<WGM11);  //WGM11 1
   TCCR1A |=  (1<<WGM10);  //WGM10 1
// TCCR1A &= ~(1<<WGM10);  //WGM10 0

   TCCR1B &= ~(1<<CS12);   //CS12 0     CS12, CS11, CS10: 0 0 1 - тактовый генератор CLK
// TCCR1B |=  (1<<CS12);   //CS12 1
// TCCR1B &= ~(1<<CS10);   //CS10 0
   TCCR1B |=  (1<<CS10);   //CS10 1
// TCCR1B |=  (1<<CS11);   //CS11 1
   TCCR1B &= ~(1<<CS11);   //CS11 0
   TCCR1B &= ~(1<<WGM13);  //WGM13 0
// TCCR1B |=  (1<<WGM13);  //WGM13 1
   TCCR1B |=  (1<<WGM12);  //WGM12 1
// TCCR1B &= ~(1<<WGM13);  //WGM13 0
  
  TCCR2A = 0b00000010;  //таймер 2 от пинов отключен, режим СТС, предделитеь = 32
  TCCR2B = 0b00000011;  //итого частота 16М/32 = 500К
  OCR2A  = 20;         //регистр стравнения 20, частота = 500К/20 = 25К
  TIMSK2 = 0b00000010;  //разрешаем прерывание по сравнению 
   //Таймер 0 | выводы 5 и 6  | OC0B, OC0A
   //Таймер 1 | выводы 9 и 10 | OC1A, OC1B
   //Таймер 2 | выводы 3 и 11 | OC2B, OC2A

   

   //Установить все PWM в 0
   OCR0A = 0;
   OCR0B = 0;
   OCR1A = 0;
// OCR1B = 0;
   
   //Разрешить/запретить прерывания по таймерам
   TIMSK0 &= ~(1<<TOIE0); //Запретить прерывания на таймер 0
   TIMSK1 &= ~(1<<TOIE1); //Запретить прерывания на таймер 1
   
}
void loop() {

   // lcd.setCursor(7, 0);
   // lcd.print(Dimmer);
    //lcd.setCursor(7, 0); lcd.print(Dimmer);
   
    buttonState = digitalRead(4); 
   if(q==0){valpot = analogRead(POT);Dimm_set=map(valpot,0,1023,17,255);Dimmer=Dimm_set;count=0;
   if(buttonState==0 and z==0){z=1;} if(buttonState==1 and z==1){z=0;q=1;}} 
   
   if(q==1){if(buttonState==0 and z==0){z=1;} if(buttonState==1 and z==1){z=0;q=0;}}
 
   
   if(Dimmer!=10 and q==1){ if(count==2000){Dimmer--;count=0;} }
   /*/
   Serial.print("Dimmer=");
   Serial.println(Dimmer);  
   Serial.print("q=");
   Serial.println(q); 
   Serial.print("buttonState=");
   Serial.println(buttonState);
   /*/
} 

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
  //void timer_interrupt() {
  ISR(TIMER2_COMPA_vect) {                            // прерывания таймера срабатывают каждые 40 мкс
  if(Dimmer!=10 and count!=2000 and q==1){count++;} 
     if(flagfasa==1){F++;}
     //if(F==83 ){f3=1;flagfasa=0;ticB=0; analogWrite(6, 0); F=0; }
     if(F==83 ){f3=1;flagfasa=0;ticB=0; OCR0A=0; F=0; }//pin 6
    
     //sbi(TCCR1A, COM1B1);OCR1B = 0;     // устанавливаем уровень ШИМ  10
     //sbi(TCCR1A, COM1A1);OCR1A = 0;     // устанавливаем уровень ШИМ  9        
     //sbi(TCCR2A, COM2A1);OCR2A = 0;//11
                           


   //..............AC 
  // if(f1==1){ticA++;if (ticA== Dimmer){f1=0;analogWrite(5, 230);}}
  if(f1==1){ticA++;if (ticA== Dimmer){f1=0; OCR0B=200;}}//pin 5

  //...............BC  
  //if(f2==1){ticC++;if (ticC== Dimmer){analogWrite(9, 230);f2=0;}}
    if(f2==1){ticC++;if (ticC== Dimmer){OCR1A=200;f2=0;}}//pin 9
 
  //...............AB

 //  if(f3==1){ticB++; if (ticB== Dimmer){analogWrite(6, 230); f3=0;}}
    if(f3==1){ticB++; if (ticB== Dimmer){OCR0A=200; f3=0;}}//pin 6

  // поиск угла фаз AC BC пересечений
  if(t==1){UgolAC_BC++;} 

}

  
//контроль фаз AB АС ВС......................................................................

          

// AC пересечение фаз
void  detect_downAC() {
  if(c==0){ t=1;}      // пуск стоп таймера угла фаз Tx          
  f1=1;ticA=0;
//  analogWrite(5, 0);
 OCR0B=0; //pin 5
  }

// BC пересечение фаз
void detect_downBC() {          
  if(t==1){ c=1;t=0;}
  if( flagfasa==0 ){f2=1; flagfasa=1;ticC=0;} 
 // analogWrite(9,0);
  OCR1A=0;//pin9
   } 
// AB пересечение фаз  
void  detect_downAB(){f1=1;ticB=0;} 
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------

 

serega-4789
Offline
Зарегистрирован: 06.05.2020

Так нагдядней будет биты выставлять

serega-4789
Offline
Зарегистрирован: 06.05.2020

Из за того что частота на разных пинах отличается , 25кгц не выставить мне походу , fast pwm 62кгц нужны 

3 шим

serega-4789
Offline
Зарегистрирован: 06.05.2020

#include <avr/io.h>
#include <avr/interrupt.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))


void setup() {
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(9, OUTPUT);
    digitalWrite(5, 0);
  digitalWrite(6, 0);
  digitalWrite(7, 0);
Setup_timer();
}

void loop() {
 Setup_timer(); 
sei();
}
void Setup_timer() {
 cli();  // отключить глобальные прерывания
TCCR0A &= ~(1<<WGM01);    //ВСЕ WGM В НУЛИ РЕЖИМ НОРМАЛ
TCCR0A &= ~(1<<WGM00);
TCCR0B &= ~(1<<WGM02);
TIMSK0 &= ~(1<<TOIE0);       //СОВПАДЕНИЕ 
//TIMSK0 &= ~(1<<OCIE0B);         //ПЕРЕПОЛНЕНИЕ
TIMSK0 &= ~(1<<OCIE0A); 
TCCR0B |=  (1<<CS01);       //БЕЗ ПРЕДДЕЛИТЕЛЯ
TCCR0B &= ~(1<<CS02); 
TCCR0B &= ~(1<<CS00); 
TCNT0 = 0;
OCR0A=170;
sei();
}
  ISR(TIMER0_COMPA_vect) 
  {cli();
    //PORTB &= ~(1<<5); 
  digitalWrite(5, 1);                        //СОВПАДЕНИЕ ПРЕРЫВАНИЕ
   sei();
  }  

  ISR(TIMER0_OVFA_vect)         //ПО ПЕРЕПОЛНЕНИЮ
  { cli();
    //PORTB |=  (1<<5);
  digitalWrite(5, 1);
 sei();
  }   
serega-4789
Offline
Зарегистрирован: 06.05.2020

привет ВСЕМ ! не стал ни чего мудрить вот так думаю сделать

/*
   Диммер переменки на Arduino. Симистор через оптопару
   подключен к 4 пину, детектор нуля ко 2 пину.
   Переменная Dimmer - величина диммирования, от 0 до 255
   В этом коде на пин А0 подключен потенциометр для управления яркостью
   Также можно вводить число для переменной Dimmer через
   монитор порта, для этого в лупе надо раскомментировать код
*/

#include <TimerOne.h>
#include <Wire.h>
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 
//#include <LiquidCrystal_I2C.h>
//выход импульсов.........................................
  #define dimPinA  5
  #define dimPinB  6
  #define dimPinC  7
 //вход детекторов .........................................
  const int POT=0; // Аналоговый вход A0 для подключения потенциометр
//..........................................................



volatile int ticA=0,ticB=0,ticC=0;
bool f2=0, q=0,z=0,f1=0,f3=0,t=0,flagfasa=0,A=0,B=0,C=0;// f1-f3 флаги таймеров задержки вентелей, q разрешение кнопки, t флаг пуск осчета угла , с стоп отсчетов

int Dimmer=255,Dimm_set,UgolAC_BC=0,F=0; //T ТАЙМЕР УГЛА ФАЗ, TX УГОЛ ФАЗ , x таймер увеличения напруги, 
//unsigned long timing;
//LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
byte a=0,b=0,c=0;
int valpot = 0,count=0; 
byte d=0;
bool buttonState;
void setup() {
  cli();
  Serial.begin(9600);
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);
// 
   pinMode(2, INPUT_PULLUP);
   pinMode(3, INPUT_PULLUP); 
   pinMode(4, INPUT_PULLUP); 
  //
  

/*/
  TCCR2A = 0b00000010;  //таймер 2 от пинов отключен, режим СТС, предделитеь = 32
  TCCR2B = 0b00000011;  //итого частота 16М/32 = 500К
  OCR2A  = 20;         //регистр стравнения 20, частота = 500К/20 = 25К
  TIMSK2 = 0b00000010;  //разрешаем прерывание по сравнению 
 /*/  

// 
  pinMode(dimPinA, OUTPUT);
  pinMode(dimPinB, OUTPUT);
  pinMode(dimPinC, OUTPUT); 
  digitalWrite(dimPinA, 0);
  digitalWrite(dimPinB, 0);
  digitalWrite(dimPinC, 0);
//  

 
  attachInterrupt(digitalPinToInterrupt (3), detect_downAC, RISING);
 
  
  Timer1.initialize(40);
  Timer1.attachInterrupt(timer_interrupt);
  
/*/   
  lcd.init();                      // initialize the lcd 
  lcd.backlight();

   lcd.setCursor(0, 0);
   lcd.print("init");                     
  
  lcd.setCursor(0, 0);
   lcd.print("speed=");
 lcd.setCursor(0, 1);
   lcd.print("Tx=");
/*/

sei();
}

void loop() {

   // lcd.setCursor(7, 0);
   // lcd.print(Dimmer);
    //lcd.setCursor(7, 0); lcd.print(Dimmer);
   valpot = analogRead(POT);
   Dimm_set=map(valpot,0,1023,17,255);
   Dimmer=Dimm_set;
  // if(digitalRead(4)==0){q=1;Timer1.attachInterrupt(timer_interrupt);}else {count=0;q=0;  Timer1. detachInterrupt(); }
   
   
   
     
    
   

   
 //  if(Dimmer!=10 and q==1){ if(count==2000){Dimmer--;count=0;} }
   /*/
   Serial.print("Dimmer=");
   Serial.println(Dimmer);  
   Serial.print("q=");
   Serial.println(q); 
   Serial.print("buttonState=");
   Serial.println(buttonState);
   /*/
} 

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
  void timer_interrupt() {
                              // прерывания таймера срабатывают каждые 40 мкс
  if(Dimmer!=10 and count!=2000 and q==1){count++;} 
     if(flagfasa==1){F++;}
    
     if(F==83  ){flagfasa=0;ticB=0;digitalWrite(dimPinB, 0);B=0; f3=1; F=0; }
  
     
   //..............AC
 
  if(f1==1 and A==0){ticA++;if (ticA== Dimmer){f1=0;A=1; }} 
  if(A==1){digitalWrite(dimPinA, !digitalRead(dimPinA));}else {digitalWrite(dimPinA,0);}
   
  //...............BC
  if(f2==1 and C==0){ticC++;if (ticC== Dimmer){ f2=0;C=1;}}   
  if(C==1){digitalWrite(dimPinC, !digitalRead(dimPinC));}else {digitalWrite(dimPinC,0);}

  //...............AB
 
  if(f3==1 and B==0){ticB++; if (ticB== Dimmer){f3=0;B=1; }}
  if(B==1){digitalWrite(dimPinB, !digitalRead(dimPinB));} else {digitalWrite(dimPinB,0);} 

  // поиск угла фаз AC BC пересечений
  if(t==1){UgolAC_BC++;} 

}

  
//контроль фаз AB АС ВС......................................................................

          

// AC пересечение фаз
void  detect_downAC() {
  if(A==1){A=0;}
  if(c==0){ t=1;}      // пуск стоп таймера угла фаз Tx          
  f1=1;ticA=0;
  digitalWrite(dimPinA, 0);
 attachInterrupt(digitalPinToInterrupt (2), detect_downBC, RISING );
  }

// BC пересечение фаз
void detect_downBC() {          
 if(C==1){C=0;}
  if(t==1){ c=1;t=0;}
  if( flagfasa==0 ){f2=1; flagfasa=1;ticC=0;} 
  digitalWrite(dimPinC, 0);
  
   } 
// AB пересечение фаз  
void  detect_downAB(){f1=1;ticB=0;} 
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------

 

serega-4789
Offline
Зарегистрирован: 06.05.2020

Я так понял картинки проекты протеус архивы нельзя выкладывать , только ссылки ? Блин а как тогда мне ссылку на картинку сделать?

serega-4789
Offline
Зарегистрирован: 06.05.2020
#include <TimerOne.h>
#include <Wire.h>
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 
//#include <LiquidCrystal_I2C.h>
//выход импульсов.........................................
  #define dimPinA  5
  #define dimPinB  6
  #define dimPinC  7
 //вход детекторов .........................................
  const int POT=0; // Аналоговый вход A0 для подключения потенциометр
//..........................................................



volatile int ticA=0,ticB=0,ticC=0;
bool f2=0, q=0,z=0,f1=0,f3=0,t=0,flagfasa=0,A=0,B=0,C=0;// f1-f3 флаги таймеров задержки вентелей, q разрешение кнопки, t флаг пуск осчета угла , с стоп отсчетов

int Dimmer=135 ,Dimm_set,UgolAC_BC=0,F=0; //T ТАЙМЕР УГЛА ФАЗ, TX УГОЛ ФАЗ , x таймер увеличения напруги, 
//unsigned long timing;
//LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
byte a=0,b=0,c=0;
int valpot = 0,count=0,count_set=300; 
byte d=0;
bool buttonState;
void setup() {
  cli();
  Serial.begin(9600);
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);
// 
   pinMode(2, INPUT_PULLUP);
   pinMode(3, INPUT_PULLUP); 
   pinMode(4, INPUT_PULLUP); 
  //
  

/*/
  TCCR2A = 0b00000010;  //таймер 2 от пинов отключен, режим СТС, предделитеь = 32
  TCCR2B = 0b00000011;  //итого частота 16М/32 = 500К
  OCR2A  = 20;         //регистр стравнения 20, частота = 500К/20 = 25К
  TIMSK2 = 0b00000010;  //разрешаем прерывание по сравнению 
 /*/  

// 
  pinMode(dimPinA, OUTPUT);
  pinMode(dimPinB, OUTPUT);
  pinMode(dimPinC, OUTPUT); 
  digitalWrite(dimPinA, 0);
  digitalWrite(dimPinB, 0);
  digitalWrite(dimPinC, 0);
//  

 
  attachInterrupt(digitalPinToInterrupt (3), detect_downAC, RISING);
 
  
  Timer1.initialize(40);
  Timer1.attachInterrupt(timer_interrupt);
  
/*/   
  lcd.init();                      // initialize the lcd 
  lcd.backlight();

   lcd.setCursor(0, 0);
   lcd.print("init");                     
  
  lcd.setCursor(0, 0);
   lcd.print("speed=");
 lcd.setCursor(0, 1);
   lcd.print("Tx=");
/*/

sei();
}

void loop() {

   // lcd.setCursor(7, 0);
   // lcd.print(Dimmer);
    //lcd.setCursor(7, 0); lcd.print(Dimmer);
  // valpot = analogRead(POT);
 //  Dimm_set=map(valpot,0,1023,17,255);
  // Dimmer=Dimm_set;
  // if(digitalRead(4)==0){q=1;Timer1.attachInterrupt(timer_interrupt);}else {count=0;q=0;  Timer1. detachInterrupt(); }
   
   // Serial.print("Dimmer=");
  // Serial.println(Dimmer);  

   // Serial.print("count=");
  // Serial.println(count);   
    
   
               
   
  //if(Dimmer!=10 ){ if(count==1000){Dimmer--;count=0;} }
   /*/
   Serial.print("Dimmer=");
   Serial.println(Dimmer);  
   Serial.print("q=");
   Serial.println(q); 
   Serial.print("buttonState=");
   Serial.println(buttonState);
   /*/
} 

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
  void timer_interrupt() {           // прерывания таймера срабатывают каждые 40 мкс
                           
 // if(Dimmer!=10 and count!=2000 ){count++;} 
     if(flagfasa==1){F++;}
    
     if(F==83  ){flagfasa=0;ticB=0;digitalWrite(dimPinB, 0);B=0; f3=1; F=0; 
     if(Dimmer!=10 and count!=count_set){count++;} 
     if(Dimmer!=10 and count==count_set  ){Dimmer=Dimmer-1;count=0;if(Dimmer==130){Dimmer=100;count_set=1;}}
     
     
    
     }
  
     
   //..............AC
 
  if(f1==1 and A==0){ticA++;if (ticA== Dimmer){f1=0;A=1; }} 
  if(A==1){digitalWrite(dimPinA, !digitalRead(dimPinA));}else {digitalWrite(dimPinA,0);}
   
  //...............BC
  if(f2==1 and C==0){ticC++;if (ticC== Dimmer){ f2=0;C=1;}}   
  if(C==1){digitalWrite(dimPinC, !digitalRead(dimPinC));}else {digitalWrite(dimPinC,0);}

  //...............AB
 
  if(f3==1 and B==0){ticB++; if (ticB== Dimmer){f3=0;B=1; }}
  if(B==1){digitalWrite(dimPinB, !digitalRead(dimPinB));} else {digitalWrite(dimPinB,0);} 

  // поиск угла фаз AC BC пересечений
  if(t==1){UgolAC_BC++;} 

}

  
//контроль фаз AB АС ВС......................................................................

          

// AC пересечение фаз
void  detect_downAC() {
  if(A==1){A=0;}
  if(c==0){ t=1;}      // пуск стоп таймера угла фаз Tx          
   if(f1==0){ f1=1;ticA=0;}
  digitalWrite(dimPinA, 0);
 attachInterrupt(digitalPinToInterrupt (2), detect_downBC, RISING );
  }

// BC пересечение фаз
void detect_downBC() {          
 if(C==1){C=0;}
  if(t==1){ c=1;t=0;}
  if( flagfasa==0 ){f2=1; flagfasa=1;ticC=0;} 
  digitalWrite(dimPinC, 0);
  
   } 
// AB пересечение фаз  
void  detect_downAB(){f1=1;ticB=0;} 
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------

 

serega-4789
Offline
Зарегистрирован: 06.05.2020
#include <TimerOne.h>
#include <Wire.h>
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 
//#include <LiquidCrystal_I2C.h>
//выход импульсов.........................................
  #define dimPinA  5
  #define dimPinB  6
  #define dimPinC  7
 //вход детекторов .........................................
  const int POT=0; // Аналоговый вход A0 для подключения потенциометр
//..........................................................



volatile int ticA=0,ticB=0,ticC=0;
bool f2=0, q=0,z=0,f1=0,f3=0,t=0,flagfasa=0,A=0,B=0,C=0;// f1-f3 флаги таймеров задержки вентелей, q разрешение кнопки, t флаг пуск осчета угла , с стоп отсчетов

int Dimmer=135 ,Dimm_set,UgolAC_BC=0,F=0; //T ТАЙМЕР УГЛА ФАЗ, TX УГОЛ ФАЗ , x таймер увеличения напруги, 
//unsigned long timing;
//LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
byte a=0,b=0,c=0;
int valpot = 0,count=0,count_set=300; 
byte d=0;
bool buttonState;
void setup() {
  cli();
  Serial.begin(9600);
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);
// 
   pinMode(2, INPUT_PULLUP);
   pinMode(3, INPUT_PULLUP); 
   pinMode(4, INPUT_PULLUP); 
  //
  

/*/
  TCCR2A = 0b00000010;  //таймер 2 от пинов отключен, режим СТС, предделитеь = 32
  TCCR2B = 0b00000011;  //итого частота 16М/32 = 500К
  OCR2A  = 20;         //регистр стравнения 20, частота = 500К/20 = 25К
  TIMSK2 = 0b00000010;  //разрешаем прерывание по сравнению 
 /*/  

// 
  pinMode(dimPinA, OUTPUT);
  pinMode(dimPinB, OUTPUT);
  pinMode(dimPinC, OUTPUT); 
  digitalWrite(dimPinA, 0);
  digitalWrite(dimPinB, 0);
  digitalWrite(dimPinC, 0);
//  

 
  attachInterrupt(digitalPinToInterrupt (3), detect_downAC, RISING);
 
  
  Timer1.initialize(40);
  Timer1.attachInterrupt(timer_interrupt);
  
/*/   
  lcd.init();                      // initialize the lcd 
  lcd.backlight();

   lcd.setCursor(0, 0);
   lcd.print("init");                     
  
  lcd.setCursor(0, 0);
   lcd.print("speed=");
 lcd.setCursor(0, 1);
   lcd.print("Tx=");
/*/

sei();
}

void loop() {

   // lcd.setCursor(7, 0);
   // lcd.print(Dimmer);
    //lcd.setCursor(7, 0); lcd.print(Dimmer);
  // valpot = analogRead(POT);
 //  Dimm_set=map(valpot,0,1023,17,255);
  // Dimmer=Dimm_set;
  // if(digitalRead(4)==0){q=1;Timer1.attachInterrupt(timer_interrupt);}else {count=0;q=0;  Timer1. detachInterrupt(); }
   
   // Serial.print("Dimmer=");
  // Serial.println(Dimmer);  

   // Serial.print("count=");
  // Serial.println(count);   
    
   
               
   
  //if(Dimmer!=10 ){ if(count==1000){Dimmer--;count=0;} }
   /*/
   Serial.print("Dimmer=");
   Serial.println(Dimmer);  
   Serial.print("q=");
   Serial.println(q); 
   Serial.print("buttonState=");
   Serial.println(buttonState);
   /*/
} 

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
  void timer_interrupt() {           // прерывания таймера срабатывают каждые 40 мкс
                           
 // if(Dimmer!=10 and count!=2000 ){count++;} 
     if(flagfasa==1){F++;}
    
     if(F==83  ){flagfasa=0;ticB=0;digitalWrite(dimPinB, 0);B=0; f3=1; F=0; 
     if(Dimmer!=10 and count!=count_set){count++;} 
     if(Dimmer!=10 and count==count_set  ){Dimmer=Dimmer-1;count=0;if(Dimmer==130){Dimmer=100;count_set=1;}}
     
     
    
     }
  
     
   //..............AC
 
  if(f1==1 and A==0){ticA++;if (ticA== Dimmer){f1=0;A=1; }} 
  if(A==1){digitalWrite(dimPinA, !digitalRead(dimPinA));}else {digitalWrite(dimPinA,0);}
   
  //...............BC
  if(f2==1 and C==0){ticC++;if (ticC== Dimmer){ f2=0;C=1;}}   
  if(C==1){digitalWrite(dimPinC, !digitalRead(dimPinC));}else {digitalWrite(dimPinC,0);}

  //...............AB
 
  if(f3==1 and B==0){ticB++; if (ticB== Dimmer){f3=0;B=1; }}
  if(B==1){digitalWrite(dimPinB, !digitalRead(dimPinB));} else {digitalWrite(dimPinB,0);} 

  // поиск угла фаз AC BC пересечений
  if(t==1){UgolAC_BC++;} 

}

  
//контроль фаз AB АС ВС......................................................................

          

// AC пересечение фаз
void  detect_downAC() {
  if(A==1){A=0;}
  if(c==0){ t=1;}      // пуск стоп таймера угла фаз Tx          
   if(f1==0){ f1=1;ticA=0;}
  digitalWrite(dimPinA, 0);
 attachInterrupt(digitalPinToInterrupt (2), detect_downBC, RISING );
  }

// BC пересечение фаз
void detect_downBC() {          
 if(C==1){C=0;}
  if(t==1){ c=1;t=0;}
  if( flagfasa==0 ){f2=1; flagfasa=1;ticC=0;} 
  digitalWrite(dimPinC, 0);
  
   } 
// AB пересечение фаз  
void  detect_downAB(){f1=1;ticB=0;} 
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------

 

serega-4789
Offline
Зарегистрирован: 06.05.2020
serega-4789
Offline
Зарегистрирован: 06.05.2020
serega-4789
Offline
Зарегистрирован: 06.05.2020
#include <TimerOne.h>
#include <Wire.h>
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 
//#include <LiquidCrystal_I2C.h>
//выход импульсов.........................................
  #define dimPinA  5
  #define dimPinB  6
  #define dimPinC  7
 //вход детекторов .........................................
  const int POT=0; // Аналоговый вход A0 для подключения потенциометр
//..........................................................



volatile int ticA=0,ticB=0,ticC=0;
bool f2=0, q=0,z=0,f1=0,f3=0,t=0,flagfasa=0,A=0,B=0,C=0,k=0;// f1-f3 флаги таймеров задержки вентелей, q разрешение кнопки, t флаг пуск осчета угла , с стоп отсчетов

int Dimmer=135 ,Dimm_set,T=0,F=0,ACt=0,BCt=0; //T ТАЙМЕР УГЛА ФАЗ, TX УГОЛ ФАЗ , x таймер увеличения напруги, 
//unsigned long timing;
//LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
byte a=0,b=0,c=0;
int valpot = 0,count=0,count_set=300; 
byte d=0;
bool buttonState;
void setup() {
  cli();
  Serial.begin(9600);
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);
// 
   pinMode(2, INPUT_PULLUP);
   pinMode(3, INPUT_PULLUP); 
   pinMode(4, INPUT_PULLUP); 
  //
  

/*/
  TCCR2A = 0b00000010;  //таймер 2 от пинов отключен, режим СТС, предделитеь = 32
  TCCR2B = 0b00000011;  //итого частота 16М/32 = 500К
  OCR2A  = 20;         //регистр стравнения 20, частота = 500К/20 = 25К
  TIMSK2 = 0b00000010;  //разрешаем прерывание по сравнению 
 /*/  

// 
   pinMode(13, OUTPUT);
  pinMode(dimPinA, OUTPUT);
  pinMode(dimPinB, OUTPUT);
  pinMode(dimPinC, OUTPUT); 
  digitalWrite(dimPinA, 0);
  digitalWrite(dimPinB, 0);
  digitalWrite(dimPinC, 0);
  digitalWrite(13, 0);
//  

 
  attachInterrupt(digitalPinToInterrupt (3), detect_downAC, RISING);
 
  
  Timer1.initialize(40);
 Timer1.attachInterrupt(timer_interrupt);
  
/*/   
  lcd.init();                      // initialize the lcd 
  lcd.backlight();

   lcd.setCursor(0, 0);
   lcd.print("init");                     
  
  lcd.setCursor(0, 0);
   lcd.print("speed=");
 lcd.setCursor(0, 1);
   lcd.print("Tx=");
/*/

sei();
}

void loop() {

   // lcd.setCursor(7, 0);
   // lcd.print(Dimmer);
    //lcd.setCursor(7, 0); lcd.print(Dimmer);
  // valpot = analogRead(POT);
 //  Dimm_set=map(valpot,0,1023,17,255);
  // Dimmer=Dimm_set;
  // if(digitalRead(4)==0){q=1;Timer1.attachInterrupt(timer_interrupt);}else {count=0;q=0;  Timer1. detachInterrupt(); }
   
   // Serial.print("Dimmer=");
  // Serial.println(Dimmer);  

   // Serial.print("count=");
  // Serial.println(count);   
    
   
               
   
  //if(Dimmer!=10 ){ if(count==1000){Dimmer--;count=0;} }
   /*/
   Serial.print("Dimmer=");
   Serial.println(Dimmer);  
   Serial.print("q=");
   Serial.println(q); 
  /*/
   
   
  
   if(k==1){digitalWrite(13, 0); }
   if(k==0){digitalWrite(13, 1);count=0; Dimmer=135; 
   digitalWrite(dimPinA, 0);
   digitalWrite(dimPinB, 0);
   digitalWrite(dimPinC, 0); 
  }
    

//Serial.println(ACt);
} 

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
  void timer_interrupt() {           // прерывания таймера срабатывают каждые 40 мкс
  // поиск угла фаз AC BC пересечений
//  if(t==1){UgolAC_BC++;} 
//....... поиск угла фаз AC BC пересечений................................
  
  if(t==1){T++;}  //счет чередования фаз
   ACt++;         //счет угла пересечения АС если больше 250 то ошибка
   BCt++;         //счет угла пересечения ВС если больше 250 то ошибка
  if(ACt>260){k=0;c=0;T=0;t=0;ACt=0;} //счет угла пересечения АС если больше 250 то ошибка
  if(BCt>260){k=0;c=0;T=0;t=0;BCt=0;} //счет угла пересечения ВС если больше 250 то ошибка
  if((T>70 and T<90) and(c==1 and t==0 )){k=1;c=0;T=0;t=0;}//чередования фаз
  if(T>90 ){c=0;T=0;t=0;k=0;}                              //чередования фаз
  if(T==0 and (c==1 and t==0)){c=0;T=0;t=0;k=0;}           //чередования фаз
  
  
 //если угол между фазами больше 70 или равен 0  и флаги с=1 и t=0 значит фаза перепутана сбросить все флаги
//.........................................................................                         
 // if(Dimmer!=10 and count!=2000 ){count++;} 
     if(flagfasa==1){F++;}
     if(F==83  ){flagfasa=0;ticB=0;digitalWrite(dimPinB, 0);B=0; f3=1; F=0;
      
     if(Dimmer!=10 and count!=count_set and k==1){count++;} 
     if(Dimmer!=10 and count==count_set and k==1 ){Dimmer=Dimmer-1;count=0;if(Dimmer==130){Dimmer=100;count_set=1;}}
     
     
    
     }
  
     
   //..............AC
 if(k==1){
  if(f1==1 and A==0){ticA++;if (ticA== Dimmer){f1=0;A=1; }} 
  if(A==1){digitalWrite(dimPinA, !digitalRead(dimPinA));}else {digitalWrite(dimPinA,0);}
   
  //...............BC
  if(f2==1 and C==0){ticC++;if (ticC== Dimmer){ f2=0;C=1;}}   
  if(C==1){digitalWrite(dimPinC, !digitalRead(dimPinC));}else {digitalWrite(dimPinC,0);}

  //...............AB
 
  if(f3==1 and B==0){ticB++; if (ticB== Dimmer){f3=0;B=1; }}
  if(B==1){digitalWrite(dimPinB, !digitalRead(dimPinB));} else {digitalWrite(dimPinB,0);} 
 }
  
}

  
//контроль фаз AB АС ВС......................................................................

          

// AC пересечение фаз
void  detect_downAC() {
  if(A==1){A=0;}
  if(c==0){ t=1;}      // пуск стоп таймера угла фаз Tx     
    
  ACt=0;
   if(f1==0){ f1=1;ticA=0;}
  digitalWrite(dimPinA, 0);
 attachInterrupt(digitalPinToInterrupt (2), detect_downBC, RISING );
  }

// BC пересечение фаз
void detect_downBC() {          
 if(C==1){C=0;}
 BCt=0;
 if(t==1){ c=1;t=0;}
 
  
 
  if( flagfasa==0 ){f2=1; flagfasa=1;ticC=0;} 
  digitalWrite(dimPinC, 0);
  
   } 
// AB пересечение фаз  
void  detect_downAB(){f1=1;ticB=0;} 
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------

 

serega-4789
Offline
Зарегистрирован: 06.05.2020

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

тихо сам с собою я веду беседу ...

serega-4789
Offline
Зарегистрирован: 06.05.2020

Вобщем на 7 Пине  помехи при разгоне, и при замере сигнала либо напряжения  на 5,6,7 пинах помеха лезет на седьмой пин , возможно модуль неисправен хз может пин поменять надо