Sari la conținut
ELFORUM - Forumul electronistilor

Generare PWM cu atmega 32


Vlad Mihai

Postări Recomandate

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
  • Răspunsuri 10
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Vlad Mihai

    5

  • Stefan

    2

  • godFather89

    2

  • one

    1

Top autori în acest subiect

Vizitator Cipri_v

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

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

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

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

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări