ACI Interrupt verhält sich willkürlich (BLDC BEMF mit Komparator)

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

    • Mitch64 wrote:

      in der der Analog-Comparator-Interrupt zugelassen wird
      Also nach Zeile 106, so etwa?
      "
      Start_aci:
      set ACSR.ACI (oder doch reset?)
      Enable Aci
      Return

      Mitch64 wrote:

      Mir ist übrigens noch aufgefallen, dass die unbestromte Spule, die als Sensor dienen soll auf +12V liegt (Vmot).
      Ja, der "Nulldurchgang ist ja eigentlich ein +12V-Durchgang

      Mitch64 wrote:

      Wenn aber der Vergleichspin (Analog-Comparator) mit dem Spannungsteiler auf 1,8V liegt. Wie soll da ein Interrupt ausgelöst werden?
      Vergleichs-Pin, BEMF-Abgriff Spule1 und BEMF-Abgriff Spule2 werden alle über drei gleiche Spannungsteiler (alle mit 10K-1K) auf den Komparator gegeben. Das ist also so, als wie wenn +12V der Vergleichspin ist und der BEMF-Abgriff (Drain) der andere Komparatoreingang ist.... nur eben für den Tiny alle im gleichen Maß heruntergeteilt.
    • Mitch64 wrote:

      Man muss eine 1 reinschreiben um das Bit zu löschen!
      das werd' ich nie verstehen 8| , aber du hast Recht ACI is cleared by writing a logic one to the flag.
      also

      Start_aci:
      Acsr.aci = 1 'eventuell aufgelaufenen Interruptauslöser zurück setzen
      Enable Aci 'Komparatorinterrupt einschalten
      Return
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • oscar wrote:

      Richtig! Mit einem RC-Differenzierglied auskoppeln und ev. parallel zum Widerstand (zum Schutz des Tiny) eine Z-Diode schalten.
      Ist auf jeden Fall die bessere Lösung.
      na wenn ich das was weg lasse, den Gleichspannungsanteil, wie will ich das dann im Komparator ordentlich vergleichen? Da nützen dann die Gleichheit der Spannungsteiler nix mehr, wobei ich jetzt auch nicht weiß, wieviel in dem muxer-Schaltkreis an Spannung abfällt.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch wrote:

      Start_aci:
      Acsr.aci = 1 'eventuell aufgelaufenen Interruptauslöser zurück setzen
      Enable Aci 'Komparatorinterrupt einschalten
      Return
      Also da ist was faul.
      in der alten Version, ohne "Acsr.aci = 1" gibt es zumindest das "Anfangszuckeln",
      mit "Acsr.aci = 1" rührt sich gar nichts mehr.

      Versteh ich nicht. Erst danach wird doch der ACI erst enablet
    • Bastlbeda wrote:

      Also da ist was faul.
      ich denke, es wird einfach kein aci-int ausgelöst, weill die Spannung am mux zu hoch ist. Bei den letzten Graphen waren es doch um die 20V, wenn ich das mit Vmot vergleiche, das wird nie =Vmot.
      Bevor diese Korrektur gemacht wurde, wurde der int halt einmal ausgeführt, evtl beim Umschalten vom mux, da gab's halt einen Zuckler mehr, aber halt auch zur falschen Zeit.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Bastlbeda wrote:

      Also da ist was faul.
      in der alten Version, ohne "Acsr.aci = 1" gibt es zumindest das "Anfangszuckeln",
      mit "Acsr.aci = 1" rührt sich gar nichts mehr.

      Versteh ich nicht. Erst danach wird doch der ACI erst enablet
      Es gibt 2 Flags. Das eine, dass der Interrupt getriggert hat (ACI) und das mit Enable ist ein anderes Flag, das den Sprung in die ISR zulässt. Das heißt ACIE.
      Schau im Tiny-Datenblatt unter Comparator!
    • Hallo Bastlbeda, ich habe nun eine funktionierende Rohfassung für meinen Kleinen. Sie wird Dir nicht gefallen, aber möglicherweise kannst Du was brauchbares rausfischen:

      Source Code

      1. $regfile = "m8def.dat"
      2. $crystal = 8000000
      3. $hwstack = $80
      4. $swstack = $80
      5. $framesize = $100
      6. $eepleave
      7. '$baud = 9600
      8. Config Base = 0
      9. '$sim
      10. 'b0=Db4 b1= b2=Bled b3=Mosi b4=Mi/Db5 b5=Sk/Rs b6=Fet1 b7=Fet2
      11. 'c0= c1=Shunt c2 = c3=Poti c4 = Sda c5 = Slc c6=/Res c7 = Nu
      12. 'd0=Rx d1=Tx d2=dir d3=nc d4=nc d5=Db7 d6=E d7=Db6
      13. Ddrb = &B00110111
      14. Ddrc = $c0
      15. Portc = $c0
      16. Ddrd = $ff
      17. Config Timer1 = Timer , Prescale = 64
      18. On Oc1a Isrtog
      19. On Oc1b Isr2
      20. Timsk = $18
      21. Enable Oc1a
      22. Enable Oc1b
      23. Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.4 , Db6 = Portd.7 , Db7 = Portd.5 , E = Portd.6 , Rs = Portb.5
      24. Config Lcd = 16 * 2 'Db7 von b1 auf D5 umlöten
      25. Lcd_backlight Alias Portb.2 : Set Lcd_backlight
      26. Initlcd
      27. Cursor Off
      28. Cls
      29. Config Adc = Free , Prescaler = Auto , Reference = Internal
      30. Admux = $c1
      31. Dim Temp As Byte , Tempw As Word , Tempstr As String * 6
      32. Dim A As Byte
      33. Dim Vstart As Byte , Temp1 As Byte , Temp2 As Byte , Temp3 As Byte
      34. Dim Startstr As String * 1
      35. Dim T0 As Word , Ti1 As Word , Ti2 As Word , Ti3 As Word , Thw As Word
      36. Dim Ustart As Word , Ttemp As Word , Itempw As Word
      37. Dim T2 As Byte , T4 As Byte
      38. Dim I0s As Byte , I0l As Byte , I1 As Byte , I2 As Byte , I3 As Byte , Dum As Byte
      39. Dim Iist As Byte , I2a As Byte , Pol As Byte , Tneu As Byte
      40. Readeeprom Tempw , 0 'Start/Brennzähler
      41. Incr Tempw 'Flashzerstörungsschutz
      42. Writeeeprom Tempw , 0
      43. Ddrb = $ff
      44. Set Portb.7
      45. Vstart = 1
      46. Startstr = "s"
      47. Lcd "I :"
      48. Lowerline
      49. Lcd "T :"
      50. Waitms 400
      51. I0s = Adcl
      52. Dum = Adch
      53. I0l = I0s ' + 5
      54. Ustart = 7000
      55. Thw = Ustart
      56. Locate 1 , 15 '149
      57. Lcd I0s
      58. Ocr1a = Thw
      59. Ttemp = Thw
      60. Shift Ttemp , Right
      61. Ocr1b = Ttemp
      62. Shift Ttemp , Right , 2 ' 3
      63. Ti3 = Thw - Ttemp
      64. Enable Interrupts
      65. Do
      66. If T4 = 1 Then
      67. If Vstart = 1 Then '40
      68. Tempw = Thw / 32 '251
      69. Tempw = Thw - Tempw '20
      70. Thw = Tempw
      71. Temp = I2 + 30
      72. If I3 > Temp And I2 < I1 Then
      73. 'If I2 < I1 Then
      74. Vstart = 0
      75. Startstr = " "
      76. End If
      77. If Thw < 1100 Then Thw = Ustart
      78. Ttemp = Thw
      79. Shift Ttemp , Right
      80. Ocr1b = Ttemp
      81. Shift Ttemp , Right , 2
      82. Ti3 = Thw - Ttemp
      83. Tneu = 1
      84. Else '#######################################
      85. Ttemp = Thw
      86. Shift Ttemp , Right
      87. Ocr1b = Ttemp
      88. Shift Ttemp , Right , 3
      89. Ti3 = Thw - Ttemp
      90. Tneu = 1
      91. If Thw < 900 Then Thw = 900 'max speed
      92. If I1 < I2 Then
      93. Decr Thw
      94. Else
      95. If T0 > Ustart Or I3 = I2 Then
      96. Vstart = 1
      97. Thw = Ustart
      98. Ttemp = Thw
      99. Set Portb.6
      100. Shift Ttemp , Right 'hw/2
      101. Ocr1b = Ttemp
      102. Shift Ttemp , Right , 3 'hw/16
      103. Ti3 = Thw - Ttemp
      104. Startstr = "s"
      105. End If
      106. End If
      107. I2a = I2
      108. End If
      109. T4 = 0
      110. End If
      111. If Timer1 > Ocr1a Then Gosub Isrtog '???????????????
      112. 'If Tneu = 1 Then
      113. Locate 2 , 4
      114. Lcd Thw
      115. Lcd " "
      116. Lcd T0
      117. Lcd " "
      118. Locate 1 , 4 '151
      119. Lcd I1 '3282
      120. Lcd Startstr '178
      121. Lcd I2
      122. Lcd " " '174
      123. ' Reset Portb.7
      124. Lcd I3
      125. Lcd " " '174
      126. 'End If
      127. Locate 2 , 14
      128. Lcd I0l
      129. Lcd " "
      130. Waitms 100
      131. Loop
      132. End
      133. Isr2:
      134. I2 = Adcl
      135. Dum = Adch
      136. Itempw = Thw ' - 2
      137. T2 = 1
      138. Do
      139. Iist = Adcl
      140. Dum = Adch
      141. If Iist > I0l Then
      142. T0 = Timer1
      143. If I1 > I2 And Vstart = 0 Then
      144. Thw = T0
      145. End If
      146. Goto Weg 'Exit Do
      147. End If
      148. Loop
      149. Weg:
      150. Return
      151. Isrtog:
      152. I3 = Adcl
      153. Dum = Adch
      154. If Pol = 1 Then
      155. Pol = 0
      156. Reset Portb.7
      157. Set Portb.6
      158. Else
      159. Pol = 1
      160. Reset Portb.6
      161. Set Portb.7
      162. End If
      163. T4 = 1
      164. Timer1 = 0
      165. Ocr1a = Thw
      166. Do
      167. Loop Until Timer1 = 200
      168. I1 = Adcl
      169. Dum = Adch
      170. Return
      Display All
      Sein Verhalten und Strombedarf liegen nahe an dem Orginalzustand.
    • Pluto25 wrote:

      Sie wird Dir nicht gefallen
      Hallo Pluto25,

      was heißt "nicht gefallen"?
      wie angekündigt bin ich leider nicht mehr im Lande und kann jetzt bis Oktober nichts mehr probieren.
      Ich kann aber sehr wohl mal dein Programm versuchen zu verstehen a_27_b277ca12 , weil online bin ich ja.... und wenn ich es dann mal verstanden habe (ziemlich viel LCD drin für einen Motor) kann ich ja vielleicht doch etwas für mein Vorhaben herauszwicken.... Auf jeden Fall schon mal DANKE!