Vlad Mihai Postat Februarie 6, 2013 Partajează Postat Februarie 6, 2013 Mi-am facut azi o mini placa de dezvoltare cu atmega 32, si am inceput sa ma joc cu exemplele din compilatorul mikroC PRO for avr. char current_duty;char current_duty1;void main(){ DDB0_bit = 0; // Set PORTB pin 0 as input DDB1_bit = 0; // Set PORTB pin 1 as input DDC0_bit = 0; // Set PORTC pin 0 as input DDC1_bit = 0; // Set PORTC pin 1 as input current_duty = 32; // initial value for current_duty current_duty1 = 32; // initial value for current_duty DDB3_bit = 1; // Set PORTB pin 3 as output pin for the PWM (according to datasheet) DDD7_bit = 1; // Set PORTD pin 7 as output pin for the PWM (according to datasheet) PWM1_Init(_PWM1_FAST_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, current_duty); PWM2_Init(_PWM2_FAST_MODE, _PWM2_PRESCALER_8, _PWM2_NON_INVERTED, current_duty1); do { if (PINB0_bit) { // Detect if PORTB pin 0 is pressed Delay_ms(40); // Small delay to avoid deboucing effect current_duty++; // Increment duty ratio PWM1_Set_Duty(current_duty); // Set incremented duty } else if (PINB1_bit) { // Detect if PORTB pin 1 is pressed Delay_ms(40); // Small delay to avoid deboucing effect current_duty--; // Decrement duty ratio PWM1_Set_Duty(current_duty); // Set decremented duty ratio } else if (PINC0_bit) { // Detect if PORTC pin 0 is pressed Delay_ms(40); // Small delay to avoid deboucing effect current_duty1++; // Increment duty ratio PWM2_Set_Duty(current_duty1); // Set incremented duty } else if (PINC1_bit) { // Detect if PORTC pin 1 is pressed Delay_ms(40); // Small delay to avoid deboucing effect current_duty1--; // Decrement duty ratio PWM2_Set_Duty(current_duty1); // Set decremented duty ratio } } while(1); // Endless loop}codul atasat genereaza pwm pe 2 canale si schimba factorul de umplere manual. Vreau sa modific frecventa dar nu reusesc. in help nu sunt asa de clari.am gasit functia asta in help: unsigned int PWM_xn_Init(unsigned long int freq_hz, unsigned short wave_mode); dar nu stiu cum sa o implementez. la pic era mai usor doar scriam intre paranteze la PWM start ce frecventa vreau: PWM1_Init(62500); // f=62.500 KHz !!!!!!!!!!!!!! PWM1_Start() ; PWM1_Set_Duty(255);are cineva timp sa ma ajute sa fac codul sa mearga?Si mai am o intrebare de ce nu pot sa scot pwm si pe celelalte 2 canale ale atmega 32? am modificat pinii dar degeaba. Link spre comentariu
Vlad Mihai Postat Februarie 6, 2013 Autor Partajează Postat Februarie 6, 2013 ce compilator imi recomandati? ma refer la functia help care o are mai vasta si mai bine structurata? Link spre comentariu
Vizitator Cipri_v Postat Februarie 6, 2013 Partajează Postat Februarie 6, 2013 trebuie sa modifici in registri,si prescaler.Aici un exemplu: void setPwmFrequency(int pin, int divisor) { byte mode; if(pin == 5 || pin == 6 || pin == 9 || pin == 10) { switch(divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 64: mode = 0x03; break; case 256: mode = 0x04; break; case 1024: mode = 0x05; break; default: return; } if(pin == 5 || pin == 6) { TCCR0B = TCCR0B & 0b11111000 | mode; } else { TCCR1B = TCCR1B & 0b11111000 | mode; } } else if(pin == 3 || pin == 11) { switch(divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 32: mode = 0x03; break; case 64: mode = 0x04; break; case 128: mode = 0x05; break; case 256: mode = 0x06; break; case 1024: mode = 0x7; break; default: return; } TCCR2B = TCCR2B & 0b11111000 | mode; }} Link spre comentariu
godFather89 Postat Februarie 7, 2013 Partajează Postat Februarie 7, 2013 Nu am citit documentatia la bibliotecile oferite in MikroC, dar banuiesc ca poti schimba in functia: PWM1_Init(_PWM1_FAST_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, current_duty); parametrul al 2-lea: _PWM1_PRESCALER_1 _PWM1_PRESCALER_8 _PWM1_PRESCALER_64 _PWM1_PRESCALER_256 _PWM1_PRESCALER_1024 Cu cat e prescalerul mai mare, cu atat frecventa e mai mica. Link spre comentariu
Vlad Mihai Postat Februarie 7, 2013 Autor Partajează Postat Februarie 7, 2013 păi da dar vreau o frecvenţă fixă gen 50khz. aia cum o fac? Link spre comentariu
godFather89 Postat Februarie 7, 2013 Partajează Postat Februarie 7, 2013 Din cate imi amintesc de prin foaia de catalog (s-ar putea sa ma insel), nu se poate fara sa modifici frecventa de ceas a microcontroler-ului. Si nu tine de software, tine de hardware. Link spre comentariu
Stefan Postat Februarie 7, 2013 Partajează Postat Februarie 7, 2013 Daca ai nevoie de fix 50Khz (nasol) o sa iti trebuiasca un oscilator de fix 12.8Mhz si pe Fast Mode pui prescalerul pe 1 Fpwm = Fosc / prescaler * 256 => Fosc = Fpwm * prescaler * 256. Adeca 50KHz * 1 * 256 = fix 12.8MHz (bafta la gasit asa ceva) Scrie asa si compileaza pentru 12.8MHz: PWM1_Init(_PWM1_FAST_MODE, 1, _PWM1_NON_INVERTED, current_duty); Link spre comentariu
Vlad Mihai Postat Februarie 7, 2013 Autor Partajează Postat Februarie 7, 2013 nu am nevoie de chiar 50khz, am dat aşa un exemplu, pe placă am cuarţ de 12MHz, aş avea nevoie de frecvenţe de 10khz, 40khz, şi 90khz. Link spre comentariu
Stefan Postat Februarie 7, 2013 Partajează Postat Februarie 7, 2013 deci vrei sa schimbi frecventa dupa ce se initializeaza canalul PWM? asta nu am idee cum se face dar trebuie incercat cu reinitializarea PWM-ului. La dsPIC-uri (blasfemie) parca frecventa se putea schimva din "mers" fara probleme sau la orice MC daca PWM-ul este unul software. Trebuie sa incerci cum merge si asteptam rezultatele. Link spre comentariu
Vlad Mihai Postat Februarie 7, 2013 Autor Partajează Postat Februarie 7, 2013 initial vroiam asa dar dupa mi-am dat seama ca e complicat, aşa că o sa fac coduri pentru anumite frecvente. de exemplu acum voi face unul pentru o frecventa care sa fie undeva la 10khz. Link spre comentariu
one Postat Februarie 11, 2013 Partajează Postat Februarie 11, 2013 Poti creste frecventa daca scazi rezolutia.Librariile de la MikroC sunt limitate la aplicatii generale. Daca vrei sa schimbi frecventa "din mers" mai degraba iti scrii propria librarie. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum