// 24.05.2019. // Pin 9 i 10 su izlazi PWM // A0 pin meri napon tako što komparira da li je napon veći od 2V2. Ako jeste, povećava ispunu PWM. Ako nije onda smanjuje. #define Kristal 16000000 // Kristal Atmega168 NE MENJAJ #define Frekvencija 36725 // PODESI FREKV . DOZVOLJENO JE DO 300kHz ( 71.1 Khz je frkv macolinog sg3525 smps) #define VrednostICR1 Kristal/Frekvencija/2 #define PeriodICR1 VrednostICR1 / 2 #define DeadTime 7 // PODESAVANJE DEADTIME-A. od 1 do 10. #define VrednostOCR1A PeriodICR1 + DeadTime #define VrednostOCR1B PeriodICR1 - DeadTime unsigned int OstvareniDuty=0,Duty=0; const int LedUspon = 5; const int LedPad = 7; //----------------------------------------------------------------------- // //----------------------------------------------------------------------- void setup() { pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(LedUspon, OUTPUT); // signalizira rad djuti + pinMode(LedPad, OUTPUT); // signalizira rad djuti - TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; TCCR1B |= _BV(CS10); ICR1 = VrednostICR1; OCR1A = VrednostICR1; TCCR1A |= _BV(COM1A1) | _BV(COM1A0); OCR1B = 0; TCCR1A |= _BV(COM1B1); TCCR1B |= _BV(WGM13); TCCR1A |= _BV(WGM11); } //----------------------------------------------------------------------- // //----------------------------------------------------------------------- void loop() { if(PINC & 1) // Arduino A0 pin atmega168&328. Maska je &2 za pin 1, &4 za pin2 itd ... { if(OstvareniDuty < 40) // PODESITI MAX DUTY PREMA PRORACUNU SMPS. MAX JE 90% OstvareniDuty++; Duty = OstvareniDuty; Duty *=PeriodICR1; Duty /=100; OCR1A = VrednostICR1-Duty; OCR1B = Duty; PORTD = PORTD & B01111111; PORTD = PORTD | B00100000; // Pali led na D5 } else { OCR1A = VrednostICR1; OCR1B = 0; OstvareniDuty /= 2; PORTD = PORTD & B11011111; PORTD = PORTD | B10000000; // Pali led na D7 } }