-
        

Ergebnis 1 bis 8 von 8

Thema: Probleme mit ATMega32 und PWM und LCD

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.01.2008
    Beiträge
    5

    Probleme mit ATMega32 und PWM und LCD

    Anzeige

    Hallo zusammen,

    ich arbeite noch nicht so lange mit µC's, also kann es sein, das es ganz einfache Fragen sind.
    Google etc. wirft für mich auch keine brauchbaren Antworten aus. Aber das RN-Wissen war zum Teil ganz hilfreich.

    Ich wollte mit PWM eine LED heller und dunkler leuchten lassen. Da passiert aber garnichts! Ich glaube da fehlt noch eine Definierung zwischen dem PWM und dem Port. Hier mal der Code:
    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    
    Config Portb.1 = Output
    Config Portb.2 = Output
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    
    Do
     Compare1a = 205
     Compare1b = 51
    
    Loop
    
    End
    Also die LEDs an Port B1 und B2 soll jeweils unterschiedlich hell leuchten.

    2. Frage:
    Wenn ich das richtig verstanden habe, schaltet der Chip immer zwischen +5V und 0V um. Aber die Leds sind doch nur für 3V ausgelegt. Oder entsteht da eine abgerundete Sinuswelle? Bei 5V würden die doch kaputt gehen.

    3. Frage:
    Ich habe ein 4*20 Zeichen LCD. Das lässt sich auch wunderbar im Bit Modus ansteuern. Aber nach dem Letzten Buchstaben oder Zeichen kommt immer so ein _ (Unterstrich). Wie kann ich den unterdrücken/verhindern?

    Danke schonmal im voraus

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hi,

    zum PWM: Die OC-Ausgänge von Timer 1 sind bei PortD4 und 5.

    2. Ohne Vorwiderstand darf man die LED nicht betreiben, sonst brennt die nur einmal, hier ausrechnen:
    http://www.elektronik-kompendium.de/...au/1109111.htm

    3. Das wird der Cursor sein, einfach abschalten, siehe Bascomhilfe.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.01.2008
    Beiträge
    5
    Das mit dem Cursor habe ich hinbekommen. Danke
    -> Cursor off

    Aber ich dachte, man kann mit PWM auch Spannungen zwischen 0 und 5 V erzeugen. Dann wird die Helligkeit der LED ja nicht wirklich verändert, sondern dem Auge etwas vorgegaukelt!
    Wie kann ich denn zum Beispiel eine (fast) saubere Sinus-Wechselspannung erzeugen?
    Kann ich die PWM von PortD.4 und PortD.5 auch auf andere Ports "umlegen"? Oder mehrere Timer für andere Ports verwenden?

    Danke schonmal im voraus

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Die OC-Ausgänge sind fest, jeder Timer hat seine eigenen.

    Das mit dem vorgaukel ist richtig, ist ja auch Sinn der Sache, LEDs wollen das auch nur so, nur 0 oder 1 !

    Wenn das Rechtecksignal kurvig werden soll, muss man aussen mit Kondensatoren experimentieren, bzw. die die sich damit auskennen, berechnen
    Ob man einen Sinus hinbekommt bin ich mir aber nicht sicher.
    Wechselspannung geht so garnicht, da brauchts etwas mehr an Beschaltung, siehe zB. Motortreiber (H-Brücke).

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    08.01.2008
    Beiträge
    5
    Und wie sieht es mit mit D/A Wandlern aus? Davon besitzt der ATmega32 doch welche, oder? Die müssten doch Sinusförmige Spnnungen erzeugen können, wenn auch nur im positiven bereich!?

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Sorry, diese Richtung kann der AVR nicht, nur A->D.
    Man kann nur das PWM nutzen um D/A zu bekommen, dazu muss man aber selber extern beschalten. Mit Sinus schauts trotzdem nicht ganz so gut aus, bzw. wenns ganz langsam geht, und man die Werte ständig ändert, könnte das in die Rubrik Sinus fallen
    Aber dazu sollte man bei den Elektr(on)ikern anfragen.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    08.01.2008
    Beiträge
    5
    Ok, Danke.

    Jetzt habe ich Im RN-Wissen nach ADC gesucht, gefunden und abgewandelt übernommen, weil ich noch kein Kable zur RS232 habe sondern nur ein Display.
    Der ATmega32 soll nach folgendem Code die Spannung an allen PortA bzw. nur an PortA.0 auslesen und im Display mit dazugehöriger Pinnummer anzeigen. Klappt soweit auch fast alles, nur habe ich mit offenem Ende an PortA.0 (nicht mal ein Kabel ist angechlossen) einen Wert von 1 Volt! Und bei der Versorgungsspannung bloß 4Volt anstatt 5V. Aber er wird mit 5V versorgt (sogar nachgemessen!). Woran liegt das? Bis wieviel Volt kann der ATmega32 messen?
    Den Wert von den Ports habe ich natürlich umgewandelt nach RN-Wissen.
    Code:
    regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    
    Config Portc.5 = Output                                     'Híntergrundbeleuchtung
    Config Portd.6 = Output                                     'Gruen LED
    
    'LCD Eigenschaften...
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Portc.2 , Db6 = Portc.3 , Db7 = Portc.4 , E = Portc.0 , Rs = Portd.7
    Config Lcdbus = 4
    
    Portc.5 = 1                                                 'Hintergrundbeleuchting ein
    Portd.6 = 1                                                 'Gruen LED ein
    Cursor Off                                                  'Cursor ausschalten
    Cls                                                         'Display löschen
    
    Config Adc = Single , Prescaler = Auto
    Start Adc
    Dim W As Word , Channel As Byte
    Channel = 0
    
    
    
    Do
      W = Getadc(channel)                                       'Wert am Port auslesen
      W = W * 5                                                 'Wert * Interne Referenzspannung (5V)
      W = W / 1024                                              'Wert / 1024 oder Wert / 2^10
      Locate 2 , 1                                              'Wert ausgeben mit Pinangabe
      Lcd "ADC-Pin: "
      Locate 2 , 10
      Lcd Channel
      Locate 3 , 1
      Lcd "Wert: "
      Locate 3 , 10
      Lcd W ; " Volt"
    
    
    
      'Incr Channel                                             'Damit nur PortA.0 angezeigt wird
      If Channel > 7 Then Channel = 0                           'Im Moment überflüssig
      Waitms 500
    Loop
    
    End
    So gibt es ja keine zuverlässige Angabe. Warum werden nur ganzzahlige Werte angezeigt?

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2007
    Ort
    Bodenseeregion
    Alter
    27
    Beiträge
    135
    Also wenn man am ADC nichts anschließt, ihn aber trotzdem Aktiviert, kommen immer solche Werte raus. Weis nich wieso, aber das wurde mir am Anfang auch mal gesagt. Die Messergebnisse stimmen dann schon, sobald du was "richtiges" anschließt.

    Der Atmega32 kann ohne Hilfsmittel bis 5 Volt Messen, alles darüber kann den Port bzw. den ganzen Atmega beschädigen. Willst du trotzdem höhere Spannungen messen, musst du vor den ADC einen Spannungsteiler (zwei Widerstände in Reihe) schalten, sodass am ADC eben nur maximal(!) 5V rauskommen. Dann kannst du per Software hochrechnen, wieviel Volt du vor dem Spannungsteiler (Ohmsches Gesetz) hast.

    Gruß, Robin

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •