phasenstarre Pulse

    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!

    • phasenstarre Pulse

      Hallo Experten,
      Für eine Anwendung will ich 2 Phasenstarre +eine symmetrische Frequenz generieren. Frequenz ca 10khz, die beiden Pulse je 10us zeitlich 10us versetzt.
      Kann das mit einem Atiny13 in Bascom funktionieren?
      Meine bisherigen Versuche lieferten ein ungenügendes Ergebnis, da die Signale zueinander ein zeitliches Jitter behalten.
      Mit Taktgenerator und Logikbausteinen würde es natürlich auch funktionieren, aber bleibt dann sehr unflexibel.
      Muss man sowas in Assembler schreiben?

      Gruß,
      Manfred
    • Hy,
      sorry war nicht gut erklärt,also die symmetrische Frequenz soll im Bereich 3-20khz liegen.
      Die beiden zeitversetzten Impulse von 10us erscheinen mit einer Frequenz im Bereich 0.1-1kHz.
      Aus der symmetrischen Frequenz soll nur eine Spannungsverdoppelung gemacht werden für den Betrieb von 2OP somit ist dafür
      die Phasenlage uninteressant. Lediglich die beiden kurzen Pulse sollen in den Zeiten konstant bleiben also keinen Jitter
      erzeugen.Mit 2Präzisionsmonoflops (HEF 4538 )geht das auch ganz gut, nur wird das etwas größer.
      Vieleicht müsste man mit den beiden Compare-Registern des Timers arbeiten, hat da jemand eine Idee?
      Gruß,
      Manfred
    • Das mit dem Timer geht leider nicht. Er kann jedoch den Verdoppler Takt erzeugen:
      Config Timer0 = PWM ,COMPARE_B=toggle , Prescale = 1
      Das sollte ca 17kHz an Pin6 (B1) erzeugen (bei 9,6MHz Takt)

      Miso schrieb:

      mit einer Frequenz im Bereich 0.1-1kHz.
      Ist die frei verwendbar oder muß die geändert werden können ?
      Der Punkt ist die zu erzeugen geht taktgenau wenn er nicht auf Anfragen / Eingaben reagieren muß, das wäre dann schwierig (un?) möglich

      PS eine Steckbrücke zur Verdopplerschaltung vorsehen . Ich erzeuge hier eine negative Spannung mit dem Mosi Pin, das bekommt mein MKII nicht gestemmt. B1 ist Miso da vermute ich Probleme wenn er geflasht werden soll.

      PPS Sollen die beide Pulse an dem selben Pin ausgegeben werden? Der Timer akzeptiert Veränderungen erst beim nächsten Durchlauf, das wäre recht stressig ihm bei jedem Durchlauf die nächsten ein zu geben. scheint aber möglich. Die synchrone darf ja Jitter haben.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Pluto25 ()

    • Hy,
      Vielen Dank, ich probier das mal mit dem PWM-Register ,die beiden 10us-Impulse brauche ich an getrennten Outp. müssen aber
      in Breite und zeitlichen Abstand konstant sein. die Wiederholfrequenz ist irgendwo zwischen 100....500 Hz ok.
      Außer diesen 3 Outp. braucht der MC nix tun, es sei denn eine Analogabfrage würde den Zeitablauf nicht stören..
      Gruß,
      Manfred
    • Hallo Manfred,
      ich würde es tatsächlich so simpel machen:

      BASCOM-Quellcode

      1. $regfile = "attiny13a.dat"
      2. $crystal = 9600000
      3. $hwstack = 10
      4. $swstack = 10
      5. $framesize = 10
      6. Config Portb.0 = Output
      7. Config Portb.1 = Output
      8. Config Portb.2 = Output
      9. Config Timer0 = Timer , Compare_a = Toggle , Prescale = 1 , Clear_timer = 1
      10. Compare0a = 255
      11. Do
      12. Set Portb.1
      13. Waitus 10
      14. ' Reset Portb.1
      15. ' !NOP
      16. ' waitus 1
      17. ' Set Portb.2
      18. Portb = &B00100
      19. Waitus 10
      20. Reset Portb.2
      21. Waitus 2000
      22. Loop
      23. End
      Alles anzeigen
      Auf diese Weise wird eine symmetrische Rechteck mit ca. 18KHz erzeugt. Durch Verkleinern des COMPARE0A Wertes kannst du auch größere Frequenzen erzeugen. Durch Vergrößern des Prescale und Anpassen des Compare0A kannst du ziemlich frei kleinere Frequenzen erzeugen.
      Durch Vergrößern des Waitus 2000 kannst du auch kleinere Frequenzen als 500Hz erzeugen.
      Im Moment schalten die beiden 10µs Signale im gleichen Moment um. Wenn du das etwas trennen willst, kommentierst du einfach die Zeilen ein und PortB=... aus.
      Die 10µs werden nicht exakt eingehalten, da der Tiny13 ja noch nicht mal einen Quarz hat, also Genauigkeit des internen RC Osc.
      Die Rechteck Frequenz ist nicht phasenstarr zu den beiden 10µs Signalen.
    • Miso schrieb:

      es sei denn eine Analogabfrage würde den Zeitablauf nicht stören..
      Würde die ganz erheblich (xy=Getadc(z)). Es gibt die Möglichkeit ihn frei laufen zu lassen.
      Config Adc = Free , Prescaler = 64 , Reference = Avcc
      Admux = 2 (gewünschter Kanal 0-3)
      Damit enthält die Bascom Variable Adcd den Wert. Der wird alle ca 10µs aktualisiert.
      Die weitere Auswertung muß jedoch Taktgenau ausgeführt werden damit kein Jitter in der langen Pause entsteht. Wie präzise müssen die 10µS sein? Fanz Lösung macht 10,3 µS. Der interne RC ist recht stabil, er schwankt mit der Betriebsspannung (Batteriebetrieb?) und ein wenig mit der Temperatur
    • Hy,
      Mit Verwendung des Timer-Interrupt geht auch noch eine Analogabfrage.
      Danke für eure Hilfe, hier ist mal der Code:

      ....
      Config Portb.0 = Output 'Coil-Pulse Out
      Config Portb.1 = Output 'Clock
      Config Portb.2 = Input 'ADC1-In
      Config Portb.3 = Output 'Sample-Puls Out
      Config Portb.4 = Output 'Piezo
      Coilpuls Alias Portb.0
      Clock Alias Portb.1
      Samplepuls Alias Portb.3
      Piezo Alias Portb.4


      Config Adc = Single , Prescaler = Auto
      Config Timer0 = Timer , Compare_b = Toggle , Prescale = 1 'Clock-Gen.
      On Timer0 Ontimer0 'ISR-Timer0
      Enable Timer0 'start Timer
      Enable Interrupts
      Coilpuls = 0 'Power-FET "OFF"
      Wait 2
      '************************** Main *******************************************
      Do
      Temp = Getadc(1)
      If Temp > 630 Then
      Piezo = 1
      Else
      Piezo = 0
      End If
      Loop
      ' ************************* ISR Timer0 *************************************
      Ontimer0:
      If T = 100 Then
      T = 0
      Coilpuls = 1
      Waitus Co
      Coilpuls = 0
      Waitus Ws
      Samplepuls = 1
      Waitus Sp
      Samplepuls = 0
      End If
      Incr T
      Return


      '****************************************************************************
      End
    • Miso schrieb:

      die Wiederholfrequenz ist irgendwo zwischen 100....500 Hz
      Die liegt aber so auch bei 37kHz. Der Jitter in der Wiederholung ist Dir nicht zu groß?
      Co,Ws und Sp sind 10? Sollen die unterschiedlich sein?
      Das sollte keinen Jitter haben (nicht real getestet)

      Quellcode

      1. $regfile = "attiny13a.dat"
      2. $crystal = 9600000
      3. $hwstack = 16
      4. $swstack = 16
      5. $framesize = 16
      6. Ddrb = $1b
      7. Piezo Alias Portb.4
      8. Config Timer0 = Timer , Compare_b = Toggle , Prescale = 1 , Clear_timer = 1
      9. Config Adc = Free , Prescaler = 64 , Reference = Avcc
      10. Admux = 1 'Pin 7 (B2)
      11. 'Incr Osccal verringert die Zeit um ca 4 Promille
      12. Dim Aw As Word
      13. Dim Z As Byte
      14. Do
      15. Set Portb.1
      16. Gosub Wus10
      17. Reset Portb.0
      18. Gosub Wus10
      19. Set Portb.2
      20. Gosub Wus10
      21. Reset Portb.3
      22. Aw = Adcd 'Aw=Getadc(2)
      23. If Aw >= 630 Then
      24. Set Piezo
      25. Else
      26. Reset Piezo
      27. nop
      28. End If
      29. Waitus 1967 '500Hz '
      30. Loop
      31. End
      32. Wus10:
      33. Z = 7
      34. Do
      35. Decr Z
      36. Loop Until Z = 0
      37. Incr Z
      38. nop 'ca 1% Zeit
      39. nop
      40. Return
      Alles anzeigen
      Jedoch fix 10µs

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Hy,
      Der Timerüberlauf wird doch in der Timer-ISR 100 mal ausgeführt befor die Impulskette erzeugt wird, funktioniert so jedenfalls.
      die Pulszeiten sind verschieden (60us,10µs, 8µs), das in einer Sub zu machen ist auch möglich, ich werde das mal probieren.
      den passenden Wert könnte die Variable Z mitbringen.
      Die symmetrische Frequenz ist unkritisch (10kHz....20kHz) kommt am Ausgang OC0B , Pin6,PB1 an.
      Der Jitter sollte <100ns werden.
      Gruß,
      Manfred
    • Miso schrieb:

      Der Jitter sollte <100ns werden.
      Ein Takt braucht 104,2ns. Da muß das ganze Taktgenau ablaufen. Ein Isr Aufruf hat ein Jitter von 3 Takten.
      Das Jitter auch in der Folge oder "nur" in den 60,10,8 ?
      Das Z alleine hat eine Auflösung von ca 1,3 µS. Um z.B. auf 8µs zu kommen reicht nicht z=5 alleine.
      Die waitus Methode hätte ca 230ns Überlänge. Wenns ganz genau sein muß gehts nur ohne Sub je einzeln abgeglichen.
    • Hy,
      Hab ich auch soweit gemessen,vielen Dank für die Hilfe, Eine Ungenauigkeit ist kein Problem solange sie konstant ist, die
      Absolutwerte sind erst mal zweitrangig.
      Meine letzte Version hat jetzt keine Sub und auch keine ADC-Abfrage, alles mal ohne Sprung und Verzweigung sieht
      recht gut aus.Ein Problem taucht hin und wieder auf, wenn die 5V -Versorgung langsam ansteigt, 0...5V, dann gibt es Situtionen
      bei dem sich der µC in einem total falschen Takt einrastet und damit über den Leistungs-FET (Treiber), eine sehr hohe Stromaufnahme produziert.
      Ein manueller Reset (Pin1) beseitigt das Problem sofort. Gibt es einen software-reset den man vor der Programmausführung
      ausführen kann ? die einfache R-C-Beschaltung ist nicht immer sicher.
      Ich habe auch noch den Typ Attiny 25 in der Schublade, der könnte mit einem Quartz beschaltet werden, und auch mit höherer Taktfrequenz arbeiten, würde den Jitter auch noch verkleinern.
      probiere ich auch noch mal...

      viele Grüße,
      Manfred
    • Miso schrieb:





      wenn die 5V -Versorgung langsam ansteigt,
      Gibt es einen software-reset den man vor der Programmausführung
      ausführen kann ?
      Dann muß die aber sehr langsam ansteigen? Bisher habe ich das nur theoretisch gehört.
      Ein Broun-out würde einen Reset machen wenn die Spannung unter 1,8/2,7/4,3Volt ist. (Einstellbar bei den Fuse Bytes (Bodlevel) Das geht auch andersrum. Er bleibt solange auf Reset bis die Spannung überschritten wird. Ich hab hier einen tiny13 an einem Solarmodul (das ist Laaangsam). Der startet bei 2,7 Volt damit das Lcd ein sauberes Init mitbekommt, vorher lief er bei ca 1,3V los. a_38_b45e201d
    • Grins,
      ich betreibe den Steckbrettaufbau an einem geregelten Netzteil, das ich langsam manuell hochregele, damit nicht evtl der durchgesteuerte FET einen Kurzschluss verursacht, wird natürlich auch von der Stromregelung überwacht, es sind aber auch noch dicke Speicherkapazitäten aufzuladen, und das verursacht schon Verzögerungen.
      Danke für den Tipp,
      Gruß,
      Manfred