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ć .
Napęd do lasera
- tomaszdko
- Posty: 78
- Rejestracja: 06 gru 2018, 19:58
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Napęd do lasera
Witam no tak powinienem wstawić cały kod a nie tylko wycinki, a to mój program
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
pozdrawiam Jacek.
P.S. mam porobione subrutyny których nie wstawiłem jeżeli są potrzebne to umieszczę.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '****************************************************************
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 64
- $swstack = 64
- $framesize = 128
- $baud = 115200
- $eepleave
- Config Submode = New
- '****************************************************************
- 'KONFIGURACJA PORTU COM
- Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
- Config Serialin = Buffered , Size = 128
- Config Serialout = Buffered , Size = 128
- Enable Serial
- '****************************************************************
- 'Debug Off
- Debug On
- '****************************************************************
- $include "Subs\Blink_.inc"
- $include "Subs\Read_adc.inc"
- $include "Subs\Rotate_left.inc"
- $include "Subs\Rotate_right.inc"
- $include "Subs\Rotate_stop.inc"
- $include "Subs\Travel_left.inc"
- $include "Subs\Travel_right.inc"
- $include "Subs\Travel_stop.inc"
- '****************************************************************
- 'KONFIGURACJA TIMER'OW
- Config Timer0 = Pwm , Compare_A_Pwm = Clear_down , Prescale = 64 '256 '1024 'motor rotation
- Config TIMER2 = Pwm , Compare_A_Pwm = Clear_up , Prescale = 64 '256 '1024 'motor travel
- Config Timer1 = Timer , Prescale = 8
- On Timer1 Przer_timer1
- 'Start Timer2
- Enable Timer1
- '****************************************************************
- 'KONFIGURACJA PORTOW
- Config Portc.4 = Output : Portc.4 = 1 'IN1 rotation Motor
- 'Config Portd.7 = Output : portd.7 = 1 'IN1 rotation Motor
- Config Portd.5 = Output : portd.5 = 1 'IN2 rotation Motor
- 'Config portd.6 = Output : portd.6 = 1 'SPEED rotation Motor
- '****************************************************************
- Config Portb.1 = Output : portb.1 = 1 'IN3 travel Motor
- Config portb.2 = Output : portb.2 = 1 'IN4 travel Motor
- 'Config PortB.3 = Output : portB.3 = 1 'SPEED travel Motor
- '****************************************************************
- Config Portb.5 = Output : Portb.5 = 0 'LED_LIVE
- Config Portd.2 = Input : Pind.2 = 1 'limit left travel
- Config Portd.4 = Input : Pind.4 = 1 'limit right travel
- '****************************************************************
- Config ADC = Single , Prescaler = Auto , Reference = Avcc
- Start ADC
- '****************************************************************
- 'ALIASY PORTOW
- IN1 Alias Portc.4 'IN1 rotation motor
- 'IN1 Alias Portd.7 'IN1 rotation motor usmazony?
- IN2 Alias Portd.5 'IN2 rotation Motor
- Speed_rot Alias Portd.6 'SPEED rotation motor
- '****************************************************************
- IN3 Alias Portb.1 'IN3 travel Motor
- IN4 Alias Portb.2 'IN4 travel Motor
- Speed_trav Alias Portb.3 'SPEED travel Motor
- '****************************************************************
- Led_live Alias Portb.5 'LED shows that the microcontroller did not hang
- Limit_left_trv Alias pind.2 'limit left travel
- Limit_right_trv Alias pind.4 'limit right travel
- '****************************************************************
- 'ZMIENNE CZASU
- Dim Timer_tikx10 As Byte 'variable counting timer overflow
- Dim Timertikx100 As Byte
- Dim Timertikx200 As Byte
- Dim Timer_tik_flag As Byte
- Flaga10ms Alias Timer_tik_flag.0
- Flaga100ms Alias Timer_tik_flag.1
- Flaga500ms Alias Timer_tik_flag.2
- Flaga1s Alias Timer_tik_flag.3
- Flaga2s Alias Timer_tik_flag.4
- Flaga2_5s Alias Timer_tik_flag.5
- 'zostaly jeszce trzy wolne flagi
- ' a uzylem tylko jednego bajtu
- ' Paweł - pikczu
- Dim Timer0_tik_flag As Byte
- Flaga4ms Alias Timer0_tik_flag.6
- '****************************************************************
- 'STALE
- '****************************************************************
- 'ZMIENNE
- Dim ADC_travel As Word
- Dim PWM_travel As Word
- Dim ADC_trav As Word
- Dim PWM_trav As Word
- Dim Sw_cnt As Byte
- Dim Lock As Byte
- Dim ADC_rotate As Word
- Dim PWM_rotate As Word
- Dim ADC_rot As Word
- Dim PWM_rot As Word
- '****************************************************************
- Enable Interrupts
- '****************************************************************
- Waitms 500
- Cls
- '****************************************************************
- 'USTAWIENIA POCZATKOWE 'INITIAL SETTINGS
- '****************************************************************
- Cls
- Print "PROGRAM TESTOWY"
- Print "NAPEDU LASERA"
- Print "KRZYZOWEGO"
- Waitms 250
- '****************************************************************
- 'PETLA GLOWNA 'MAIN LOOP
- '****************************************************************
- Do
- '****************************************************************
- If Timer_tikx10 >= 10 Then 'jesli uplynelo 100ms to
- Flaga100ms = 1 'ustaw flage uplynelo 100ms
- Incr Timertikx100
- Timer_tikx10 = 0 ''zeruj liczenie
- End If
- If Timertikx100 >= 10 Then 'jesli uplynela sekunda
- Flaga1s = 1 'ustaw flage sekundy
- Incr Timertikx200
- Timertikx100 = 0 'zeruj liczenie
- End If
- If Timertikx200 >= 2 Then
- Flaga2s = 1
- Timertikx200 = 0
- End If
- '****************************************************************
- If Flaga10ms = 1 Then
- '****************************************************************
- Select Case PWM_rot
- Case 0 To 120 : Call Rotate_left
- Case 121 To 129 : Call Rotate_stop
- Case 130 To 255 : Call Rotate_right
- End Select
- '****************************************************************
- Select Case PWM_trav
- Case 0 To 120 : Call Travel_left
- Case 121 To 129 : Call Travel_stop
- Case 130 To 255 : Call Travel_right
- End Select
- '****************************************************************
- Flaga10ms = 0
- End If
- '***************************************************************
- If Flaga100ms = 1 Then 'co 100ms
- Call Read_adc
- Flaga100ms = 0 'wyzeruj Flaga100ms
- End If
- '****************************************************************
- If Flaga1s = 1 Then 'co 1 sekundę
- Call Blink_
- Debug "---------------------------------------"
- Debug "ADC_rot " ; ADC_rot
- Debug "PWM_rot " ; PWM_rot
- Debug "ADC_trav " ; ADC_trav
- Debug "PWM_trav " ; PWM_trav
- If Limit_left_trv = 0 Then
- Debug "LIMIT LEFT"
- End If
- If Limit_right_trv = 0 Then
- Debug "LIMIT RIGHT"
- End IF
- Flaga1s = 0
- End If
- '****************************************************************
- If Flaga2s = 1 Then 'co2s
- Flaga2s = 0
- End If
- '****************************************************************
- PWM_rotate = ADC_rotate / 4
- PWM_travel = ADC_travel / 4
- PWM_trav = ADC_trav / 4
- PWM_rot = ADC_rot / 4
- '****************************************************************
- If Limit_left_trv = 0 And Limit_right_trv = 1 And PWM_trav => 130 Then
- Call Travel_stop
- End If
- If Limit_right_trv = 0 And Limit_left_trv = 1 And PWM_trav =< 120 Then
- Call Travel_stop
- End If
- '****************************************************************
- Loop
- End
- '****************************************************************
- 'PODPROGRAM PRZERWAN TIMER1
- Przer_timer1:
- Timer1 = 45536 'wstawienie do Timer1 wartosci 45536
- Incr Timer_tikx10
- If Timer_tikx10 = 1 Then
- Set Flaga10ms
- End If
- Return
- '****************************************************************
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
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.
- tomaszdko
- Posty: 78
- Rejestracja: 06 gru 2018, 19:58
Re: Napęd do lasera
Znalazłem typowy driver L298 .
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
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.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Napęd do lasera
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.
pozdrawiam Jacek.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Napęd do lasera
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.
Teraz będę próbował dopisać obsługę modułu WiFi i może Bartek napisze apkę na iPhone.
pozdrawiam Jacek.
- tomaszdko
- Posty: 78
- Rejestracja: 06 gru 2018, 19:58
Re: Napęd do lasera
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.
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
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Napęd do lasera
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.
pozdrawiam Jacek.