Witam czytających czy może ktoś podpowiedzieć jak ustawić piny w tym sterowniku aby pracował w trybie pwm i sterowania lewo/prawo bo słabo z angielskim
https://www.pololu.com/product/4035
pozdrawiam Jacek.
DRV8874
- niveasoft
- Posty: 1239
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: DRV8874
Chyba nieskomplikowane. Na EN podajesz PWM a na PH 0 albo 1 i to jest lewo prawo.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: DRV8874
Witam no tak a "PMODE" tak jak jest do masy?
pozdrawiam Jacek.
pozdrawiam Jacek.
- niveasoft
- Posty: 1239
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: DRV8874
Tam pisze, że jeśli PMODE do masy to uaktywnia się najprostszy ze sposobów kontroli układu. Ten typ kontroli polecają wszędzie tam gdzie to mozliwe czyli tam gdzie nie są potrzebne inne funkcje.
Polega to na tym że ten pin PH kontroluje kierunek a PWM podaje się na pin EN. Działa to jednak tez tak, że wyłączenie PWM zatrzymuje motor momentalnie bo zwiera jego wyjścia do masy. Czyli wyłaczenie PWM to natychmiastowy STOP silnika.
Natomiast podanie plusa na PMODE uaktywnia drugi tryb gdzie steruje się dwoma sygnałami PWM.
Chcesz kręcić w lewo to podajesz masę na IN1 a PWM na IN2.
Chcesz kręcić w prawo to podajesz masę na IN2 a PWM na IN1.
Można też hamować z jakąś wybraną siłą podając plusa na jedno wejście a PWM na drugie.
Jak chcesz zahamować na szlag to podajesz masę na obydwa wejścia IN1 i IN2.
Polega to na tym że ten pin PH kontroluje kierunek a PWM podaje się na pin EN. Działa to jednak tez tak, że wyłączenie PWM zatrzymuje motor momentalnie bo zwiera jego wyjścia do masy. Czyli wyłaczenie PWM to natychmiastowy STOP silnika.
Natomiast podanie plusa na PMODE uaktywnia drugi tryb gdzie steruje się dwoma sygnałami PWM.
Chcesz kręcić w lewo to podajesz masę na IN1 a PWM na IN2.
Chcesz kręcić w prawo to podajesz masę na IN2 a PWM na IN1.
Można też hamować z jakąś wybraną siłą podając plusa na jedno wejście a PWM na drugie.
Jak chcesz zahamować na szlag to podajesz masę na obydwa wejścia IN1 i IN2.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: DRV8874
Witam bardzo dziękuje Bartek za odpowiedź spróbuje sterowania w pierwszym modzie.
pozdrawiam Jacek.
pozdrawiam Jacek.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: DRV8874
Witam ponieważ w pierwszym trybie po wyłączeniu silnik kręci się jeszcze pewien czas co powoduje że wózek w urządzeniu się jeszcze przesuwa co powoduje zbyt daleki najazd na krańcówki muszę zmienić tryb pracy na sterowanie dwoma kanałami pwm napisałem programik testowy sygnał PMODE podłaczony na stałe do plusa.
nie wiem czy dobrze ustawiłem tryb Timer2 do pracy w trybie PWM, niestety mój program nie działa można prosić o podpowiedź jak skonfigurować porty i timery aby działało w trybie 2 pwm na jeden sterownik chciałbym uzyć do jednej atmegi 328p 2 takich sterowników.
pozdrawiam Jacek.
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
- '****************************************************************
- Config TIMER2 = PWM , Compare_A_Pwm = Clear_up , Compare_B_Pwm = Clear_up , Prescale = 1024 'motor rotation
- '****************************************************************
- 'KONFIGURACJA PORTOW
- Config Portb.3 = Output : portb.3 = 1 'PWM rotation Motor OC2A
- Config portd.3 = Output : portd.3 = 1 'PWM rotation Motor OC2B
- Config Portb.5 = Output : Portb.5 = 0 'Led Blink
- '****************************************************************
- Enable Interrupts
- Wait 1
- '****************************************************************
- Do
- Wait 5
- Pwm2a = 50 'PORTB.3
- Portd.3 = 0
- Toggle Portb.5
- Wait 5
- Pwm2b = 200 'PORTD.3
- Portb.3 = 0
- Toggle Portb.5
- Loop
- End
- '****************************************************************
pozdrawiam Jacek.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: DRV8874
Witam napisałem następny program testowy
niestety przy wartościach poniżej 18 dla PWM silnik nie ma siły aby obracać platformą.
pozdrawiam Jacek.
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
- '****************************************************************
- Config TIMER2 = PWM , Compare_A_Pwm = Clear_up , Compare_B_Pwm = Clear_up , Prescale = 1024 'motor rotation
- '****************************************************************
- 'KONFIGURACJA PORTOW
- Config Portb.3 = Output : portb.3 = 1 'PWM rotation Motor OC2A
- Config portd.3 = Output : portd.3 = 1 'PWM rotation Motor OC2B
- Config Portb.5 = Output : Portb.5 = 0 'Led Blink
- '****************************************************************
- Enable Interrupts
- Portb.3 = 1
- Portd.3 = 1
- Wait 1
- '****************************************************************
- Do
- Wait 1
- Pwm2a = 0
- Pwm2b = 0
- Wait 1
- Pwm2b = 0
- Portd.3 = 0
- Pwm2a = 18 'PORTB.3
- 'Portd.3 = 0
- Toggle Portb.5
- Wait 15
- Pwm2a = 0
- Pwm2b = 0
- Wait 1
- pwm2a = 0
- Portb.3 = 0
- Pwm2b = 18 'PORTD.3
- 'Portb.3 = 0
- Toggle Portb.5
- Wait 15
- Loop
- End
- '****************************************************************
niestety przy wartościach poniżej 18 dla PWM silnik nie ma siły aby obracać platformą.
pozdrawiam Jacek.
- niveasoft
- Posty: 1239
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: DRV8874
Ogólnie to masz bardzo niską częstotliwość tego PWM. 16MHz/1024 preskaler/256 (8bit) PWM = 61Hz
Może zmniejsz ten preskaler przy timerze bo ten sterownik może pracować z częstotliwościa do 100kHz.
W trybie PWM nie masz w ogóle kontroli nad pinami PORTB.3 i PORTD.3 więc wpisywanie tam 0 możesz sobie darować.
Albo sterujesz PWM2x = 0 albo musiałbyś je od timera odłączać.
Mógłbyś też pokazać ten program który nie hamuje w tym pierwszym trybie.
Może zmniejsz ten preskaler przy timerze bo ten sterownik może pracować z częstotliwościa do 100kHz.
W trybie PWM nie masz w ogóle kontroli nad pinami PORTB.3 i PORTD.3 więc wpisywanie tam 0 możesz sobie darować.
Albo sterujesz PWM2x = 0 albo musiałbyś je od timera odłączać.
Mógłbyś też pokazać ten program który nie hamuje w tym pierwszym trybie.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: DRV8874
Witam musiałem wrócić do tej pierwszej wersji z sygnałem mode podpiętym do masy
program główny
suby
to całość print'y mam żeby widzieć w monitorze czy weszło do suba
pozdrawiam Jacek.
P.S. znalazłem na YT Twój film jak sterujesz prędkością silnika https://www.youtube.com/watch?v=qEuld7CcZys
program główny
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"
- '****************************************************************
- 'KONFIGURACJA TIMER'OW
- 'Config Timer0 = Pwm , Compare_A_Pwm = Clear_up , Compare_B_Pwm = Clear_up , Prescale = 1024 'motor travel
- Config TIMER2 = Pwm , Compare_B_Pwm = Clear_up , Prescale = 1024 'motor rotation
- Config Timer1 = Timer , Prescale = 8
- On Timer1 Przer_timer1
- 'Start Timer2
- Enable Timer1
- '****************************************************************
- 'KONFIGURACJA PORTOW
- Config Portb.3 = Output : portb.3 = 0 'PWM rotation Motor OC2A
- Config portd.3 = Output : portd.3 = 0 'PWM rotation Motor OC2B
- Config Portd.6 = Output : portd.6 = 1 'PWM travel Motor OC0A
- Config Portd.5 = Output : portd.5 = 1 'PWM travel Motor OC0B
- Config Portb.5 = Output : Portb.5 = 0 'LED_LIVE
- Config Portc.2 = Input : pinc.2 = 1 'Sw rotate left
- Config portc.3 = Input : pinc.3 = 1 'Sw rotate right
- Config portc.6 = Input : pinb.0 = 1 'Sw travel left
- Config portd.7 = Input : pind.7 = 1 'Sw travel right
- Config Portd.2 = Input : Pind.2 = 1 'limit left travel
- Config Portd.4 = Input : Pind.4 = 1 'limit right travel
- '****************************************************************
- 'ADC0 poti PWM rotation Motor
- 'ADC1 poti PWM travel Motor
- Config ADC = Single , Prescaler = Auto , Reference = Avcc
- 'Start ADC
- '****************************************************************
- 'ALIASY PORTOW
- PWM_rot_left Alias Portb.3 'PWM rotation Motor OC2A
- PWM_rot_right Alias Portd.3 'PWM rotation Motor OC2B
- PWM_trav_left Alias Portd.6 'PWM travel Motor OC0A
- PWM_trav_right Alias Portd.5 'PWM travel Motor OC0B
- Led_live Alias Portb.5 'LED shows that the microcontroller did not hang
- Sw_rot_left Alias Pinc.2 'Sw rotate left
- Sw_rot_right Alias Pinc.3 'Sw rotate right
- Sw_trav_left Alias Pinb.0 'Sw travel left
- Sw_trav_right Alias Pind.7 'Sw travel right
- 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_Read As Word
- Dim Sw_cnt As Byte
- Dim Lock As Byte
- Dim ADC_rotate As Word
- Dim PWM_rotate As Word
- '****************************************************************
- Enable Interrupts
- '****************************************************************
- Waitms 500
- Cls
- '****************************************************************
- 'USTAWIENIA POCZATKOWE 'INITIAL SETTINGS
- Stop timer2
- 'Portb.3 = 0 'dla testu
- '****************************************************************
- Cls
- Print "PROGRAM TESTOWY"
- Print "NAPĘDU LASERA"
- Print "KRZYŻOWEGO"
- 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
- If Sw_rot_left = 0 Then
- Call Rotate_left
- End If
- If Sw_rot_right = 0 Then
- Call Rotate_right
- End If
- If Sw_rot_left = 1 And Sw_rot_right = 1 Then
- Call Rotate_stop
- End If
- '****************************************************************
- 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_
- Print "ADC_rotate " ; ADC_rotate
- Print "PWM2B " ; PWM2b
- Print "PWM_rotate " ; PWM_rotate
- Print "---------------------------------------"
- If Sw_rot_left = 0 Then
- Print "OBR_LEWO"
- End If
- If Sw_rot_right = 0 Then
- Print "OBR_PRAWO"
- End If
- If Sw_rot_left = 0 And Sw_rot_right = 0 Then
- Print "STOP"
- End If
- Flaga1s = 0
- End If
- '****************************************************************
- If Flaga2s = 1 Then 'co2s
- Flaga2s = 0
- End If
- '****************************************************************
- PWM_rotate = ADC_rotate / 4
- '**************************************************************
- Loop
- End
- '****************************************************************
- 'PODPROGRAM PRZERWAŃ TIMER1
- Przer_timer1:
- Timer1 = 45536 'wstawienie do Timer1 wartości 45536
- Incr Timer_tikx10
- If Timer_tikx10 = 1 Then
- Set Flaga10ms
- End If
- Return
- '****************************************************************
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 'MRUGANIE DIODĄ LED CO 1 SEKUNDĘ
- ' CO BY BYŁO WIDAĆ ŻE UKŁAD ŻYJE
- 'LED BLINKS EVERY 1 SECOND
- ' WHAT WOULD HAVE BEEN SEE THAT THE SYSTEM IS ALIVE
- $nocompile
- Sub Blink_
- Toggle Led_live
- End Sub
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 'odczyt adc 0
- $nocompile
- Sub Read_adc
- ADC_rotate = Getadc(0)
- End Sub
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 'sub rotate left
- $nocompile
- Sub Rotate_left
- Start Timer2
- Pwm2b = PWM_rotate
- Portb.3 = 0
- Print "LEWO"
- End Sub
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 'sub rotate right
- $nocompile
- Sub Rotate_right
- Start Timer2
- Pwm2b = PWM_rotate
- portb.3 = 1
- Print "PRAWO"
- End Sub
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 'sub rotate stop
- $nocompile
- Sub Rotate_stop
- Stop timer2
- pwm2b = 0
- Print "STOP"
- End Sub
pozdrawiam Jacek.
P.S. znalazłem na YT Twój film jak sterujesz prędkością silnika https://www.youtube.com/watch?v=qEuld7CcZys