Forum: Mikrocontroller und Digitale Elektronik PWM über PT 10 gesteuert


von Steve U. (giftzwerg)


Angehängte Dateien:

Lesenswert?

Hallo,

habe mit jetzt mal Gedanken gemacht zu der PWM steuerung mittels PT 100 
auf dem ATMega 32 und dieses Programm geschrieben bin mir aber nicht 
Sicher, kann es imm moment aber auch nicht Testen also kann das so gehn. 
Oder was muss ich ändern??

Wenn müsste der Fehler im auslesen des ADCH Register sein aber wenn es 
so net geht wie dann???
Wäre Dankbar über hilfe.
noch mal das programm aus dem Anhang:
1
*
2
 * PWM_Programm.c
3
 *
4
 * Created: 15.01.2014 19:55:46
5
 *  Author: Steve Uffelmann
6
 */ 
7
8
9
#include <avr/io.h>
10
#include <avr/interrupt.h>
11
#define F_CPU 8000000UL
12
#include <util/delay.h>
13
14
15
int main(void)
16
{
17
  // Ein/Ausgänge konfigurieren
18
  DDRD |= (1<<PD7);        //Ausgänge
19
  
20
  
21
  //PWM konfigurieren
22
  TCCR2 |= (1<<WGM21);      //
23
  TCCR2 |= (1<<WGM20);      // Timer Einstellung Fast PWM, 8-bit
24
  TCCR2 |= (1<<CS22);       // Vorteiler 256
25
  TCCR2 |= (1<<COM21);      // Nicht invertierender PWM-Modus
26
  OCR2 = 0;            // Startwert Ausgang
27
  // ADC konfigurieren
28
  ADMUX  |= (1<<ADLAR);      // Datenrichtung  
29
  ADCSRA |= (1<<ADEN);      // ADC Einschalten
30
  ADCSRA |= (1<<ADSC);      // Starten Freimessen
31
  ADCSRA |= (1<<ADATE);      // Freimessen erlauben
32
  ADCSRA |= (1<<ADPS2);      //
33
  ADCSRA |= (1<<ADPS1);      // Takt Vorteiler 64
34
  ADCSRA |= (1<<ADPS0);      //
35
  
36
    while(1)
37
    {
38
       //Taster Frequenz höher
39
         
40
      if (ADCH)
41
      {
42
      if (ADCH > 11001101)
43
      if (ADCH < 11010011)
44
      OCR2 = 64;
45
      
46
      _delay_ms(20);      // 20ms Pause 
47
      } 
48
     
49
    if (ADCH)
50
    {
51
      if (ADCH > 11010011)
52
      if (ADCH < 11011000)
53
      OCR2 = 128;
54
      
55
      _delay_ms(20);      // 20ms Pause 
56
    }
57
    
58
    if (ADCH)
59
    {
60
      if (ADCH > 11011000)
61
      if (ADCH < 11011101)
62
      OCR2 = 191;
63
      
64
      _delay_ms(20);      // 20ms Pause 
65
    }
66
    
67
    if (ADCH)
68
    {
69
      if (ADCH > 11011101)
70
      OCR2 = 255;
71
      
72
      _delay_ms(20);      // 20ms Pause 
73
    }
74
    
75
    
76
    
77
        
78
     
79
       
80
    }
81
}

: Bearbeitet durch User
von Steve U. (giftzwerg)


Lesenswert?

Kann mir wirklich keiner Helfen??
Währe echt super.

von Karl H. (kbuchegg)


Lesenswert?

Du könntest dir selbst helfen, indem du erst mal ein paar Wochen 
investierst, um auf dem PC erst mal ein paar Grundlagen in C zu lernen.

Wenn ich sowas schon sehe
1
      if (ADCH)
2
      {
3
      if (ADCH > 11001101)
4
      if (ADCH < 11010011)
dann kräuselt sich bei mir alles.


Im AVR-GCC-Tutorial gibt es im ADC Abschnitt fix&fertige ADC 
Routinen. Benutze sie.

Und bitte: Lass den Quatsch mit (versuchten) Binärzahlen! Wenn du 232 
meinst, dann schreib auch 232 hin. Das hilft allen, inklusive dir. Vor 
allen Dingen dann, wenn deine Schreibweise für Binärzahlen falsch ist.

von Steve U. (giftzwerg)


Lesenswert?

Ja gut bin kein Fachmann, aber könntest du bitte mal die Nummer im 
Tutorial angeben. Denn ich  Finde ich dort nicht das Vergleichen von dem 
Registerwert mit einem von mir erdachten Wert um es in stufen zu 
schalten

von Falk B. (falk)


Lesenswert?

@ Steve Uffelmann (giftzwerg)

>Ja gut bin kein Fachmann, aber könntest du bitte mal die Nummer im
>Tutorial angeben. Denn ich  Finde ich dort nicht das Vergleichen von dem
>Registerwert mit einem von mir erdachten Wert um es in stufen zu
>schalten

1-Ultiomo. Du hast keine brauchbaren Grundlagen, nur Informationsfetzen.
Also musst du das GESAMTE Tutorial durcharbeiten. Und vorher ein 
KOMPLETTES Grundlagenbuch für C. Ist so.

von Steve U. (giftzwerg)


Lesenswert?

Gut okay und wie würdest du das Lösen?????

von Karl H. (kbuchegg)


Lesenswert?

Mit den ADC routinen vom Tuorial!
1
int main()
2
{
3
  uint16_t adcValue;
4
5
  //PWM konfigurieren
6
  DDRD |= (1<<PD7);        //Ausgänge
7
  TCCR2 |= (1<<WGM21);      //
8
  TCCR2 |= (1<<WGM20);      // Timer Einstellung Fast PWM, 8-bit
9
  TCCR2 |= (1<<CS22);       // Vorteiler 256
10
  TCCR2 |= (1<<COM21);      // Nicht invertierender PWM-Modus
11
  OCR2 = 0;            // Startwert Ausgang
12
13
  ADC_init();
14
15
16
  while( 1 )
17
  {
18
    adcValue = ADC_Read(0);
19
20
    if( adcValue < 300 )
21
      OCR2 = 64;
22
23
    else if( adcValue < 600 )
24
      OCR2 = 128;
25
26
    else if( adcValue < 800 )
27
      OCR2 = 191;
28
29
    else
30
      OCR2 = 255;
31
32
    _delay_ms(20);
33
  }
34
}

Ob die Vergleichswerte für die PWM Stufen sinnvoll sind oder nicht, 
weiss ich nicht, ich hab sie auf die Schnelle erfunden und ungefähr 
gleichmässig auf den Bereich 0 bis 1023 aufgeteilt.
Aber abgesehen davon: was stört dich an diesem Code? Ist der nicht 
naheliegend genug? Zu einfach zu verstehen? Zu wenig Möglichkeiten für 
Fehler?

von Karl H. (kbuchegg)


Lesenswert?

Steve Uffelmann schrieb:
> Ja gut bin kein Fachmann


schwache Ausrede.

Wer außer mit einem Hammer auf Rohre eindreschen nicht mit Werkzeug 
umgehen kann, sollte keine Klempnerarbeiten ausführen. Fachmann hin oder 
her, es gibt eine Untergrenze, unter der es nicht sinnvoll ist, in einem 
Bereich zu 'arbeiten'. Über diese Hürde muss man erst mal drüber. Und 
selbst dann ist man noch lange kein Fachmann.

: Bearbeitet durch User
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.