Atmega328 pvm tmr
- Войдите на сайт для отправки комментариев
Ср, 13/05/2020 - 09:24
доброе утро всем! Помогите разобраться с проблемой настройки таймеров и Шима вот скетч
доброе утро всем! Помогите разобраться с проблемой настройки таймеров и Шима вот скетч
добрый день всем! помогите решить проблему с реализацией 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 х шим сигналов а точнее пачка сигналов в определенный период времени
В настройках ошибка ,настройки шимвзял с сайта там все варианты частот ШИМ , полно в них ошибок , но уже переделал по даташиту , суть такая мне нужно запустить таймер чтобы считать угол открытия тиристоров от прерывания на портах 2 и 3 ардуино по углу запускать ШИМ частотой 20 -25 кГц длительность паузы надо ещё подобрать пока лажа на осциллографе сапроизвольные всплески ШИМ,
Есть такая же программа но без ШИМ управляю 3 модулями оптосимисторов, работает ,мотор 3 фазы асинхронный 2,5 квт плавно запускается но в определенный момент напряжение быстро растет и управление теряется , поэтому используется ШИМ , ещё не решил будет это пачка импульсов 75 градусов или сплошное заполнение угла открытия .
Главная задача обуздать аппаратный ШИМ, есть ещё возможность сделать таймер с 2 мя прерываниями по oce и toe пока не догнал как вечером скину скетч все настройки из даташита прописал кроме маски прерываний , и как тут текст программы правильно оформлять на сайте ???
С телефона не удобно код вставлять
вставка программного кода
ты бы какие-нибудь картинки-графики нарисовал, возможно, было бы понятнее.
например, куда в тиристор пихается 25 кгц?
Частота переключения таймера 25К и частота ШИМ 25к? - и вы удивляетесь. что у вас "всплески"?
А по подробнее пожалуйста , я даже и не думал что это может повлиять на работу, какую тогда частоту для таймера выбрать ? Нужно 40- 55 мкс прерывания , 55,55 это один градус
А по подробнее пожалуйста , я даже и не думал что это может повлиять на работу
Ну вы сами подумайте, если вы внешне перезаписываете OCR в случайный момент - иногда до совпадения, иногда после... у вас в некоторых циклах совпадения вообще не будет... а в некоторых оно будет несколько раз. И что будет с PWM?
А с учетом того, что у вас частота внешнего прерывания и частота PWM примерно равны - у вас искажения возникают практически в каждом цикле. Чтобы уменьшить число выбросов - перезапускайте счетчик при смене OCR и выберите частоты так, чтобы частота PWM была примерно на порядок больше частоты таймера. Лучше это сделать понизив частоту таймера, при управлении мотором разрешение в 1 градус - это слишком, 6-10 градусов вполне достаточно
//#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;} //----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------Так нагдядней будет биты выставлять
Из за того что частота на разных пинах отличается , 25кгц не выставить мне походу , fast pwm 62кгц нужны
3 шим
#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(); }привет ВСЕМ ! не стал ни чего мудрить вот так думаю сделать
/* Диммер переменки на 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;} //----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------Я так понял картинки проекты протеус архивы нельзя выкладывать , только ссылки ? Блин а как тогда мне ссылку на картинку сделать?
#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;} //----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------#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;} //----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------рабочий код
https://www.youtube.com/watch?v=DHhFQ_03iRY
https://www.youtube.com/watch?v=XKb1sXDcmQ4
#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;} //----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------добавил защиту от отвала фаз 2х правда)), и функцию плавный пуск при подаче питания на симисторы
тихо сам с собою я веду беседу ...
Вобщем на 7 Пине помехи при разгоне, и при замере сигнала либо напряжения на 5,6,7 пинах помеха лезет на седьмой пин , возможно модуль неисправен хз может пин поменять надо