Strona 1 z 1

DRV8874

: 13 mar 2023, 21:33
autor: Jacek
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.

Re: DRV8874

: 14 mar 2023, 18:08
autor: niveasoft
Chyba nieskomplikowane. Na EN podajesz PWM a na PH 0 albo 1 i to jest lewo prawo.

Re: DRV8874

: 14 mar 2023, 20:25
autor: Jacek
Witam no tak a "PMODE" tak jak jest do masy?
pozdrawiam Jacek.

Re: DRV8874

: 15 mar 2023, 7:36
autor: niveasoft
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.

Re: DRV8874

: 15 mar 2023, 9:29
autor: Jacek
Witam bardzo dziękuje Bartek za odpowiedź spróbuje sterowania w pierwszym modzie.
pozdrawiam Jacek.

Re: DRV8874

: 24 mar 2023, 22:58
autor: Jacek
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.
  1.  
  2. '****************************************************************
  3. $regfile = "m328pdef.dat"
  4. $crystal = 16000000
  5. $hwstack = 64
  6. $swstack = 64
  7. $framesize = 128
  8. $baud = 115200
  9. $eepleave
  10. Config Submode = New
  11. '****************************************************************
  12.     'KONFIGURACJA PORTU COM
  13. Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  14. Config Serialin = Buffered , Size = 128
  15. Config Serialout = Buffered , Size = 128
  16. Enable Serial
  17. '****************************************************************
  18.     'Debug Off
  19. Debug On
  20. '****************************************************************
  21. Config TIMER2 = PWM , Compare_A_Pwm = Clear_up , Compare_B_Pwm = Clear_up , Prescale = 1024       'motor rotation
  22.  '****************************************************************
  23.         'KONFIGURACJA PORTOW
  24. Config Portb.3 = Output : portb.3 = 1                                           'PWM rotation Motor      OC2A
  25. Config portd.3 = Output : portd.3 = 1                                           'PWM rotation Motor     OC2B
  26. Config Portb.5 = Output : Portb.5 = 0                                            'Led Blink
  27. '****************************************************************
  28. Enable Interrupts
  29. Wait 1
  30. '****************************************************************
  31. Do
  32.    Wait 5
  33.    Pwm2a = 50                                                                   'PORTB.3
  34.    Portd.3 = 0
  35.    Toggle Portb.5
  36.    Wait 5
  37.    Pwm2b = 200                                                                  'PORTD.3
  38.    Portb.3 = 0
  39.    Toggle Portb.5
  40. Loop
  41. End
  42. '****************************************************************
  43.  
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.

Re: DRV8874

: 25 mar 2023, 20:02
autor: Jacek
Witam napisałem następny program testowy
  1. '****************************************************************
  2. $regfile = "m328pdef.dat"
  3. $crystal = 16000000
  4. $hwstack = 64
  5. $swstack = 64
  6. $framesize = 128
  7. $baud = 115200
  8. $eepleave
  9. Config Submode = New
  10. '****************************************************************
  11.     'KONFIGURACJA PORTU COM
  12. Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  13. Config Serialin = Buffered , Size = 128
  14. Config Serialout = Buffered , Size = 128
  15. Enable Serial
  16. '****************************************************************
  17.     'Debug Off
  18. Debug On
  19. '****************************************************************
  20. Config TIMER2 = PWM , Compare_A_Pwm = Clear_up , Compare_B_Pwm = Clear_up , Prescale = 1024       'motor rotation
  21.  '****************************************************************
  22.         'KONFIGURACJA PORTOW
  23. Config Portb.3 = Output : portb.3 = 1                                           'PWM rotation Motor      OC2A
  24. Config portd.3 = Output : portd.3 = 1                                           'PWM rotation Motor     OC2B
  25. Config Portb.5 = Output : Portb.5 = 0                                           'Led Blink
  26. '****************************************************************
  27. Enable Interrupts
  28. Portb.3 = 1
  29. Portd.3 = 1
  30. Wait 1
  31. '****************************************************************
  32. Do
  33.   Wait 1
  34.    Pwm2a = 0
  35.    Pwm2b = 0
  36.    Wait 1
  37.    Pwm2b = 0
  38.    Portd.3 = 0
  39.    Pwm2a = 18                                                                   'PORTB.3
  40.    'Portd.3 = 0
  41.    Toggle Portb.5
  42.    Wait 15
  43.    Pwm2a = 0
  44.    Pwm2b = 0
  45.    Wait 1
  46.    pwm2a = 0
  47.    Portb.3 = 0
  48.    Pwm2b = 18                                                                   'PORTD.3
  49.    'Portb.3 = 0
  50.    Toggle Portb.5
  51.    Wait 15
  52. Loop
  53. End
  54. '****************************************************************
  55.  

niestety przy wartościach poniżej 18 dla PWM silnik nie ma siły aby obracać platformą.
pozdrawiam Jacek.

Re: DRV8874

: 25 mar 2023, 20:25
autor: niveasoft
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.

Re: DRV8874

: 26 mar 2023, 12:04
autor: Jacek
Witam musiałem wrócić do tej pierwszej wersji z sygnałem mode podpiętym do masy

program główny
  1.  
  2.     '****************************************************************
  3. $regfile = "m328pdef.dat"
  4. $crystal = 16000000
  5. $hwstack = 64
  6. $swstack = 64
  7. $framesize = 128
  8. $baud = 115200
  9. $eepleave
  10. Config Submode = New
  11. '****************************************************************
  12.     'KONFIGURACJA PORTU COM
  13. Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  14. Config Serialin = Buffered , Size = 128
  15. Config Serialout = Buffered , Size = 128
  16. Enable Serial
  17. '****************************************************************
  18.     'Debug Off
  19. Debug On
  20.  
  21. '****************************************************************
  22. $include "Subs\Blink_.inc"
  23. $include "Subs\Read_adc.inc"
  24. $include "Subs\Rotate_left.inc"
  25. $include "Subs\Rotate_right.inc"
  26. $include "Subs\Rotate_stop.inc"
  27. '****************************************************************
  28.         'KONFIGURACJA TIMER'OW
  29. 'Config Timer0 = Pwm , Compare_A_Pwm = Clear_up , Compare_B_Pwm = Clear_up , Prescale = 1024       'motor travel
  30. Config TIMER2 = Pwm , Compare_B_Pwm = Clear_up , Prescale = 1024                'motor rotation
  31. Config Timer1 = Timer , Prescale = 8
  32. On Timer1 Przer_timer1
  33. 'Start Timer2
  34. Enable Timer1
  35.  '****************************************************************
  36.         'KONFIGURACJA PORTOW
  37. Config Portb.3 = Output : portb.3 = 0                                           'PWM rotation Motor      OC2A
  38. Config portd.3 = Output : portd.3 = 0                                           'PWM rotation Motor     OC2B
  39. Config Portd.6 = Output : portd.6 = 1                                           'PWM  travel Motor      OC0A
  40. Config Portd.5 = Output : portd.5 = 1                                           'PWM  travel Motor      OC0B
  41. Config Portb.5 = Output : Portb.5 = 0                                           'LED_LIVE
  42. Config Portc.2 = Input : pinc.2 = 1                                             'Sw rotate left
  43. Config portc.3 = Input : pinc.3 = 1                                             'Sw rotate right
  44. Config portc.6 = Input : pinb.0 = 1                                             'Sw  travel left
  45. Config portd.7 = Input : pind.7 = 1                                             'Sw travel right
  46. Config Portd.2 = Input : Pind.2 = 1                                             'limit left travel
  47. Config Portd.4 = Input : Pind.4 = 1                                             'limit right travel
  48. '****************************************************************
  49. 'ADC0 poti PWM rotation Motor
  50. 'ADC1 poti PWM travel Motor
  51. Config ADC = Single , Prescaler = Auto , Reference = Avcc
  52. 'Start ADC
  53. '****************************************************************
  54.         'ALIASY PORTOW
  55. PWM_rot_left Alias Portb.3                                                      'PWM  rotation  Motor OC2A
  56. PWM_rot_right Alias Portd.3                                                     'PWM rotation Motor OC2B
  57. PWM_trav_left Alias Portd.6                                                     'PWM  travel Motor    OC0A
  58. PWM_trav_right Alias Portd.5                                                    'PWM  travel Motor OC0B
  59. Led_live Alias Portb.5                                                          'LED shows that the microcontroller did not hang
  60. Sw_rot_left Alias Pinc.2                                                        'Sw rotate left
  61. Sw_rot_right Alias Pinc.3                                                       'Sw rotate right
  62. Sw_trav_left Alias Pinb.0                                                       'Sw travel left
  63. Sw_trav_right Alias Pind.7                                                      'Sw travel right
  64. Limit_left_trv Alias pind.2                                                     'limit left travel
  65. Limit_right_trv Alias pind.4                                                    'limit right travel
  66.     '****************************************************************
  67.         'ZMIENNE   CZASU
  68. Dim Timer_tikx10 As Byte                                                        'variable counting timer overflow
  69. Dim Timertikx100 As Byte
  70. Dim Timertikx200 As Byte
  71. Dim Timer_tik_flag As Byte
  72. Flaga10ms Alias Timer_tik_flag.0
  73. Flaga100ms Alias Timer_tik_flag.1
  74. Flaga500ms Alias Timer_tik_flag.2
  75. Flaga1s Alias Timer_tik_flag.3
  76. Flaga2s Alias Timer_tik_flag.4
  77. Flaga2_5s Alias Timer_tik_flag.5
  78.         'zostaly jeszce trzy wolne flagi
  79.         ' a uzylem tylko jednego bajtu
  80.         ' Paweł - pikczu
  81. Dim Timer0_tik_flag As Byte
  82. Flaga4ms Alias Timer0_tik_flag.6
  83.     '****************************************************************
  84.     'STALE
  85.  
  86.     '****************************************************************
  87.     'ZMIENNE
  88. Dim ADC_Read As Word
  89. Dim Sw_cnt As Byte
  90. Dim Lock As Byte
  91. Dim ADC_rotate As Word
  92. Dim PWM_rotate As Word
  93.     '****************************************************************
  94. Enable Interrupts
  95. '****************************************************************
  96. Waitms 500
  97. Cls
  98. '****************************************************************
  99.     'USTAWIENIA POCZATKOWE   'INITIAL SETTINGS
  100. Stop timer2
  101. 'Portb.3 = 0                                                                     'dla testu
  102. '****************************************************************
  103. Cls
  104. Print "PROGRAM TESTOWY"
  105. Print "NAPĘDU LASERA"
  106. Print "KRZYŻOWEGO"
  107. Waitms 250
  108. '****************************************************************
  109.         'PETLA GLOWNA   'MAIN LOOP
  110. '****************************************************************
  111. Do
  112. '****************************************************************
  113.    If Timer_tikx10 >= 10 Then                                                   'jesli uplynelo 100ms to
  114.       Flaga100ms = 1                                                            'ustaw flage uplynelo 100ms
  115.       Incr Timertikx100
  116.       Timer_tikx10 = 0                                                          ''zeruj liczenie
  117.    End If
  118.    If Timertikx100 >= 10 Then                                                   'jesli uplynela sekunda
  119.       Flaga1s = 1                                                               'ustaw flage sekundy
  120.       Incr Timertikx200
  121.       Timertikx100 = 0                                                          'zeruj liczenie
  122.    End If
  123.    If Timertikx200 >= 2 Then
  124.       Flaga2s = 1
  125.       Timertikx200 = 0
  126.    End If
  127. '****************************************************************
  128.    If Flaga10ms = 1 Then
  129.       If Sw_rot_left = 0 Then
  130.          Call Rotate_left
  131.       End If
  132.       If Sw_rot_right = 0 Then
  133.          Call Rotate_right
  134.       End If
  135.       If Sw_rot_left = 1 And Sw_rot_right = 1 Then
  136.          Call Rotate_stop
  137.       End If
  138.  
  139. '****************************************************************
  140.       Flaga10ms = 0
  141.    End If
  142.  '***************************************************************
  143.    If Flaga100ms = 1 Then                                                       'co 100ms
  144.       Call Read_adc
  145.       Flaga100ms = 0                                                            'wyzeruj Flaga100ms
  146.    End If
  147. '****************************************************************
  148.    If Flaga1s = 1 Then                                                          'co 1 sekundę
  149.       Call Blink_
  150.       Print "ADC_rotate " ; ADC_rotate
  151.       Print "PWM2B " ; PWM2b
  152.       Print "PWM_rotate " ; PWM_rotate
  153.       Print "---------------------------------------"
  154.       If Sw_rot_left = 0 Then
  155.          Print "OBR_LEWO"
  156.       End If
  157.       If Sw_rot_right = 0 Then
  158.          Print "OBR_PRAWO"
  159.       End If
  160.       If Sw_rot_left = 0 And Sw_rot_right = 0 Then
  161.          Print "STOP"
  162.       End If
  163.       Flaga1s = 0
  164.    End If
  165. '****************************************************************
  166.    If Flaga2s = 1 Then                                                          'co2s
  167.       Flaga2s = 0
  168.    End If
  169.     '****************************************************************
  170.    PWM_rotate = ADC_rotate / 4
  171. '**************************************************************
  172. Loop
  173. End
  174.     '****************************************************************
  175.         'PODPROGRAM PRZERWAŃ TIMER1
  176. Przer_timer1:
  177.    Timer1 = 45536                                                               'wstawienie do Timer1 wartości 45536
  178.    Incr Timer_tikx10
  179.    If Timer_tikx10 = 1 Then
  180.       Set Flaga10ms
  181.    End If
  182. Return
  183.     '****************************************************************
  184.  
  185.  
suby
  1.  
  2.        'MRUGANIE DIODĄ LED CO 1 SEKUNDĘ
  3.     ' CO BY BYŁO WIDAĆ ŻE UKŁAD ŻYJE
  4.     'LED BLINKS EVERY 1 SECOND
  5.     ' WHAT WOULD HAVE BEEN SEE THAT THE SYSTEM IS ALIVE
  6. $nocompile
  7. Sub Blink_
  8.    Toggle Led_live
  9. End Sub
  10.  
  1.  
  2. 'odczyt adc 0
  3. $nocompile
  4. Sub Read_adc
  5.    ADC_rotate = Getadc(0)
  6. End Sub
  7.  
  1.  
  2. 'sub rotate left
  3. $nocompile
  4. Sub Rotate_left
  5.    Start Timer2
  6.    Pwm2b = PWM_rotate
  7.   Portb.3 = 0
  8.    Print "LEWO"
  9. End Sub
  10.  
  1.  
  2. 'sub rotate right
  3. $nocompile
  4. Sub Rotate_right
  5.   Start Timer2
  6.    Pwm2b = PWM_rotate
  7.    portb.3 = 1
  8.    Print "PRAWO"
  9. End Sub
  10.  
  1.  
  2.  'sub rotate stop
  3. $nocompile
  4. Sub Rotate_stop
  5.   Stop timer2
  6.    pwm2b = 0
  7.    Print "STOP"
  8. End Sub
  9.  
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