Geregelter Aufwärtswandler 12V/24V

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Dein P1 hängt am ADC3, das ist der channel 3.
      Mit 'wert_P1= Getadc(3)' kannst du die 'Stellung' von deinem Poti einlesen. Diese Variable kannst du ja probehalber auf deinem Display anzeigen lassen. Wenn du das Ganze in einer Schleife einbaust, dann kannst du gut verfolgen, wie der Wert der Verdrehung des Potis folgt.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • YdnAm schrieb:

      Ich kann ihnen nicht unter ihre antwort antworten.


      :/ das heisst ich muss nur `wert_P1=Getadc(3)` in mein bestehendes programm einbauen und es auf dem lcd anzeigen?
      @YdnAm Wenn das Absenden einer Antwort nicht klappt, dann den button 'Erweiterte Antwort' klicken und von dort dann die Antwort abschicken. Diese Schikane ist eine kleine Eigenart der Forumssoftware.

      Jetzt zu deiner Frage: du musst vorher noch den ad-Wandler configurieren, das geht so:

      CONFIG ADC = single, PRESCALER = AUTO, REFERENCE =AVCC

      da der ad-Wandler einen Wert mit 10 bits Genauigkeit ausgibt, muss du eine word-Variable verwenden

      dim Wert_P1 as word

      Jetzt kannst du in dein Programm die Zeile einbauen

      Wert_P1=getadc(3)

      Als Ergebnis erhältst du den Wert 1023, wenn am pin die gleiche Spannung wie die angegebene Referenz anliegt. Die wurde in der config ja mit AVCC angegeben, also die Betriebsspannung des Kontrollers.
      Wenn du als Ergebnis 0 erhältst, dann liegt der pin auf Gnd.
      Dein Poti lässt je nach Stellung eine Spannung von 0V bis VCC (5V) am pin anliegen, du kannst also als Wert_P1 alle Werte von 0 bis 1023 bekommen die du dir auf dem LCD anzeigen lassen kannst.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • BASCOM-Quellcode

      1. $regfile="m16def.dat"
      2. $crystal=8000000
      3. Config Lcd=20*4
      4. Config Lcdpin=Pin,Db4=PORTC.0,Db5=PORTC.2,Db6=PORTC.4,Db7=PORTC.6,E=PORTC.5,Rs=PORTC.7
      5. Cursor off
      6. cls
      7. Const Fosc=8000000
      8. Const Fpwm=15000
      9. Const Prescale=1
      10. Config Pinc.5=Input
      11. Pinc.5 alias Usoll
      12. Dim Usoll as single
      13. Config Adc=single , Prescaler=auto , Reference=Internal
      14. Start Adc
      15. Dim Adcwert as word
      16. DIm Uist as single
      17. Dim Schritte as Word
      18. Dim Pwmwert as Single
      19. Dim Hilfsin as Single
      20. Pwmwert=200
      21. Pwm1a=Pwmwert
      22. Tccr1a=&B10000010
      23. Tccr1b=&B00011001
      24. Hilfsin=Fosc/Fpwm
      25. Hilfsin=Hilfsin/Prescale
      26. Hilfsin=Round(hilfsin)
      27. Schritte=Hilfsin
      28. CAPTURE1=Schritte
      29. Config Portd.5=OUTPUT
      30. Do
      31. Adcwert=Getadc(0)
      32. Cls
      33. Locate 4,1
      34. Waitms 200
      35. Messe Uist
      36. If Uist>Usoll then
      37. Pwmwert=Pwm+1
      38. else
      39. Pwmwert=Pwm-1
      40. End if
      41. Loop
      42. Cls
      43. Locate 1,1:Lcd "PWM-Signal mit:"
      44. Locate 2,1:Lcd "Frequenz=":Locate 1,12:Lcd Fpwm
      45. Locate 3,1:Lcd "Schritte=":Locate 3,12:Lcd Schritte
      46. Do
      47. Pwmwert=200
      48. Pwm1a=Pwmwert
      49. Loop
      Alles anzeigen



      Dies ist mein momentaner Programm, aber glaube dass es da noch viel zu machen gibt...
    • Sieht doch nicht schlecht aus . Was sagt der Simulator?
      Das Lcd wird gewaltig flackern wenn es alls 200 ms zwei cls bekommt.
      Das loop vor dem zweiten cls als auch das do hinter dem Locate müssten weg sonst würden die ersten Zeilen nie beschrieben.
      Die Regelung selber ist sehr träge wenn sie nur alle 200 ms nach bessert. Für die ersten Versuche würde ich einen Heizkörper empfehlen oder ein 230V Halogenstab.
    • YdnAm schrieb:

      glaube dass es da noch viel zu machen gibt
      ja, ist aber normal, wenn man mit was anfängt.
      Es wäre schön, wenn du deinen code in ein 'code Fenster' hier rein stellst. Wenn du eine Antwort schreibst, dann schau mal in der oberen Zeile des Editors, da findest du diese Zeichen </>. Da rauf klicken und es öffnet sich das Fenster, wo du deinen code hinein kopieren kannst.
      Nächster Punkt, bitte gebe in deinem Programm noch die stack-Werte mit an. Schau dazu mal in die Hilfe unter diesem Punkt avrhelp.mcselec.com/newbie_problems.htm gleich am Anfang.

      Jetzt mal zu deinem Programm
      Do
      Adcwert=Getadc(0) < hier misst du die Spannung, die am Kanal 0 anliegt, welcher pin ist das? Ist das der gewünschte?
      Cls
      Locate 4,1 < da steht jetzt der cursor, was soll er anzeigen?
      Waitms 200
      Messe Uist < das schaut nicht nach einem bascomBefehl aus, eher wie ein Aufruf einer sub, die ist aber dann nicht komplett
      If Uist>Usoll then < das ist schon mal eine Regelung, dir fehlen aber Uist und Usoll
      Pwmwert=Pwm+1
      else
      Pwmwert=Pwm-1
      End if
      Loop < und hier springst du wieder zu dem do oben, die Schleife wird nie verlassen, sodass du zum unteren Teil deines Programm nie kommst.

      Mach zuerst doch mal eine Schleife:
      den Kanal einlesen, wo dein Poti dran hängt
      den Wert zeigst du auf dem display an
      wartest 200 mS
      löscht dein display
      springst wieder zum Anfang der Schleife

      Das das noch kein super Programm ist, ist klar, aber es soll ja auch erstmal ein Anfang sein.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo YdnAm,

      YdnAm schrieb:

      Const Fosc=8000000
      Const Fpwm=15000
      Const Prescale=1
      warum legst du da 3 Konstanten an ?

      YdnAm schrieb:

      Hilfsin=Fosc/Fpwm
      Hilfsin=Hilfsin/Prescale
      Das kannst du auch mit dem Taschenrechner ausrechnen , und das Ergebnis in Hilfsin eintragen.
      Da du ja Konstanten verwendest, die sich ja nie ändern werden, ist auch das Ergebnis in Hilfsin
      immer das gleiche.

      YdnAm schrieb:

      Hilfsin=Round(hilfsin)
      Schritte=Hilfsin
      Auch da das gleiche, wie oben schon beschrieben. Wenn du Hilfsin nicht noch woanders brauchst,
      reicht es wenn du schreibst "Schritte = 533".
      Alles andere kostet nur Speicherplatz.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • tschoeatsch schrieb:

      YdnAm schrieb:

      glaube dass es da noch viel zu machen gibt
      ja, ist aber normal, wenn man mit was anfängt.Es wäre schön, wenn du deinen code in ein 'code Fenster' hier rein stellst. Wenn du eine Antwort schreibst, dann schau mal in der oberen Zeile des Editors, da findest du diese Zeichen </>. Da rauf klicken und es öffnet sich das Fenster, wo du deinen code hinein kopieren kannst.
      Nächster Punkt, bitte gebe in deinem Programm noch die stack-Werte mit an. Schau dazu mal in die Hilfe unter diesem Punkt avrhelp.mcselec.com/newbie_problems.htm gleich am Anfang.

      Jetzt mal zu deinem Programm
      Do
      Adcwert=Getadc(0) < hier misst du die Spannung, die am Kanal 0 anliegt, welcher pin ist das? Ist das der gewünschte?
      Cls
      Locate 4,1 < da steht jetzt der cursor, was soll er anzeigen?
      Waitms 200
      Messe Uist < das schaut nicht nach einem bascomBefehl aus, eher wie ein Aufruf einer sub, die ist aber dann nicht komplett
      If Uist>Usoll then < das ist schon mal eine Regelung, dir fehlen aber Uist und Usoll
      Pwmwert=Pwm+1
      else
      Pwmwert=Pwm-1
      End if
      Loop < und hier springst du wieder zu dem do oben, die Schleife wird nie verlassen, sodass du zum unteren Teil deines Programm nie kommst.

      Mach zuerst doch mal eine Schleife:
      den Kanal einlesen, wo dein Poti dran hängt
      den Wert zeigst du auf dem display an
      wartest 200 mS
      löscht dein display
      springst wieder zum Anfang der Schleife

      Das das noch kein super Programm ist, ist klar, aber es soll ja auch erstmal ein Anfang sein.
      wie kann ich das denn als bascombefehl schreiben, dass er Uist messen soll ? (Messe Uist < das schaut nicht nach einem bascomBefehl aus, eher wie ein Aufruf einer sub, die ist aber dann nicht komplett)
      Wie kann ich die regelung denn so schreiben, dass da nix mehr fehlt? (If Uist>Usoll then < das ist schon mal eine Regelung, dir fehlen aber Uist und Usoll)
    • Wenn ich deine Fragen beantworten würde, dann wärst du ja fast schon fertig. Ich hab' jetzt mal dein Programm bisschen geändert und ein Beispiel daraus gemacht, wie man eine Spannung messen kann. Das ist jetzt die am pinc.3, wo dein Poti P1 dran hängt. Probiere das Programm mal aus, es sollte die Spannung am display anzeigen, wenn du am Poti drehst, soll die Anzeige der Drehung entsprechend folgen.

      BASCOM-Quellcode

      1. $regfile = "m16def.dat"
      2. $crystal = 8000000
      3. $hwstack = 64
      4. $swstack = 32
      5. $framesize = 30
      6. Config Lcd = 20 * 4
      7. Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.2 , Db6 = Portc.4 , Db7 = Portc.6 , E = Portc.5 , Rs = Portc.7
      8. Cursor Off
      9. cls
      10. Const Fosc=8000000
      11. Const Fpwm = 15000
      12. Const Prescale = 1
      13. Config Adc = Single , Prescaler = Auto , Reference = Internal
      14. Start Adc
      15. Dim Adcwert as word
      16. Dim Uist As Single
      17. Dim Usoll As Single
      18. Dim Usoll_anzeige As String * 5
      19. Dim Schritte As Word
      20. Dim Pwmwert As Word
      21. Dim Hilfsin As Single
      22. Pwmwert=200
      23. Pwm1a = Pwmwert
      24. Tccr1a = &B10000010
      25. Tccr1b = &B00011001
      26. Hilfsin=Fosc/Fpwm
      27. Hilfsin = Hilfsin / Prescale
      28. Hilfsin = Round(hilfsin)
      29. Schritte = Hilfsin
      30. Capture1 = Schritte
      31. Config Portd.5 = Output
      32. Do 'Beginn der Schleife
      33. Adcwert = Getadc(3) 'Spannung vom Poti P1 0V=Adcwert=0, 5V=Adcwert=1023 (ca.-Werte)
      34. ' 1 digit =5/1023 Volt = 0,00489V
      35. Usoll = Adcwert 'von word auf single bringen
      36. Usoll = Usoll * 0.00489 'die am pin anliegende Spannung ausrechnen
      37. Usoll_anzeige = Fusing(usoll , "#.##") 'Spannung auf 2 Stellen runden , nur für die Anzeige
      38. Locate 1 , 1 : Lcd "Spannung am pinc.3"
      39. Locate 2 , 1 : Lcd " " 'Anzeigebereich löschen
      40. Locate 2 , 1 : Lcd Usoll_anzeige ; " V" 'Anzeigen der Spannung am display
      41. Waitms 100 'Anzeige 100mS stehe lassen
      42. Loop 'Schleife, die Spannung wird neu gemessen
      43. End
      Alles anzeigen
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Übrigens, es ist wohl noch nicht aufgefallen, dein $regfile passt nicht zu deinem Kontroller.
      Hast du eigentlich schon mal probiert, was zu compilieren?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Wenn ich deine Fragen beantworten würde, dann wärst du ja fast schon fertig. Ich hab' jetzt mal dein Programm bisschen geändert und ein Beispiel daraus gemacht, wie man eine Spannung messen kann. Das ist jetzt die am pinc.3, wo dein Poti P1 dran hängt. Probiere das Programm mal aus, es sollte die Spannung am display anzeigen, wenn du am Poti drehst, soll die Anzeige der Drehung entsprechend folgen.

      BASCOM-Quellcode

      1. $regfile = "m16def.dat"
      2. $crystal = 8000000
      3. $hwstack = 64
      4. $swstack = 32
      5. $framesize = 30
      6. Config Lcd = 20 * 4
      7. Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.2 , Db6 = Portc.4 , Db7 = Portc.6 , E = Portc.5 , Rs = Portc.7
      8. Cursor Off
      9. cls
      10. Const Fosc=8000000
      11. Const Fpwm = 15000
      12. Const Prescale = 1
      13. Config Adc = Single , Prescaler = Auto , Reference = Internal
      14. Start Adc
      15. Dim Adcwert as word
      16. Dim Uist As Single
      17. Dim Usoll As Single
      18. Dim Usoll_anzeige As String * 5
      19. Dim Schritte As Word
      20. Dim Pwmwert As Word
      21. Dim Hilfsin As Single
      22. Pwmwert=200
      23. Pwm1a = Pwmwert
      24. Tccr1a = &B10000010
      25. Tccr1b = &B00011001
      26. Hilfsin=Fosc/Fpwm
      27. Hilfsin = Hilfsin / Prescale
      28. Hilfsin = Round(hilfsin)
      29. Schritte = Hilfsin
      30. Capture1 = Schritte
      31. Config Portd.5 = Output
      32. Do 'Beginn der Schleife
      33. Adcwert = Getadc(3) 'Spannung vom Poti P1 0V=Adcwert=0, 5V=Adcwert=1023 (ca.-Werte)
      34. ' 1 digit =5/1023 Volt = 0,00489V
      35. Usoll = Adcwert 'von word auf single bringen
      36. Usoll = Usoll * 0.00489 'die am pin anliegende Spannung ausrechnen
      37. Usoll_anzeige = Fusing(usoll , "#.##") 'Spannung auf 2 Stellen runden , nur für die Anzeige
      38. Locate 1 , 1 : Lcd "Spannung am pinc.3"
      39. Locate 2 , 1 : Lcd " " 'Anzeigebereich löschen
      40. Locate 2 , 1 : Lcd Usoll_anzeige ; " V" 'Anzeigen der Spannung am display
      41. Waitms 100 'Anzeige 100mS stehe lassen
      42. Loop 'Schleife, die Spannung wird neu gemessen
      43. End
      Alles anzeigen
      Ich habe dieses Programm versucht und den atmega16 in ein atmega8 umgeschrieben, es hat funktioniert aber wie soll ich dies jetzt umschreiben dass ich 24 V konstant heraus bekomme??
    • Indem du dir Gedanken machst, wie du mit Hilfe des Spannungsteilers R3, R4 am Kanal 5 des adWandlers Spannungen bis 25V messen kannst. Das ist ja deine Ist-Spannung. Diese musst du mit der Soll-Spannung vergleichen und entsprechend deine PWM anpassen. Ist Uist<Usoll dann Pulsweite (Einschaltdauer) vergrößern. Wenn Uist>Usoll Einschaltdauer verkleinern. Das ist die Regelung im Groben. Vielleicht noch eine Begrenzung der Einschaltdauer, um den Fet zu schonen.
      Der Zusammenhang zwischen Einschaltdauer und Ausgangsspannung ist dir klar?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • ^Hi,
      Tschoeatsch hat es dir bereits gezeigt


      BASCOM-Quellcode

      1. Adcwert=Getadc(0) < hier misst du die Spannung, die am Kanal 0 anliegt
      ADCWert ist deine Spannung UIst (~24V)

      Usoll = 24
      UIst = ADCWert umgerechnet in Spannung

      wobei du natürlich auch den USoll Wert von 24 umrechnen könntest und danach direkt mit dem ADCWert vergleichen kannst; wie es dir gefällt
      Code first, think later - Natural programmer :D
    • Hallo,

      ich hatte mal Lust den Spannungsteiler R3 / R4 zu berechnen.

      Um eine Scherheit bei Überspannung am AD-Wandlereingang zu bekommen, habe ich die max. Spannung auf 40 V gerechnet.
      Um eine einfache Anzeige auf dem Display zu bekommen, wird der AD-Wert einfach mit 4 multipliziert, und das Komma um zwei
      Stellen nach links geschoben.

      Ich wünsche allen schöne Weihanchten

      Sepp
      Dateien
    • tschoeatsch schrieb:

      Indem du dir Gedanken machst, wie du mit Hilfe des Spannungsteilers R3, R4 am Kanal 5 des adWandlers Spannungen bis 25V messen kannst. Das ist ja deine Ist-Spannung. Diese musst du mit der Soll-Spannung vergleichen und entsprechend deine PWM anpassen. Ist Uist<Usoll dann Pulsweite (Einschaltdauer) vergrößern. Wenn Uist>Usoll Einschaltdauer verkleinern. Das ist die Regelung im Groben. Vielleicht noch eine Begrenzung der Einschaltdauer, um den Fet zu schonen.
      Der Zusammenhang zwischen Einschaltdauer und Ausgangsspannung ist dir klar?
      liege ich überhaupt richtig wenn ich $crystal = 8000000 für einen atmega8 benutze?
    • Ja, ich denlke auch, dass der Ausbilder sowas nicht honoriert.
      In Beitrag #1 ist die Aufgabenstellung und in Beitrag #32 nochnmal bestätigt.
      Es soll vermutlich eine eigene Lösung gefunden werden, ohne Hilfe aus dem Netz.
      Der OP hat ja extra seine Aufgabenblätter abfotografiert, damit man sie nicht per Textsuche im Netz findet ;)
      Allerdings wären wir mit Fleiß schon lange an dem Punkt, weil wir hier selten etwas vorkauen und dem Einsteiger auf den Weg helfen. Das würde der Lehrer imho als Eigeninitiative durchgehen lassen.
    • Was mich die ganze Zeit stutzig macht ist der MCU-Takt

      Quarz ist 16MHz, im Programm sind 8MHz eingestellt.
      Vermutlich sind die Fusebits auch nicht auf ext. Crystal eingestellt. Möglicherweise läuft der Controller noch mit internem Takt 1MHz.

      Auch die PWM-Frequenz kann nie hinhauen.
      Was soll das mit den 533 als Caption1-Wert?

      Wenn das der Top-Wert für den Timer 1 ist und der Timer dann automatisch gleich wieder auf 0 geht (Clear Timer=1), dann wäre die PWM-Freuenz mit Prescaler = 1
      und angenommenen 16MHz Takt nur rund 30kHz.

      Im Capture1-Register muss 159 stehen. Damit erreicht man 100Khz PWM.
      Der PWM Wert kann dann aber nur zwischen 0 und 160 liegen.

      Ich denke da sollte man erst mal den Takt richtig stellen.