www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Frequenz


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte einen kleinen Motor an einem Attiny2313 über ein L293D 
betreiben. Meine Schaltung sowie Programmierung funktioniert auf einem 
Testboard mit einem Atmega32 mit 16 Mhz Quarz.

Allerdings funktioniert der Motor nicht am Attiny (mit internem 
Oszillator). Bei 1 Mhz (also interne 8 Mhz/8), Prescaler 1 und 8-bit PWM 
bekomm ich zumindest den Motor schonmal zum Pfeifen :D.

Weiß jemand da Rat ? Wenn nicht löt ich da nochn 16Mhz Quarz dran, wie 
in der anderen Schaltung.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es, wenn du dein Programm posten würdest?

Autor: Jörg B. (manos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal die Signale mit einem Oszilloskop angesehen ob es da 
Unterschiede gibt?

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also bei mehr als ca 5 kHz macht der L293D nicht mehr mit.
Geh mal mit der Frequenz runter und schau ob der Motor dann dreht.

Eckhard

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist das Programm:
void waitms(uint16_t ms)
{
  for(; ms>0; ms--)
  {
    uint16_t __c = 2000;
    __asm__ volatile (
      "1: sbiw %0,1" "\n\t"
      "brne 1b"
      : "=w" (__c)
      : "0" (__c)
    );
  }
}



/*### PWM-Routinen zur Motoransteuerung ###*/

void init_timer1(void)  //Initialisierung des Timers für Erzeugung des PWM-Signals
{
   /* normale 8-bit PWM aktivieren (nicht invertiert),
   Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
   TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);

   /* Einstellen der PWM-Frequenz auf 14 kHz ( Prescaler = 1 ) */
   TCCR1B = (1<<CS10);

   /* Interrupts für Timer1 deaktivieren
   Achtung : Auch die Interrupts für die anderen Timer stehen in diesem Register */
   TIMSK &= ~0x3c;
}



void setPWMlinks(uint8_t speed) //Geschwindigkeit linker Motor
{OCR1AL = speed;}



void Mlinkszur(void)  //Uhrzeigersinn
{PORTB |= (1<<PB0); PORTB &= ~(1<<PB1);}

void Mlinksvor(void)  //mathematischer Drehsinn
{PORTB &= ~(1<<PB0); PORTB |= (1<<PB1);}

void Mlinksstop(void)  //aus
{ PORTB &= ~(1<<PB0); PORTB &= ~(1<<PB1);}
int main (void) {            

  DDRD |= (1 << PD6);
  DDRB |= (1 << PB0)|(1 << PB1)|(1 << PB3);
   init_timer1();


while(1)
{

  Mlinksvor();

  setPWMlinks(0);


  for(uint8_t i=0; i<255; i=i+5)
  {
    setPWMlinks(i);
    waitms(50);
  }

  setPWMlinks(255);


  for(uint8_t i=255; i>0; i=i-5)
  {
    setPWMlinks(i);
    waitms(50);

  }

  setPWMlinks(0);

  Mlinksstop();
  waitms(300);

}
    
    return 0;
   }

Es läuft auf dem Atmega32 mit 16Mhz Quarz. Ich vermute mal die waitms() 
Funktion hat mehr Einfluß auf die PWM Frequenz als ich denke.

Habe alle Prescaler duchprobiert, bei Prescale = 1 pfeift er wie gesagt 
und ansonsten klickt er nur, dreht aber nicht und der Controller 
resettet ständig. Am Mega32 läuft alles rund mit diesen Einstellungen + 
16 Mhz Kristall.

Wie berechnet sich denn die PWM Frequenz ? Quarzfrequenz  Prescale  
8-bit ?

Danke nochmal für eure Hilfe

Autor: Jörg B. (manos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spontan sehe ich keine Prozessortakt-Anpassung in Deiner Waitms-Routine. 
Es mag ja sein, dass Dein Testboard einen 16 MHz Quarz drauf hatte, aber 
wurde der auch genutzt oder lief auf dem µC evtl. auch nur das interne 
RC-Glied?

Einfach mal beide Signale am Ausgang (Mega und Tiny) mit nem Oscar 
ansehen und schauen wie die Frequenz ist. Gibt auch einige Multimeter 
die Frequenz und PWM messen können.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du schon mit dem AVR-GCC arbeitest (was ich aus dem syntaktischen 
Zusammenhang mal annehme), warum nutzt Du nicht die _delay_ms-Funktion 
aus der util/delay.h?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das habe ich überprüft, der Atmega32 nutzt den 16 Mhz. Zieht man den 
Quarz heraus, gibts auch keinen Pieps mehr von sich.

Ich bin leider Einsteige in avr-gcc und klaube mir solangsam das gesamte 
Wissen zusammen. Das Programm oben ist vom RN-Control board aus dem 
roboternetz.de .

Werd mir die _delay_ms Funktion mal anschauen und ein Oscar besorgen :).

Was ich mich noch Frage ist, wie die 14 khz zustande kommen sollen, im 
Obigen Programmiercode. Hat da vielleicht jemand eine Formel zu ?

Hab bisher gerechnet: 16 * 10^6 Mhz geteilt durch Prescaler 1 geteilt 
durch (2*512) ~ 15 khz

Wobei ich die 512 aus dem avr-gcc turorial beziehe:
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Die 2 hat dabei aber keinen reellen Hintergrund, die fehlt nur damit das 
Ergebnis stimmt :).

-------

Danke schonmal für eure Hilfe, werd die Ausgänge definitiv mal messen 
müssen. Wenn ihr noch eine Idee habt bzgl. der Berechnung der PWM 
frequenz würd ich mich freuen.

Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.