50 Hz Sinusgenerator

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

    • 50 Hz Sinusgenerator

      Hallo zusammen,

      ich bin auf der Suche nach einem programmierbaren 50 Hz Sinus Generator, der folgende Punkte erfüllt

      • Frequenz 50 Hz regelbar +/- 10 Hz
      • Ausgangsspannung regelbar 0 bis 5V Offset 2,5V
      • Betriebsspannung 5V
      • Steuerung über I2C, Seriell, SPI oder …

      Im besten Fall in SMD aber auch fertig Module.

      Ich hab es schon mit einem Xmega (DAC, PWM und Tabelle) probiert, aber bei jedem lese und schreib Vorgang wird der Sinus „verzerrt“. Das darf nicht passieren.
      Danke schon mal
      Gruß Sven
    • Der XR2206 oder ähnliche zum Beispiel. Die laufen aber zu ungenau.
      Das Programm muss ich suchen. Nur soviel den DAC im XM128A1 hab ich nach Tabelle gefahren, da kommt auch was halbwegsgescheites raus, solange ihn niemand stört. :)

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

    • Damit niemand stört, muss er halt Priorität haben. Ich bin mit meinen xmega Kenntnissen noch nicht sehr weit, könnte mir aber vorstellen, dass man den Wert aus Tabelle holen und an den DAC übergeben per interrupt machen kann.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ich hatte es mit dem Timer interrupt gelöst. Lief auch recht gut, aber die Priorität hab ich auch nicht so richtig verstanden. Dazu müsste die serielle oder I2C komplett in Software erschlagen werden, oder eben die Priorität so gesetzt werden, das da wirklich keine us verschwendet wird.
      Das ganze ist mir aber zu unsicher. Ich denk ich werde den Teil analog (LC+OPV) aufbauen müssen.
    • Genau daran hab ich gedacht. Jetzt noch ein OPV dahinter für dieSpannungsregelung, und beide mit einem XM128.. 2xDAC geregelt. Die DAC laufen ja frei, womit das Timing keine Rolle mehr spielt, und mit dem ADC noch überwachen bzw. nachregeln.
      Super Danke Dir schon mal .. wenn es läuft stell ich auch was zum Nachlesen ein.
    • Wenn du den Sinus Interrupt-Gesteuert ausgibst kommt da am DAC ein brauchbarer Sinus raus. Soweit verstehe ich das.
      Wenn du dann während der aktiven Sinusausgabe Daten per SPI, I2C, UART schickst, werden zusätzliche Interrupts verwendet.

      Ohne weitere Zutun ist aber immer nur ein ISR-Handler aktiv. Also wenn du z.B. per ISP daten schickst, wird ein Interrupt ausgelöst.
      Diese Interrupt-Routine benötigt eine gewisse Zeit. Tritt nun der Fall auf, dass am DAC der Sinus-Wert aktualisiert werden muss, gibt es entsprechend eine Verzögerung.
      Es wird also der ISR-Interrupt zuerst fertig abgearbeitet und dann der DAC aktualisiert.

      Es gibt aus meiner Sicht 2 Möglichkeiten.

      1. Die ISR-Routinen zu modifizieren, dass während der ISR läuft, weitere Interrupts zulässig sind. Bei Arduino wird das gemacht. Das ist aber der kompliziertere Weg. Dabei muss man auch beachten, dass nur ein höher priorisierter den laufenden dann unterbrechen könnte. Die Reihenfolge der Intterrupts in der Priorität ist die Reihenfolge der Interrupts, wie sie im Datenblatt aufgeführt sind (Vectortabelle). Reset hat die höchste prio und ist Vector 0.

      2. Die andere Möglichkeit ist, Im AVR für die Kommunikation erst gar keinen Interrupt auszulösen.

      Nimm mal an, du willst den Hardware-UART für den Empfang nehmen, dann darfst du weder Empfangsbuffer verwenden (dafür wird RxD-Interrupt verwendet), noch bei Empfang ein Interrupt auslösen.
      Du fragst lediglich das Flag vom UART ab, ob ein Zeichen empfangen wurde und holst es selber aus dem Buffer Register UDR). Das Fläg heißt beim Mega 8 z.B. RxC und liegt im Register UCSRA.

      Gleiches gilt dir ISP (Siehe Register SPSR) und I2C (siehe Register TWSR). Auch da gibt es Flags, die ein Empfang eines Bytes anzeigen.

      Genaueres steht hierzu im Datenblatt.
      Kaum macht man es richtig - und schon geht's!
    • Mitch64 schrieb:

      2 Möglichkeiten.
      Ich möchte noch eine 3. loswerden: Synchronisation des Programms auf den wichtigen Interrupt, also den Sinus.
      Der Sinus wird per Interrupt erzeugt und dort wird noch ein Flag gesetzt, auf welches das Hauptprogramm mit Bitwait wartet.
      Das Hauptprogramm darf dann nicht länger als bis zum nächsten Interrupt dauern. Ansonsten muss man die Aufgaben eben nacheinander ausführen.

      Mitch64 schrieb:

      Das Fläg heißt beim Mega 8 z.B. RxC und liegt im Register UCSRA.
      Oder Ischarwaiting: avrhelp.mcselec.com/index.html?ischarwaiting.htm
    • at Dekaman

      Quellcode

      1. $regfile = "xm128a1def.dat"
      2. $crystal = 32000000
      3. $timeout = 1000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. $xramsize = &H800000
      8. $lib "xmega.lib"
      9. $external _xmegafix_clear
      10. $external _xmegafix_rol_r1014
      11. $baud = 115200
      12. Config Osc = Enabled , 32mhzosc = Enabled '32MHz
      13. Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
      14. Config Priority = Static , Vector = Application , Lo = Enabled
      15. Config Com5 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Portf.2 and Portf.3 is COM7
      16. Open "COM5:" For Binary As #1
      17. Config Portb.2 = Output
      18. Config Daca = Enabled , Io0 = Enabled , Channel = Single , Reference = Avcc , Interval = 64 , Refresh = 64
      19. Declare Sub Main
      20. Dim Sin_256(256)as Byte
      21. Dim Key As Byte
      22. Dim N As Byte
      23. Dim M As Byte
      24. Restore Sinusdata256
      25. 'nur für den ersten start Sinusdaten ins EEPROM ablegen
      26. For N = 0 To 255
      27. Read M
      28. Writeeeprom M , N
      29. Print#1 , M
      30. Next
      31. 'Daten aus dem EEPROM in ein ARRAY ablegen
      32. For N = 1 To 255
      33. Readeeprom Sin_256(n) , N
      34. Next
      35. 'Timer config
      36. Config Tce0 = Normal , Prescale = 8 , Resolution = Normal
      37. Tce0_per = 314 'hab ich nicht verstanden
      38. On Tce0_ovf Tc0_isr
      39. Enable Tce0_ovf , Lo
      40. Enable Interrupts
      41. '-------------------------------------------------------------------------------
      42. Sub Main
      43. Do
      44. Key = Inkey(#1)
      45. If Key = 123 Then Goto &H10000 'bl
      46. If Key = Chr(27) Then Goto &H10000 'reset
      47. If Key = "+" Then Incr N ' sync +
      48. If Key = "-" Then Decr N ' sync -
      49. Loop
      50. End Sub
      51. End
      52. '-------------------------------------------------------------------------------
      53. Tc0_isr:
      54. Incr N
      55. Daca0 = Sin_256(n) * 16 '*16 Spannung anpassen
      56. Return
      57. '-------------------------------------------------------------------------------
      58. 'nur für den ersten start
      59. Sinusdata256:
      60. Data 0 , 0 , 0 , 0 , 0 , 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9,
      61. Data 10 , 11 , 13 , 14 , 16 , 17 , 19 , 20 , 22 , 24 , 26 , 28 , 30 , 32 , 34 , 36,
      62. Data 38 , 41 , 43 , 45 , 48 , 50 , 53 , 55 , 58 , 61 , 63 , 66 , 69 , 72 , 74 , 77,
      63. Data 80 , 83 , 86 , 89 , 92 , 95 , 98 , 101 , 104 , 107 , 110 , 114 , 117 , 120 , 123 , 126,
      64. Data 127 , 130 , 133 , 136 , 139 , 142 , 145 , 148 , 151 , 154 , 157 , 160 , 163 , 166 , 169 , 172,
      65. Data 175 , 178 , 181 , 184 , 187 , 189 , 192 , 195 , 197 , 200 , 202 , 205 , 207 , 210 , 212 , 214,
      66. Data 217 , 219 , 221 , 223 , 225 , 227 , 229 , 231 , 232 , 234 , 236 , 237 , 239 , 240 , 242 , 243,
      67. Data 244 , 245 , 246 , 247 , 248 , 249 , 250 , 251 , 251 , 252 , 252 , 253 , 253 , 253 , 253 , 253,
      68. Data 253 , 253 , 253 , 253 , 253 , 252 , 252 , 251 , 251 , 250 , 250 , 249 , 248 , 247 , 246 , 245,
      69. Data 244 , 242 , 241 , 240 , 238 , 237 , 235 , 233 , 232 , 230 , 228 , 226 , 224 , 222 , 220 , 218,
      70. Data 216 , 213 , 211 , 209 , 206 , 204 , 201 , 199 , 196 , 193 , 191 , 188 , 185 , 183 , 180 , 177,
      71. Data 174 , 171 , 168 , 165 , 162 , 159 , 156 , 153 , 150 , 147 , 144 , 141 , 138 , 135 , 131 , 128,
      72. Data 125 , 122 , 119 , 116 , 113 , 110 , 106 , 103 , 100 , 97 , 94 , 91 , 88 , 85 , 82 , 79,
      73. Data 76 , 74 , 71 , 68 , 65 , 63 , 60 , 57 , 55 , 52 , 50 , 47 , 45 , 42 , 40 , 38,
      74. Data 36 , 33 , 31 , 29 , 27 , 25 , 23 , 22 , 20 , 18 , 17 , 15 , 14 , 12 , 11 , 10,
      75. Data 8 , 7 , 6 , 5 , 4 , 4 , 3 , 2 , 2 , 1 , 1 , 0 , 0 , 0 , 0 , 0,
      Alles anzeigen

      50Hz.JPG