Forum: Compiler & IDEs PWM-Programmierung_Lüfter


von Josef (Gast)


Lesenswert?

Hey Leute, ich brauch euer Hilfe..
Und zwar will ich einen Lüfter mit PWM drehzahlregeln(im Atmel Studio, 
in C)  Nun wollte ich von euch wissen wie so ein PWM-Programm in C 
aussehen könnte, da ich im Netz nur Ansteuerung über PWM in Assembler 
finde, und aber leider nur C programmieren kann... Doch habe ich einiges 
gelesen und hab auch mal versucht zu programmieren.
Ich lern einfach am Besten wenn ich selbst versuche etwas zu schaffen 
aber hier ist dies leider misslungen. Ich wollte euch um Hilfe bitten..
Hier mein Programm zur PWM - Ansteuerung:
Bitte reitet nicht darauf wenn Fehler drin sind, ich bin blutiger 
Anfänger und man lernt bekanntlich ja nur aus Fehlern..
(ich habe versucht ein PWM Signal am PIN PC1 auszugeben)
1
int start=0;
2
start++;
3
    _delay_ms(20);
4
    if(start=10)
5
    
6
    
7
    {
8
      if(!(++count%100))
9
      {
10
        pos=++pos%2;
11
      }
12
      PORTC |= (1<<PC1);
13
      if(pos)
14
      _delay_us(1900);
15
      else
16
      _delay_us(1100);
17
      
18
      PORTC &= ~(1<<PC1);
19
      
20
      _delay_ms(18);      
21
      start=0;
22
    }


Schonmal danke

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Josef schrieb:

> Bitte reitet nicht darauf wenn Fehler drin sind, ich bin blutiger
> Anfänger und man lernt bekanntlich ja nur aus Fehlern..

Nicht ganz.
Ganz am Anfang funktioniert das Konzept des 'Try and Error' noch nicht. 
D.h. es funktioniert schon, aber nur im Zusammenhang mit etwas/jemandem 
der einen leitet. Zb ei C-Buch


>     if(start=10)

Das hier ist eine Zuweisung und kein Vergleich. Ein Vergleich auf 
Gleichheit schreibt sich als == und nicht als =

Den Rest des Codes hab ich mir nicht mehr genauer angesehen. Auf den 
ersten Blick sieht er aber mehr als wie die Generierung von 
Servo-Signalen. Auch wenn man Servo Signale als eine Form von PWM 
ansehen kann, so ist das trotzdem nicht zielführend, Servo Code als 
Beispiel für eine PWM anzusehen, an der man das Konzept einer PWM lernen 
möchte.

Vereinfacht sieht eine Software-PWM so aus (stark vereinfacht. So würde 
man das in einem echten Programm ganz sicher nicht machen)
1
int main()
2
{
3
  uint8_t pwmCnt = 0;
4
  uint8_t pwmLevel;
5
6
...
7
8
  pwmLevel = 20;
9
10
  while( 1 )
11
  {
12
    pwmCnt++;
13
14
    if( pwmCnt > pwmLevel )
15
      PORTC |= ( 1 << PC1 );
16
    else
17
      PORTC &= ~( 1 << PC1 );
18
  }
19
}

durch einen anderen Wert in pwmLevel ergibt sich eine andere zeitliche 
Verteilung dafür, wie lange der Pin auf 1 respektive 0 ist. Und genau 
darum geht es bei PWM: die Variation dieser zeitlichen Verteilung.

: Bearbeitet durch User
von Rudi R. (microwitsch)


Lesenswert?

Hallo,

Ich habe von C noch keine richtige Ahnung und will mich vorerst doch 
lieber mit Assemblercode beschäftigen!
Hat mich jetzt doch schon viel weiter gebracht und ich finde die 
ASM-Code inzwischen gar nicht so tragisch!?...Zum Anfang hatte ich noch 
Probleme doch jetzt fange ich an diesen Code zu mögen!:)

Gucke dir vielleicht doch mal das Projekt hier von Sprute.de an...die 
Seite ist ein echter Hammer und absolut zu 
empfehlen!https://www.sprut.de/electronic/pic/projekte/luefter/luefter.htm

Ansonsten habe ich mit Hilfe von dieser Seite hier auch schon eine 
PWM-Steuerung mit C hinbekommen!(PWM-Regulierung über Timer1-Interupt 
und Auf- und Abreglung über 2 Tastern).Falls dich der C-Code dazu 
interessiert,kann ich den gern mal hier senden.Allerdings arbeite ich 
hier mit einem PIC16F18877(durch einen Lehrbuchautor, der diesen dort 
verwendet)

Gruß André

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.