Przetwornik DAC do zasilacza

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 12 kwie 2021, 1:23

Witam
Nie chce zaśmiecać forum, więc dopytam tutaj, bo nie jestem pewien jak zrobić, a w nocie katalogowej nie ma tego.
DAC mam na oddzielnej pcb, a płytka zasilacza jest osobno. Połączę te dwie płytki krótkimi kabelkami ekranowanymi.

Pytanie - czy montowa te wzmacniacze operacyjne (ZAZNACZONE NA CZERWONO) na płYtce DAC, a czy bezpośrednio wyjścia DAC podłączyć do wejść na płytce zasilacza?
dac.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1217
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przetwornik DAC do zasilacza

Post autor: niveasoft » 12 kwie 2021, 1:29

W Op-Amp`ach masz nogi 2 i 6 połączone bezpośrednio ze sobą czyli ten wzmacniacz pracuje jako bufor - taki wzmacniacz mocy a nie napięcia.
Musisz wiedzieć ile do Twojego układu wpływa prądu i jeśli wydajność prądowa z noty tego DAC nie da rady to musisz dać jakiś bufor. Nie wiem czy dokładnie ten. Pewnie tani LM358 też by się nadał, ale może chodzi o niskoszumny...a na Allegro dwa OPA są za 10zł...
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 12 kwie 2021, 1:33

Bo one nie mają wzmacniać napięcia. Ma tyle samo być na wyjściu co na wejściu nieodwracającym -> Wzmocnienie = 1
Mam te opampy w domu.

Według noty katalogowej DAC, wyjścia jego mogą dać max 30mA.
Ostatnio zmieniony 12 kwie 2021, 1:45 przez Michał6201, łącznie zmieniany 1 raz.
Awatar użytkownika
niveasoft
Posty: 1217
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przetwornik DAC do zasilacza

Post autor: niveasoft » 12 kwie 2021, 1:36

Jak się tak temu przyglądam bliżej to Ty masz tam dalej wejścia Op-Amp na LM358 więc te pierwsze chyba są zbędne.
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 12 kwie 2021, 1:49

No właśnie też mi się tak wydaje, zostawiłbym tylko te rezystory i kondensatorki podciągnięte do AGND.

W samym zasilaczu jest OPAMP LM358 i w nim na wejściach steruje się napięciem wyjściowym zasilacza i ograniczenie prądowe.

Napięcie wyjściowe regulowane jest napięciem 0 - 5V, natomiast ograniczenie prądowe napięciem 0 - 150mA.
A na wyjściach DAC mam napięcie od 0V do 5V, przy zasilaniu DAC +5V i napięciu referencyjnym 2,5V.
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 18 kwie 2021, 22:03

Udało mi się dzisiaj uruchomić przetwornik DAC AD5667.

Mam układ bez literki R w oznaczeniu, więc nie posiada wewnętrznego napięcia odniesienia i trzeba podłączyć zewnętrzne. Podłączyłem zewnętrzne napięcie odniesienia 2,5V i na wyjściu przetwornika mam max 2,5V.
Przejrzałem kilka razy notę aplikacyjną tego przetwornika i nigdzie nie mogę doczytać, czy można dołączyć zewnętrzne napięcie odniesienia 5,0V?

Prosze Was o zerknięcie w tą notę:
https://www.analog.com/media/en/technic ... 7_5667.pdf

Wydaje mi się, że może być zewnętrzne napięcie odniesienia 5,0V. Ale boję się w ciemno podłączać, bo nie chciałbym uszkodzić tego scalaka.

Najwyżej dam na wyjściu DAC wzmacniacz operacyjni rail do rail ze wzmocnieniem = 2.
Awatar użytkownika
niveasoft
Posty: 1217
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przetwornik DAC do zasilacza

Post autor: niveasoft » 19 kwie 2021, 8:55

Pisze tam w kilku miejscach że VREF może mieć VDD +0.3V a w jednej tabelce pisze że podczas testu połączono VREF=VDD=5.5V Więc chyba śmiało ;)
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 19 kwie 2021, 21:33

Wczoraj w nocy tez tego się doszukałem :D
Dziś podłączyłem 5V do napięcia odniesienia i pięknie pokazuje w pełnej skali napięcie od 0 do 5V :)
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 24 kwie 2021, 14:44

Mam działający kod do obsługi enkodera od Bartka.

Dzisiaj postanowiłem ten kod rozszerzyć do obsługi 2 enkoderów. Jeden do ustawiania napięcia, a drugi do ustawiania prądu.
Jeden enkoder jest na przerwaniu INT0, a drugi na przerwaniu INT1

Osobno każdy z tych enkoderów działa poprawnie. Problem się pojawia, jak w kodzie mam obydwa enkodery.
Wtedy jest problem z miganiem i wyborem poszczególnych liter. Raz mignie i zniknie, potem znów mignie, albo wcale nie miga wybrana pozycja.
Może ja coś źle zrobiłem w tym kodzie?

Oto ten kod do obsługi dwóch enkoderów:
  1. $regfile = "m32def.dat"
  2. $crystal = 11059200
  3. $hwstack = 64
  4. $swstack = 16
  5. $framesize = 64
  6.  
  7. Const Timeout_time = 8 'x500ms
  8. Config Submode = New
  9.  
  10. ' config LCD 2X16
  11. Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
  12. Config Lcd = 16x2
  13. Cursor Off
  14. Cls
  15.  
  16. Deflcdchar 0,17,17,17,10,4,32,32,32' (volt)
  17. Deflcdchar 1,14,17,17,31,17,32,32,32' (amper)
  18.  
  19.  
  20. '---------------------------------------------------------------------------------------
  21. ' config for encoders
  22.  
  23. ' ENCODER U_SET
  24. Config PortD.5 = Input : PortD.5 = 1 : Encoder1_a Alias PinD.5      'ENKODER1A
  25. Config Portd.3 = Input : Portd.3 = 1 : Encoder1_b Alias Pind.3      'ENKODER1B, INT1
  26. Config PortD.7 = Input : PortD.7 = 1 : Enc_sw1 Alias PinD.7         ' Przycisk Enkoder1
  27.  
  28. ' ENCODER I_SET
  29. Config PortD.6 = Input : PortD.6 = 1 : Encoder2_a Alias PinD.6      'ENKODER2A
  30. Config Portd.2 = Input : Portd.2 = 1 : Encoder2_b Alias Pind.2      'ENKODER2B, INT0
  31. Config PortC.2 = Input : PortC.2 = 1 : Enc_sw2 Alias PinC.2         ' Przycisk Enkoder2
  32.  
  33. Config Int1 = Rising 'przerwanie  generować będzie rosnące zbocze
  34. Enable Int1 : On Int1 Encoder1_isr Nosave
  35.  
  36. Config Int0 = Rising 'przerwanie  generować będzie rosnące zbocze
  37. Enable Int0 : On Int0 Encoder2_isr Nosave
  38.  
  39. Dim Encoder1_turn_left As Byte , Encoder1_turn_right As Byte
  40. Dim Encoder2_turn_left As Byte , Encoder2_turn_right As Byte
  41.  
  42. '----------------------------------------------------------------------------------------
  43. ' config Timer2
  44. Config Timer2 = Timer , Prescale = 1024 , Clear_timer = 1
  45.  Compare2 = 107 '10ms @11MHz/1024
  46.  
  47. 'settings
  48. Dim 500ms As Byte , Mig As Byte , Timeout As Byte , Mig1 As Byte , Timeout1 As Byte
  49.  
  50. 'Zmienne dla encodera prądu
  51. Dim Prad As Single , Prad_ee As Eram Single
  52. Dim Pos2 As Byte , Pos2_ee As Eram Byte
  53. Dim Current_str As String * 10
  54. Dim Temp_str As String * 10
  55.  
  56. 'Zmienne dla encodera napięcia
  57. Dim Napiecie As Single , Napiecie_ee As Eram Single
  58. Dim Pos As Byte , Pos_ee As Eram Byte
  59. Dim Volt_str As String * 10
  60. Dim Temp_str1 As String * 10
  61.  
  62. Enable Interrupts
  63.  
  64. ' Procedura wyświetlania napięcia U_SET
  65. Sub Show_voltage
  66.  
  67. Temp_str1 = Fusing(napiecie , "#.&&&")
  68. Volt_str = Format(temp_str1 , "      ")                     'dwa znaki+kropka+trzy znaki
  69.  
  70. If Mig1 = 1 Then
  71. Select Case Pos
  72. Case 1
  73. Mid(volt_str , 1) = "  "                             'wstaw spację w miejscu pos (migaj)
  74. Case 2
  75. Mid(volt_str , 4) = " "
  76. Case 3
  77. Mid(volt_str , 5) = " "
  78. Case 4
  79. Mid(volt_str , 6) = " "
  80. End Select
  81. End If
  82. Locate 1 , 1 : Lcd Volt_str ; Chr(0) ' Wyświetlenie na LCD napięcia ustawionego U_SET
  83. End Sub
  84.  
  85.  
  86. ' Procedura wyświetlania prądu I_SET
  87. Sub Show_current
  88.  
  89.  Temp_str = Fusing(prad , "#.&&&")
  90.  Current_str = Format(temp_str , "      ")  'dwa znaki+kropka+trzy znaki
  91.  
  92. If Mig = 1 Then
  93. Select Case Pos2
  94. Case 1
  95. Mid(current_str , 1) = "  " 'wstaw spację w miejscu pos (migaj)
  96. Case 2
  97. Mid(current_str , 4) = " "
  98. Case 3
  99. Mid(current_str , 5) = " "
  100. Case 4
  101. Mid(current_str , 6) = " "
  102. End Select
  103. End If
  104. Locate 1 , 10 : Lcd Current_str ; Chr(1) ' Wyświetlenie na LCD ograniczenia prądowego I_SET
  105. End Sub
  106.  
  107. Sub Set_dac
  108.  'przelicz Single Prad i wyslij do DAC
  109. End Sub
  110.  
  111. ' eeprom reading U_SET
  112. '------------------------------
  113. Pos = Pos_ee
  114. If Pos > 4 Then
  115.  Pos = 4 : Pos_ee = Pos
  116.  Napiecie_ee = 0
  117. End If
  118.  Napiecie = Napiecie_ee
  119. '------------------------------
  120. Call Show_voltage()
  121.  
  122. ' eeprom reading I_SET
  123. '------------------------------
  124. Pos2 = Pos2_ee
  125. If Pos2 > 4 Then
  126.  Pos2 = 4 : Pos2_ee = Pos2
  127.  Prad_ee = 0
  128. End If
  129.  Prad = Prad_ee
  130. '------------------------------
  131. Call Show_current()
  132.  
  133. Call Set_dac()
  134.  
  135.  
  136.  
  137.  
  138. ' ########################## GŁÓWNA PĘTLA ###############################
  139. Do
  140.  
  141. '************************************************************** Obsługa encodera dla prądu
  142. Debounce Enc_sw2 , 0 , Enc_sw2_sub , Sub  ;'ENCODER I_SET
  143. '##### encoder turns left ######
  144. If 0 < Encoder2_turn_left Then
  145. Decr Encoder2_turn_left
  146. 'tutaj Twój kod -
  147. If Timeout > 0 Then
  148. Select Case Pos2
  149. Case 1
  150. Prad = Prad - 1.0
  151. Case 2
  152. Prad = Prad - 0.1
  153. Case 3
  154. Prad = Prad - 0.01
  155. Case 4
  156. Prad = Prad - 0.001
  157. End Select
  158.  
  159. If Prad < 0 Then Prad = 0
  160. Mig = 0 : Call Show_current
  161. End If
  162.  
  163. Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  164. Gifr.intf0 = 1
  165. Enable INT0
  166. End If
  167. ' #### encoder turns right ######
  168. If 0 < Encoder2_turn_right Then
  169. Decr Encoder2_turn_right
  170. 'tutaj Twój kod +
  171.  
  172. If Timeout > 0 Then
  173. Select Case Pos2
  174. Case 1
  175. Prad = Prad + 1
  176. Case 2
  177. Prad = Prad + 0.1
  178. Case 3
  179. Prad = Prad + 0.01
  180. Case 4
  181. Prad = Prad + 0.001
  182. End Select
  183.  
  184. If Prad > 3.0 Then Prad = 3.0
  185. Mig = 0 : Call Show_current
  186. End If
  187. Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  188. Gifr.intf0 = 1
  189. Enable INT0
  190. End If
  191.  
  192. If Tifr.ocf2 = 1 Then '10ms
  193. Tifr.ocf2 = 1
  194.  
  195. If 500ms < 49 Then
  196. Incr 500ms
  197. Else
  198. 500ms = 0
  199. If Mig = 0 Then Mig = 1 Else Mig = 0
  200.  
  201. If Timeout > 0 Then
  202. Decr Timeout
  203. If Timeout = 0 Then
  204. 'wyślij do DAC
  205. Mig = 0
  206. Prad_ee = Prad 'zapamietaj dopiero po Timeoucie
  207. Call Set_dac
  208. End If
  209.  
  210. Call Show_current()
  211. End If
  212. End If
  213. End If
  214. ' ***************************************************************** Obsługa encodera dla napięcia
  215. Debounce Enc_sw1 , 0 , Enc_sw1_sub , Sub 'ENCODER U_SET
  216. '##### encoder turns left ######
  217. If 0 < Encoder1_turn_left Then
  218. Decr Encoder1_turn_left
  219. 'tutaj Twój kod -
  220. If Timeout1 > 0 Then
  221. Select Case Pos
  222. Case 1
  223. Napiecie = Napiecie - 1.0
  224. Case 2
  225. Napiecie = Napiecie - 0.1
  226. Case 3
  227. Napiecie = Napiecie - 0.01
  228. Case 4
  229. Napiecie = Napiecie - 0.001
  230. End Select
  231. If Napiecie < 0 Then Napiecie = 0
  232. Mig1 = 0 : Call Show_voltage
  233. End If
  234.  
  235. Timeout1 = Timeout_time                                 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  236. Gifr.intf1 = 1                                        'dla Mega8, M32 itp
  237. Enable Int1
  238. End If
  239. ' #### encoder turns right ######
  240. If 0 < Encoder1_turn_right Then
  241. Decr Encoder1_turn_right
  242. 'tutaj Twój kod +
  243. If Timeout1 > 0 Then
  244. Select Case Pos
  245. Case 1
  246. Napiecie = Napiecie + 1
  247. Case 2
  248. Napiecie = Napiecie + 0.1
  249. Case 3
  250. Napiecie = Napiecie + 0.01
  251. Case 4
  252. Napiecie = Napiecie + 0.001
  253. End Select
  254. If Napiecie > 20.0 Then Napiecie = 20.0
  255. Mig1 = 0 : Call Show_voltage
  256. End If
  257.  
  258. Timeout1 = Timeout_time                                 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  259. Gifr.intf1 = 1                                     'dla Mega8, M32 itp
  260. Enable Int1
  261. End If
  262.  
  263. If Tifr.ocf2 = 1 Then                                    '10ms
  264. Tifr.ocf2 = 1
  265.  
  266. If 500ms < 49 Then
  267. Incr 500ms
  268. Else
  269. 500ms = 0
  270. If Mig1 = 0 Then Mig1 = 1 Else Mig1 = 0
  271.  
  272. If Timeout1 > 0 Then
  273. Decr Timeout1
  274. If Timeout1 = 0 Then
  275. 'wyślij do DAC
  276. Mig1 = 0
  277. Napiecie_ee = Napiecie                           'zapamietaj dopiero po Timeoucie
  278.  
  279. Call Set_dac
  280. End If
  281.  
  282. Call Show_voltage()
  283. End If
  284. End If
  285. End If
  286. '********************************************************************************************
  287. Loop
  288. End
  289.  
  290. ' Obsługa przycisku Encoder1 U_SET
  291. Enc_sw1_sub:
  292. If Timeout1 > 0 Then
  293. Incr Pos : If Pos > 4 Then Pos = 1
  294. Pos_ee = Pos
  295. End If
  296. Timeout1 = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  297. Return
  298.  
  299.  
  300. ' Obsługa przycisku Encoder2 I_SET
  301. Enc_sw2_sub:
  302. If Timeout > 0 Then
  303. Incr Pos2 : If Pos2 > 4 Then Pos2 = 1
  304. Pos2_ee = Pos2
  305. End If
  306. Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  307. Return
  308.  
  309.  
  310. 'tutaj obsługa przerwania zewnetrznego z enkodera 2
  311. Encoder2_isr:
  312.    $asm
  313.       PUSH R23
  314.       PUSH R24
  315.       PUSH R26
  316.       PUSH R27
  317.       !in R24, sreg
  318.       PUSH  R24
  319.    $end Asm
  320.  
  321.    Disable INT0
  322.  
  323.    If Encoder2_a = 1 Then
  324.       Incr Encoder2_turn_right
  325.    Else
  326.       Incr Encoder2_turn_left
  327.    End If
  328.  
  329. 'Tuned with NoSave Tool
  330.    $asm
  331.       POP  R24
  332.       !out sreg, r24
  333.       POP R27
  334.       POP R26
  335.       POP R24
  336.       POP R23
  337.    $end Asm
  338.  
  339. Return
  340.  
  341. 'tutaj obsługa przerwania zewnetrznego z enkodera 1
  342. Encoder1_isr:
  343.  
  344.    $asm
  345.       PUSH R23
  346.       PUSH R24
  347.       PUSH R26
  348.       PUSH R27
  349.       !in R24, sreg
  350.       PUSH  R24
  351.    $end Asm
  352.  
  353.    Disable Int1
  354.  
  355.    If Encoder1_a = 1 Then
  356.       Incr Encoder1_turn_right
  357.    Else
  358.       Incr Encoder1_turn_left
  359.    End If
  360.  
  361.   '          Tuned with NoSave Tool
  362.  
  363.    $asm
  364.       POP  R24
  365.       !out sreg, r24
  366.       POP R27
  367.       POP R26
  368.       POP R24
  369.       POP R23
  370.    $end Asm
  371.  
  372. Return
Awatar użytkownika
niveasoft
Posty: 1217
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przetwornik DAC do zasilacza

Post autor: niveasoft » 26 kwie 2021, 12:52

Bardziej w ten deseń ;) Nie możesz w dwóch miejscach sprawdzać tego samego czasu :D 500ms minęło i już nie wróci.
Sprawdź. Może zadziała. Nie testowałem.
Pewnie można by połączyć Mig z Mig1 bo to po prostu odwrócenie stanu co 500ms. Pewnie jeszcze coś by się znalazło...
  1. $regfile = "m32def.dat"
  2. $crystal = 11059200
  3. $hwstack = 64
  4. $swstack = 16
  5. $framesize = 64
  6.  
  7. Const Timeout_time = 8 'x500ms
  8. Config Submode = New
  9.  
  10.     ' config LCD 2X16
  11. Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
  12. Config Lcd = 16x2
  13. Cursor Off
  14. Cls
  15.  
  16. Deflcdchar 0,17,17,17,10,4,32,32,32' (volt)
  17. Deflcdchar 1,14,17,17,31,17,32,32,32' (amper)
  18.  
  19.  
  20.     '---------------------------------------------------------------------------------------
  21.     ' config for encoders
  22.  
  23.     ' ENCODER U_SET
  24. Config PortD.5 = Input : PortD.5 = 1 : Encoder1_a Alias PinD.5      'ENKODER1A
  25. Config Portd.3 = Input : Portd.3 = 1 : Encoder1_b Alias Pind.3      'ENKODER1B, INT1
  26. Config PortD.7 = Input : PortD.7 = 1 : Enc_sw1 Alias PinD.7         ' Przycisk Enkoder1
  27.  
  28.     ' ENCODER I_SET
  29. Config PortD.6 = Input : PortD.6 = 1 : Encoder2_a Alias PinD.6      'ENKODER2A
  30. Config Portd.2 = Input : Portd.2 = 1 : Encoder2_b Alias Pind.2      'ENKODER2B, INT0
  31. Config PortC.2 = Input : PortC.2 = 1 : Enc_sw2 Alias PinC.2         ' Przycisk Enkoder2
  32.  
  33. Config Int1 = Rising 'przerwanie  generować będzie rosnące zbocze
  34. Enable Int1 : On Int1 Encoder1_isr Nosave
  35.  
  36. Config Int0 = Rising 'przerwanie  generować będzie rosnące zbocze
  37. Enable Int0 : On Int0 Encoder2_isr Nosave
  38.  
  39. Dim Encoder1_turn_left As Byte , Encoder1_turn_right As Byte
  40. Dim Encoder2_turn_left As Byte , Encoder2_turn_right As Byte
  41.  
  42.     '----------------------------------------------------------------------------------------
  43.     ' config Timer2
  44. Config Timer2 = Timer , Prescale = 1024 , Clear_timer = 1
  45. Compare2 = 107 '10ms @11MHz/1024
  46.  
  47.     'settings
  48. Dim 500ms As Byte , Mig As Byte , Timeout As Byte , Mig1 As Byte , Timeout1 As Byte
  49.  
  50.     'Zmienne dla encodera prądu
  51. Dim Prad As Single , Prad_ee As Eram Single
  52. Dim Pos2 As Byte , Pos2_ee As Eram Byte
  53. Dim Current_str As String * 10
  54. Dim Temp_str As String * 10
  55.  
  56.     'Zmienne dla encodera napięcia
  57. Dim Napiecie As Single , Napiecie_ee As Eram Single
  58. Dim Pos As Byte , Pos_ee As Eram Byte
  59. Dim Volt_str As String * 10
  60. Dim Temp_str1 As String * 10
  61.  
  62. Enable Interrupts
  63.  
  64.     ' Procedura wyświetlania napięcia U_SET
  65. Sub Show_voltage
  66.  
  67.    Temp_str1 = Fusing(napiecie , "#.&&&")
  68.    Volt_str = Format(temp_str1 , "      ")                     'dwa znaki+kropka+trzy znaki
  69.  
  70.    If Mig1 = 1 Then
  71.       Select Case Pos
  72.          Case 1
  73.             Mid(volt_str , 1) = "  "                             'wstaw spację w miejscu pos (migaj)
  74.          Case 2
  75.             Mid(volt_str , 4) = " "
  76.          Case 3
  77.             Mid(volt_str , 5) = " "
  78.          Case 4
  79.             Mid(volt_str , 6) = " "
  80.       End Select
  81.    End If
  82.    Locate 1 , 1 : Lcd Volt_str ; Chr(0) ' Wyświetlenie na LCD napięcia ustawionego U_SET
  83. End Sub
  84.  
  85.  
  86.     ' Procedura wyświetlania prądu I_SET
  87. Sub Show_current
  88.  
  89.    Temp_str = Fusing(prad , "#.&&&")
  90.    Current_str = Format(temp_str , "      ")  'dwa znaki+kropka+trzy znaki
  91.  
  92.    If Mig = 1 Then
  93.       Select Case Pos2
  94.          Case 1
  95.             Mid(current_str , 1) = "  " 'wstaw spację w miejscu pos (migaj)
  96.          Case 2
  97.             Mid(current_str , 4) = " "
  98.          Case 3
  99.             Mid(current_str , 5) = " "
  100.          Case 4
  101.             Mid(current_str , 6) = " "
  102.       End Select
  103.    End If
  104.    Locate 1 , 10 : Lcd Current_str ; Chr(1) ' Wyświetlenie na LCD ograniczenia prądowego I_SET
  105. End Sub
  106.  
  107. Sub Set_dac
  108.      'przelicz Single Prad i wyslij do DAC
  109. End Sub
  110.  
  111.     ' eeprom reading U_SET
  112.     '------------------------------
  113. Pos = Pos_ee
  114. If Pos > 4 Then
  115.    Pos = 4 : Pos_ee = Pos
  116.    Napiecie_ee = 0
  117. End If
  118. Napiecie = Napiecie_ee
  119.     '------------------------------
  120. Call Show_voltage()
  121.  
  122.     ' eeprom reading I_SET
  123.     '------------------------------
  124. Pos2 = Pos2_ee
  125. If Pos2 > 4 Then
  126.    Pos2 = 4 : Pos2_ee = Pos2
  127.    Prad_ee = 0
  128. End If
  129. Prad = Prad_ee
  130.     '------------------------------
  131. Call Show_current()
  132.  
  133. Call Set_dac()
  134.  
  135.  
  136.  
  137.  
  138.     ' ########################## GŁÓWNA PĘTLA ###############################
  139. Do
  140.  
  141.     '************************************************************** Obsługa encodera dla prądu
  142.    Debounce Enc_sw2 , 0 , Enc_sw2_sub , Sub                 'ENCODER I_SET
  143.     '##### encoder turns left ######
  144.    If 0 < Encoder2_turn_left Then
  145.       Decr Encoder2_turn_left
  146.     'tutaj Twój kod -
  147.       If Timeout > 0 Then
  148.          Select Case Pos2
  149.             Case 1
  150.                Prad = Prad - 1.0
  151.             Case 2
  152.                Prad = Prad - 0.1
  153.             Case 3
  154.                Prad = Prad - 0.01
  155.             Case 4
  156.                Prad = Prad - 0.001
  157.          End Select
  158.  
  159.          If Prad < 0 Then Prad = 0
  160.          Mig = 0 : Call Show_current
  161.       End If
  162.  
  163.       Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  164.       Gifr.intf0 = 1
  165.       Enable INT0
  166.    End If
  167.     ' #### encoder turns right ######
  168.    If 0 < Encoder2_turn_right Then
  169.       Decr Encoder2_turn_right
  170.     'tutaj Twój kod +
  171.  
  172.       If Timeout > 0 Then
  173.          Select Case Pos2
  174.             Case 1
  175.                Prad = Prad + 1
  176.             Case 2
  177.                Prad = Prad + 0.1
  178.             Case 3
  179.                Prad = Prad + 0.01
  180.             Case 4
  181.                Prad = Prad + 0.001
  182.          End Select
  183.  
  184.          If Prad > 3.0 Then Prad = 3.0
  185.          Mig = 0 : Call Show_current
  186.       End If
  187.       Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  188.       Gifr.intf0 = 1
  189.       Enable INT0
  190.    End If
  191.  
  192.     ' ***************************************************************** Obsługa encodera dla napięcia
  193.    Debounce Enc_sw1 , 0 , Enc_sw1_sub , Sub 'ENCODER U_SET
  194.     '##### encoder turns left ######
  195.    If 0 < Encoder1_turn_left Then
  196.       Decr Encoder1_turn_left
  197.     'tutaj Twój kod -
  198.       If Timeout1 > 0 Then
  199.          Select Case Pos
  200.             Case 1
  201.                Napiecie = Napiecie - 1.0
  202.             Case 2
  203.                Napiecie = Napiecie - 0.1
  204.             Case 3
  205.                Napiecie = Napiecie - 0.01
  206.             Case 4
  207.                Napiecie = Napiecie - 0.001
  208.          End Select
  209.          If Napiecie < 0 Then Napiecie = 0
  210.          Mig1 = 0 : Call Show_voltage
  211.       End If
  212.  
  213.       Timeout1 = Timeout_time                                 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  214.       Gifr.intf1 = 1                                        'dla Mega8, M32 itp
  215.       Enable Int1
  216.    End If
  217.     ' #### encoder turns right ######
  218.    If 0 < Encoder1_turn_right Then
  219.       Decr Encoder1_turn_right
  220.     'tutaj Twój kod +
  221.       If Timeout1 > 0 Then
  222.          Select Case Pos
  223.             Case 1
  224.                Napiecie = Napiecie + 1
  225.             Case 2
  226.                Napiecie = Napiecie + 0.1
  227.             Case 3
  228.                Napiecie = Napiecie + 0.01
  229.             Case 4
  230.                Napiecie = Napiecie + 0.001
  231.          End Select
  232.          If Napiecie > 20.0 Then Napiecie = 20.0
  233.          Mig1 = 0 : Call Show_voltage
  234.       End If
  235.  
  236.       Timeout1 = Timeout_time                                 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  237.       Gifr.intf1 = 1                                     'dla Mega8, M32 itp
  238.       Enable Int1
  239.    End If
  240.  
  241.  
  242.    If Tifr.ocf2 = 1 Then '10ms
  243.       Tifr.ocf2 = 1
  244.  
  245.       If 500ms < 49 Then
  246.          Incr 500ms
  247.       Else
  248.          500ms = 0
  249.          If Mig = 0 Then Mig = 1 Else Mig = 0
  250.  
  251.          If Timeout > 0 Then
  252.             Decr Timeout
  253.             If Timeout = 0 Then
  254.     'wyślij do DAC
  255.                Mig = 0
  256.                Prad_ee = Prad 'zapamietaj dopiero po Timeoucie
  257.                Call Set_dac
  258.             End If
  259.  
  260.             Call Show_current()
  261.          End If
  262.  
  263.          If Mig1 = 0 Then Mig1 = 1 Else Mig1 = 0
  264.  
  265.          If Timeout1 > 0 Then
  266.             Decr Timeout1
  267.             If Timeout1 = 0 Then
  268.     'wyślij do DAC
  269.                Mig1 = 0
  270.                Napiecie_ee = Napiecie                           'zapamietaj dopiero po Timeoucie
  271.  
  272.                Call Set_dac
  273.             End If
  274.  
  275.             Call Show_voltage()
  276.          End If
  277.  
  278.       End If
  279.    End If
  280.     '********************************************************************************************
  281. Loop
  282. End
  283.  
  284.     ' Obsługa przycisku Encoder1 U_SET
  285. Enc_sw1_sub:
  286.    If Timeout1 > 0 Then
  287.       Incr Pos : If Pos > 4 Then Pos = 1
  288.       Pos_ee = Pos
  289.    End If
  290.    Timeout1 = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  291. Return
  292.  
  293.  
  294.     ' Obsługa przycisku Encoder2 I_SET
  295. Enc_sw2_sub:
  296.    If Timeout > 0 Then
  297.       Incr Pos2 : If Pos2 > 4 Then Pos2 = 1
  298.       Pos2_ee = Pos2
  299.    End If
  300.    Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  301. Return
  302.  
  303.  
  304.     'tutaj obsługa przerwania zewnetrznego z enkodera 2
  305. Encoder2_isr:
  306.    $asm
  307.       PUSH R23
  308.       PUSH R24
  309.       PUSH R26
  310.       PUSH R27
  311.       !in R24, sreg
  312.       PUSH  R24
  313.    $end Asm
  314.  
  315.    Disable INT0
  316.  
  317.    If Encoder2_a = 1 Then
  318.       Incr Encoder2_turn_right
  319.    Else
  320.       Incr Encoder2_turn_left
  321.    End If
  322.  
  323.     'Tuned with NoSave Tool
  324.    $asm
  325.       POP  R24
  326.       !out sreg, r24
  327.       POP R27
  328.       POP R26
  329.       POP R24
  330.       POP R23
  331.    $end Asm
  332.  
  333. Return
  334.  
  335.     'tutaj obsługa przerwania zewnetrznego z enkodera 1
  336. Encoder1_isr:
  337.  
  338.    $asm
  339.       PUSH R23
  340.       PUSH R24
  341.       PUSH R26
  342.       PUSH R27
  343.       !in R24, sreg
  344.       PUSH  R24
  345.    $end Asm
  346.  
  347.    Disable Int1
  348.  
  349.    If Encoder1_a = 1 Then
  350.       Incr Encoder1_turn_right
  351.    Else
  352.       Incr Encoder1_turn_left
  353.    End If
  354.  
  355.       '          Tuned with NoSave Tool
  356.  
  357.    $asm
  358.       POP  R24
  359.       !out sreg, r24
  360.       POP R27
  361.       POP R26
  362.       POP R24
  363.       POP R23
  364.    $end Asm
  365.  
  366. Return
ODPOWIEDZ