Napęd do lasera

Prezentacje projektów
Awatar użytkownika
tomaszdko
Posty: 78
Rejestracja: 06 gru 2018, 19:58

Re: Napęd do lasera

Post autor: tomaszdko » 21 maja 2023, 22:19

Używam arduino nano atmega328p . Mostek podłączony pod wyjścia PWM .
Pierwszy kanał L298 ma podane PWM z PIND.5 I PIND.6 . - Timer0
Drugi kanał PWM z PIND.3 I PINB.3 - Timer2

Po twoim kawałku kodu widzę że używasz innego procka .
Jeśli używasz innego to zmień w moim pogram na swój procek i ewentualnie zmień piny .
Inny procek może mieć na innych pinach wyjścia PWM.

Twojego kodu nie znam więc nie wiem co ma robić .
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Napęd do lasera

Post autor: Jacek » 22 maja 2023, 21:14

Witam no tak powinienem wstawić cały kod a nie tylko wycinki, a to mój program

  1.  
  2.  
  3. '****************************************************************
  4. $regfile = "m328pdef.dat"
  5. $crystal = 16000000
  6. $hwstack = 64
  7. $swstack = 64
  8. $framesize = 128
  9. $baud = 115200
  10. $eepleave
  11. Config Submode = New
  12. '****************************************************************
  13.     'KONFIGURACJA PORTU COM
  14. Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  15. Config Serialin = Buffered , Size = 128
  16. Config Serialout = Buffered , Size = 128
  17. Enable Serial
  18. '****************************************************************
  19.     'Debug Off
  20. Debug On
  21.  
  22. '****************************************************************
  23. $include "Subs\Blink_.inc"
  24. $include "Subs\Read_adc.inc"
  25. $include "Subs\Rotate_left.inc"
  26. $include "Subs\Rotate_right.inc"
  27. $include "Subs\Rotate_stop.inc"
  28. $include "Subs\Travel_left.inc"
  29. $include "Subs\Travel_right.inc"
  30. $include "Subs\Travel_stop.inc"
  31. '****************************************************************
  32.         'KONFIGURACJA TIMER'OW
  33. Config Timer0 = Pwm , Compare_A_Pwm = Clear_down , Prescale = 64                '256             '1024              'motor  rotation
  34. Config TIMER2 = Pwm , Compare_A_Pwm = Clear_up , Prescale = 64                  '256                 '1024                'motor travel
  35. Config Timer1 = Timer , Prescale = 8
  36. On Timer1 Przer_timer1
  37. 'Start Timer2
  38. Enable Timer1
  39.  '****************************************************************
  40.         'KONFIGURACJA PORTOW
  41. Config Portc.4 = Output : Portc.4 = 1                                           'IN1 rotation Motor
  42. 'Config Portd.7 = Output : portd.7 = 1                                           'IN1 rotation Motor
  43. Config Portd.5 = Output : portd.5 = 1                                           'IN2 rotation Motor
  44. 'Config portd.6 = Output : portd.6 = 1                                           'SPEED rotation Motor
  45. '****************************************************************
  46. Config Portb.1 = Output : portb.1 = 1                                           'IN3 travel Motor
  47. Config portb.2 = Output : portb.2 = 1                                           'IN4 travel Motor
  48. 'Config PortB.3 = Output : portB.3 = 1                                           'SPEED travel Motor
  49. '****************************************************************
  50. Config Portb.5 = Output : Portb.5 = 0                                           'LED_LIVE
  51. Config Portd.2 = Input : Pind.2 = 1                                             'limit left travel
  52. Config Portd.4 = Input : Pind.4 = 1                                             'limit right travel
  53. '****************************************************************
  54. Config ADC = Single , Prescaler = Auto , Reference = Avcc
  55. Start ADC
  56. '****************************************************************
  57.         'ALIASY PORTOW
  58. IN1 Alias Portc.4                                                               'IN1 rotation motor
  59. 'IN1 Alias Portd.7                                                               'IN1 rotation motor     usmazony?
  60. IN2 Alias Portd.5                                                               'IN2 rotation Motor
  61. Speed_rot Alias Portd.6                                                         'SPEED rotation motor
  62. '****************************************************************
  63. IN3 Alias Portb.1                                                               'IN3 travel Motor
  64. IN4 Alias Portb.2                                                               'IN4 travel Motor
  65. Speed_trav Alias Portb.3                                                        'SPEED travel Motor
  66. '****************************************************************
  67. Led_live Alias Portb.5                                                          'LED shows that the microcontroller did not hang
  68. Limit_left_trv Alias pind.2                                                     'limit left travel
  69. Limit_right_trv Alias pind.4                                                    'limit right travel
  70.     '****************************************************************
  71.         'ZMIENNE   CZASU
  72. Dim Timer_tikx10 As Byte                                                        'variable counting timer overflow
  73. Dim Timertikx100 As Byte
  74. Dim Timertikx200 As Byte
  75. Dim Timer_tik_flag As Byte
  76. Flaga10ms Alias Timer_tik_flag.0
  77. Flaga100ms Alias Timer_tik_flag.1
  78. Flaga500ms Alias Timer_tik_flag.2
  79. Flaga1s Alias Timer_tik_flag.3
  80. Flaga2s Alias Timer_tik_flag.4
  81. Flaga2_5s Alias Timer_tik_flag.5
  82.         'zostaly jeszce trzy wolne flagi
  83.         ' a uzylem tylko jednego bajtu
  84.         ' Paweł - pikczu
  85. Dim Timer0_tik_flag As Byte
  86. Flaga4ms Alias Timer0_tik_flag.6
  87.     '****************************************************************
  88.     'STALE
  89.  
  90.     '****************************************************************
  91.     'ZMIENNE
  92. Dim ADC_travel As Word
  93. Dim PWM_travel As Word
  94. Dim ADC_trav As Word
  95. Dim PWM_trav As Word
  96. Dim Sw_cnt As Byte
  97. Dim Lock As Byte
  98. Dim ADC_rotate As Word
  99. Dim PWM_rotate As Word
  100. Dim ADC_rot As Word
  101. Dim PWM_rot As Word
  102.     '****************************************************************
  103. Enable Interrupts
  104. '****************************************************************
  105. Waitms 500
  106. Cls
  107. '****************************************************************
  108.     'USTAWIENIA POCZATKOWE   'INITIAL SETTINGS
  109. '****************************************************************
  110. Cls
  111. Print "PROGRAM TESTOWY"
  112. Print "NAPEDU LASERA"
  113. Print "KRZYZOWEGO"
  114. Waitms 250
  115. '****************************************************************
  116.         'PETLA GLOWNA   'MAIN LOOP
  117. '****************************************************************
  118. Do
  119. '****************************************************************
  120.    If Timer_tikx10 >= 10 Then                                                   'jesli uplynelo 100ms to
  121.       Flaga100ms = 1                                                            'ustaw flage uplynelo 100ms
  122.       Incr Timertikx100
  123.       Timer_tikx10 = 0                                                          ''zeruj liczenie
  124.    End If
  125.    If Timertikx100 >= 10 Then                                                   'jesli uplynela sekunda
  126.       Flaga1s = 1                                                               'ustaw flage sekundy
  127.       Incr Timertikx200
  128.       Timertikx100 = 0                                                          'zeruj liczenie
  129.    End If
  130.    If Timertikx200 >= 2 Then
  131.       Flaga2s = 1
  132.       Timertikx200 = 0
  133.    End If
  134. '****************************************************************
  135.    If Flaga10ms = 1 Then
  136. '****************************************************************
  137.       Select Case PWM_rot
  138.          Case 0 To 120 : Call Rotate_left
  139.          Case 121 To 129 : Call Rotate_stop
  140.          Case 130 To 255 : Call Rotate_right
  141.       End Select
  142. '****************************************************************
  143.       Select Case PWM_trav
  144.          Case 0 To 120 : Call Travel_left
  145.          Case 121 To 129 : Call Travel_stop
  146.          Case 130 To 255 : Call Travel_right
  147.       End Select
  148. '****************************************************************
  149.       Flaga10ms = 0
  150.    End If
  151.  '***************************************************************
  152.    If Flaga100ms = 1 Then                                                       'co 100ms
  153.       Call Read_adc
  154.       Flaga100ms = 0                                                            'wyzeruj Flaga100ms
  155.    End If
  156. '****************************************************************
  157.    If Flaga1s = 1 Then                                                          'co 1 sekundę
  158.       Call Blink_
  159.       Debug "---------------------------------------"
  160.       Debug "ADC_rot " ; ADC_rot
  161.       Debug "PWM_rot " ; PWM_rot
  162.       Debug "ADC_trav " ; ADC_trav
  163.       Debug "PWM_trav " ; PWM_trav
  164.       If Limit_left_trv = 0 Then
  165.          Debug "LIMIT LEFT"
  166.       End If
  167.       If Limit_right_trv = 0 Then
  168.          Debug "LIMIT RIGHT"
  169.       End IF
  170.       Flaga1s = 0
  171.    End If
  172. '****************************************************************
  173.    If Flaga2s = 1 Then                                                          'co2s
  174.       Flaga2s = 0
  175.    End If
  176.     '****************************************************************
  177.    PWM_rotate = ADC_rotate / 4
  178.    PWM_travel = ADC_travel / 4
  179.    PWM_trav = ADC_trav / 4
  180.    PWM_rot = ADC_rot / 4
  181. '****************************************************************
  182.    If Limit_left_trv = 0 And Limit_right_trv = 1 And PWM_trav => 130 Then
  183.       Call Travel_stop
  184.    End If
  185.    If Limit_right_trv = 0 And Limit_left_trv = 1 And PWM_trav =< 120 Then
  186.       Call Travel_stop
  187.    End If
  188. '****************************************************************
  189. Loop
  190. End
  191.     '****************************************************************
  192.         'PODPROGRAM PRZERWAN TIMER1
  193. Przer_timer1:
  194.    Timer1 = 45536                                                               'wstawienie do Timer1 wartosci 45536
  195.    Incr Timer_tikx10
  196.    If Timer_tikx10 = 1 Then
  197.       Set Flaga10ms
  198.    End If
  199. Return
  200.     '****************************************************************
  201.  
  202.  
  203.  

program za pomocą joy'a w osi X ma sterować przesuwaniem podstawą lasera po szynie lewo, prawo w osi Y ma obracać podstawę lasera w lewo, prawo na szynie w osi X są zainstalowane wyłączniki krańcowe.
Korzystam z arduino uno z mikrokontrolerem Atmega328p oraz nakładki DFRobot Motor Shield L298P v1.3 z nakładki wylutowałem układ 74HC00 by do sterowania kierunkami używać bezpośrednio wejść IN1 IN2 IN3 IN4 a pwm ENA i ENB
dlatego pytałem jak masz podłączone w swoim driverze z L298 na pokładzie sygnały czy bezpośrednio tak jak u mnie czy jest tam ten 74HC00 i przez niego jak jest na tym rysunku

L298_shield.jpg
pozdrawiam Jacek.

P.S. mam porobione subrutyny których nie wstawiłem jeżeli są potrzebne to umieszczę.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
tomaszdko
Posty: 78
Rejestracja: 06 gru 2018, 19:58

Re: Napęd do lasera

Post autor: tomaszdko » 23 maja 2023, 20:28

Znalazłem typowy driver L298 .
Obrazek
IN1 IN2 IN3 IN4 - tam są wpięte bezpośrednio PWM . Piny ENA i ENB mają jupery założone na stałe.
Użyj mojego kodu i dodaj wszystko prócz sterowania czyli krańcówki i co tam chcesz jeszcze.

Lepiej by było użyć pinów ENA i ENB do PWM (bo można użyć tylko jednego timera) a kierunki zrobić na IN1 IN2 IN3 IN4 . No ale ja robiłem na małej wersji smd bez pinów ENA i ENB .
Sprawdź na razie tak jak opisałem na początku tego posta
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Napęd do lasera

Post autor: Jacek » 23 maja 2023, 20:52

Witam bardzo dziękuje za info teraz wiem że wylutowanie układu 74HC00 było słuszną decyzją jeszcze raz dzięki Tomek.
pozdrawiam Jacek.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Napęd do lasera

Post autor: Jacek » 24 maja 2023, 20:50

Witam, Tomek program który podesłałeś działa bardzo dobrze https://www.youtube.com/watch?v=2pTekg34ozY jak mogę się Tobie odwdzięczyć za poświęcenie czasu i napisanie głównego kawałka kodu.
Teraz będę próbował dopisać obsługę modułu WiFi i może Bartek napisze apkę na iPhone.
pozdrawiam Jacek.
Awatar użytkownika
tomaszdko
Posty: 78
Rejestracja: 06 gru 2018, 19:58

Re: Napęd do lasera

Post autor: tomaszdko » 25 maja 2023, 17:15

No i gitara gra :) .

Najlepiej jak byś miał projekt zrobiony na procku posiadającymi 2 timery 16bit (ATmega128 lub ATmega1284).
Płynność przy manipulacji przebiegiem PWM jest znacznie przyjemniejsza niż na timer 8bit .
Możesz zrobić eksperymenty z PWM zmieniając prescaler i ustawiając np: napięcia na silniki .
Możesz też zmienić wielkość zmiennych joya dla strefy "martwej" zyskując bardziej płynne posuwy silników .
Czyli zmień wartość zmiennych XADC i YADC tak jak w tym przykładzie . Tak zmieniaj by mieć największą możliwość manipulowania joyem.

Kod: Zaznacz cały

IF XADC>=115 AND XADC=<135 THEN       '1 silnik
COMPARE0a=0
COMPARE0b=0
END IF
 
IF XADC<=114 THEN
COMPARE0b=0
PWM_1_P=114-XADC
PWM_1_P=PWM_1_P*2
COMPARE0A=PWM_1_P
END IF
 
IF XADC>=136 THEN
COMPARE0a=0
PWM_1_L=XADC-136
PWM_1_L=PWM_1_L*2
COMPARE0b=PWM_1_L
END IF
 
'----------------------------------------
                                     '2 silnik
IF YADC>=115 AND YADC=<135 THEN
COMPARE2a=0
COMPARE2b=0
END IF
 
IF YADC<=114 THEN
COMPARE2b=0
PWM_2_P=114-YADC
PWM_2_P=PWM_2_P*2
COMPARE2A=PWM_2_P
END IF
 
IF YADC>=136 THEN
COMPARE2a=0
PWM_2_L=YADC-136
PWM_2_L=PWM_2_L*2
COMPARE2b=PWM_2_L
END IF
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Napęd do lasera

Post autor: Jacek » 25 maja 2023, 21:35

Tomek zmieniłem zakresy "strefy martwej" do minimum i działa dobrze tak jak na filmiku jeszcze raz dzięki, muszę podłączyć ESP8266 i zobaczyć jak to rozkminić.
pozdrawiam Jacek.
ODPOWIEDZ