Geregelter Aufwärtswandler 12V/24V

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Source Code

      1. $regfile="m8def.dat"
      2. $crystal=16000000
      3. Config Lcd=20x4
      4. Config Lcdpin=Pin,Db4=PORTB.2,Db5=PortB.0,Db6=PORTD.7,Db7=PORTD.6,E=PORTD.4,Rs=PORTC.0
      5. Cursor off
      6. cls
      7. Const Fosc=16000000
      8. Const Fpwm=16000
      9. Const Prescale=1
      10. Config Adc=Single,Prescaler=Auto,Reference=Avcc
      11. Start Adc
      12. Dim Usoll_ as Word
      13. Dim Uist as Single
      14. Dim Uist_ as Word
      15. Dim Usoll as Single
      16. Dim Schritte as Word
      17. Dim Pwmwert as Word
      18. Dim Hilfsin as Single
      19. Dim C as Single 'Schrittweite single
      20. Dim Pwmfaktor as Single 'Pwmfaktor ;Regeldifferenz*Faktor
      21. Dim Pwm as Word
      22. Dim Regeldifferenz as Single
      23. Dim Adcwert as Word
      24. Dim Tastgrad as Single
      25. Dim Uin as Single
      26. Dim Uin_ as Word
      27. Pwmwert=200
      28. Pwm1a=Pwmwert
      29. Tccr1a=&B10000010
      30. Tccr1b=&B00011001
      31. Hilfsin=Fosc/Fpwm
      32. Hilfsin=Hilfsin/Prescale
      33. Hilfsin=Round(hilfsin)
      34. Schritte=Hilfsin '=1000
      35. Capture1=Schritte
      36. Config PortB.1=Output
      37. Config Pind.5=Input
      38. Regeldifferenz=0
      39. Do 'Beginn der Schleife
      40. Uist_=Getadc(5)
      41. Usoll_=Getadc(3) 'Spannung vom Poti P1 0V=Adcwert=O,5V=Adcwert=1023
      42. Uin_=Getadc(1)
      43. 'digit=5/1023 Volt=0,00489V
      44. Usoll=Usoll_ 'von word auf single bringen
      45. Usoll=Usoll*0.038798185941 'die am pin anliegende Spannung ausrechnen
      46. Uist=Uist_
      47. Uist=Uist*0.038798185941
      48. Uin=Uin_
      49. Uin=Uin*0.0157728706624
      50. Regeldifferenz= Usoll-Uist
      51. Pwmfaktor=Regeldifferenz*5
      52. If Regeldifferenz <=0 then 'Spannung geht runter
      53. C=C+Pwmfaktor
      54. End if
      55. If Regeldifferenz >=0 then
      56. C=C+Pwmfaktor
      57. End if
      58. C=round(C)
      59. If C>1001 then
      60. C=1000
      61. End if
      62. If C<0 then
      63. C=1
      64. End if
      65. Adcwert=Getadc(5)
      66. Pwm=C
      67. Pwm1a=Pwm
      68. Tastgrad=Pwm/10
      69. Locate 1,1:Lcd "Uin:"
      70. Locate 1,8:Lcd fusing (Uin,"#.#");"V";" "
      71. Locate 2,1:Lcd "Usoll: "
      72. Locate 2,8:Lcd fusing (Usoll,"#.#");"V";" " 'Anzeige der Spannung auf dem Display
      73. Locate 3,1:Lcd "Uist: "
      74. Locate 3,8:Lcd fusing (Uist,"#.#");"V";" "
      75. Locate 4,1:Lcd "Pwm: "
      76. Locate 4,8:Lcd fusing (Tastgrad,"#.#");" %";" " 'Schreibt Leerzeichen über die überflüssigen Zeichen.
      77. 'Locate 4,1:Lcd "ADC: ";Adcwert
      78. Waitms 100
      79. Loop 'Schleife, die Spannung wird neu berechnet.
      80. End
      Display All
      dies ist das programm das funktioniert, und das Projekt ist vom Lehrer abgenommen worden.
    • Was ist das für ein Lehrer? Die Regelung bei zu niederer und zu hoher Uist ist gleich? Zeile 71 und Zeile 75. Nur 10 Regelungen/Sekunde?

      Trotzdem, Glückwunsch.

      Edit: stimmt nicht, was ich schrieb. Die Regelung passt schon, nur die 2 if-Abfragen hätt's nicht gebraucht.
      Raum für Notizen

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

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

      The post was edited 1 time, last by tschoeatsch ().

    • Meiner Meinung nach Ziel (Aufgabenstellung) nicht erreicht.

      1. Vorgabe der PWM-Frequenz von 100kHz. Im Code eingestellt 1kHz.
      2. Die Regelung der Ausgangsspannung kann so nicht funktionieren. Denn wenn die Regeldifferenz positiv ist, müsste die Ausgangs-Spannung abgeregelt werden. Siehe Zeile 74-76. Variable C entspricht dem Integral, also der Summe der Regeldifferenz * Ki (5) jeder Einzelmessung. Das Vorzeichen ist falsch.


      Die Regelung ist mit 10 Messungen/Nachregelungen der Ausgangsspannung pro Sekunde nicht ausreichend. Das hat @tschoeatsch bereits korrekt festgestellt.

      Unnützer Code ist auch vorhanden.
      • Zeile 46 (Pins sind nach dem Einschalten bereits als Input konfiguriert). Muss also nicht explizit nochmal als Input konfiguriert werden.
      • Zeile 87. der eingelesene ADC-Wert wird nicht weiter verwendet. Außerdem wurde der Wert in Zeile 53 bereits in Variable Uist_ eingelesen.


      Was OK ist, sind die Berechnungen der Eingangs- Ausgangs- und der Sollspannung.

      Ob die Regelung wirklich funktioniert mag ich an der Stelle doch sehr bezweifeln.
      (Zum Glück bin ich kein Lehrer rolling: )
      Kaum macht man es richtig - und schon geht's!
    • YdnAm wrote:

      und das Projekt ist vom Lehrer abgenommen worden
      a_14_3ef964b0

      Mitch64 wrote:

      Der Lehrer kiegt ne 5.
      Er schreibt nun nicht ob und wie es benotet wurde. Zum Bestehen (>50%) ist es allemal gut da waren bestimmt schlechtere dabei.
      Allerdings wenns belastet wird "explodiert" es (if c >1001... )bei 1000 machts schon einen Dauerkurzschluß)

      Mitch64 wrote:

      Ob die Regelung wirklich funktioniert mag ich an der Stelle doch sehr bezweifeln
      Tut sie - versuchs (Simmulator)
    • Hm, wenn Usoll>Uist ist, wird Pwm1a größer, das passt doch, breiterer Puls ergibt höhere Uist. Andererseits wäre doch der A-Kanal nicht der top-Wert und man müsste mit dem B-Kanal die Pulsbreite regeln?. Funktioniert das jetzt nur wegen dem falschen konfigurieren des timers?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • YdnAm wrote:

      Source Code

      1. $regfile="m8def.dat"
      2. $crystal=16000000
      3. Config Lcd=20x4
      4. Config Lcdpin=Pin,Db4=PORTB.2,Db5=PortB.0,Db6=PORTD.7,Db7=PORTD.6,E=PORTD.4,Rs=PORTC.0
      5. Cursor off
      6. cls
      7. Const Fosc=16000000
      8. Const Fpwm=16000
      9. Const Prescale=1
      10. Config Adc=Single,Prescaler=Auto,Reference=Avcc
      11. Start Adc
      12. Dim Usoll_ as Word
      13. Dim Uist as Single
      14. Dim Uist_ as Word
      15. Dim Usoll as Single
      16. Dim Schritte as Word
      17. Dim Pwmwert as Word
      18. Dim Hilfsin as Single
      19. Dim C as Single 'Schrittweite single
      20. Dim Pwmfaktor as Single 'Pwmfaktor ;Regeldifferenz*Faktor
      21. Dim Pwm as Word
      22. Dim Regeldifferenz as Single
      23. Dim Adcwert as Word
      24. Dim Tastgrad as Single
      25. Dim Uin as Single
      26. Dim Uin_ as Word
      27. Pwmwert=200
      28. Pwm1a=Pwmwert
      29. Tccr1a=&B10000010
      30. Tccr1b=&B00011001
      31. Hilfsin=Fosc/Fpwm
      32. Hilfsin=Hilfsin/Prescale
      33. Hilfsin=Round(hilfsin)
      34. Schritte=Hilfsin '=1000
      35. Capture1=Schritte
      36. Config PortB.1=Output
      37. Config Pind.5=Input
      38. Regeldifferenz=0
      39. Do 'Beginn der Schleife
      40. Uist_=Getadc(5)
      41. Usoll_=Getadc(3) 'Spannung vom Poti P1 0V=Adcwert=O,5V=Adcwert=1023
      42. Uin_=Getadc(1)
      43. 'digit=5/1023 Volt=0,00489V
      44. Usoll=Usoll_ 'von word auf single bringen
      45. Usoll=Usoll*0.038798185941 'die am pin anliegende Spannung ausrechnen
      46. Uist=Uist_
      47. Uist=Uist*0.038798185941
      48. Uin=Uin_
      49. Uin=Uin*0.0157728706624
      50. Regeldifferenz= Usoll-Uist
      51. Pwmfaktor=Regeldifferenz*5
      52. If Regeldifferenz <=0 then 'Spannung geht runter
      53. C=C+Pwmfaktor
      54. End if
      55. If Regeldifferenz >=0 then
      56. C=C+Pwmfaktor
      57. End if
      58. C=round(C)
      59. If C>1001 then
      60. C=1000
      61. End if
      62. If C<0 then
      63. C=1
      64. End if
      65. Adcwert=Getadc(5)
      66. Pwm=C
      67. Pwm1a=Pwm
      68. Tastgrad=Pwm/10
      69. Locate 1,1:Lcd "Uin:"
      70. Locate 1,8:Lcd fusing (Uin,"#.#");"V";" "
      71. Locate 2,1:Lcd "Usoll: "
      72. Locate 2,8:Lcd fusing (Usoll,"#.#");"V";" " 'Anzeige der Spannung auf dem Display
      73. Locate 3,1:Lcd "Uist: "
      74. Locate 3,8:Lcd fusing (Uist,"#.#");"V";" "
      75. Locate 4,1:Lcd "Pwm: "
      76. Locate 4,8:Lcd fusing (Tastgrad,"#.#");" %";" " 'Schreibt Leerzeichen über die überflüssigen Zeichen.
      77. 'Locate 4,1:Lcd "ADC: ";Adcwert
      78. Waitms 100
      79. Loop 'Schleife, die Spannung wird neu berechnet.
      80. End
      Display All
      dies ist das programm das funktioniert, und das Projekt ist vom Lehrer abgenommen worden.
      wie kann ich aus dem programm ein flussdiagramm machen?