Hey mede onliners,
Ik ben al een heel tijdje bezig met een project om een servo signaal te ontvangen met een PIC en vervolgens een H-brug aan te sturen om zo een motor aan te sturen.

Hieronder mijn eerdere post
http://www.circuitsonline.net/forum/view/68526

Nu heb ik de bron code inmiddels helemaal veranderd en nu heb een bron code (in PICBASIC) die perfect de servo signalen ontvangt en deze omzet naar 2 PWM signalen. namelijk vooruit en achteruit.

Deze signalen hang ik aan een L298.

Nu komt ie.....

Op de ingang van mijn L298 meet ik (met scoop) een perfect PWM signaal. het signaal reageerd perfect op de joystick van mijn zender.
echter op de uitgang van de L298 meet ik alleen maar rommel van ongeveer 25mV.
Natuurlijk zitten er 100nF condensators over de VS en de VSS.
De sense hangt aan massa en de enable aan de VSS.
ik gebruik alleen de eerste 2 ingangen en uitgangen.
in en uit 3&4 worden niet gebruikt vooralsnog.

Heeft iemand enig idee waardoor dit niet naar behoren werkt??

gr

als je op beide ingangen een pwm signaal aanbied, is de kans groot dat biede ingangen tegelijk de zelfde nivo waarde hebben.
dus biede hoog of laag.
in de datasheet staat (op pagina 6) dat de motor dan stopt.

als je de motor met pwm wilt regelen moet je pwm op de enable aanbieden.
want met de ingangen regel je allen richting, linksom of rechtsom.

Okey,

Ik bied via mijn Pic 2 HPWM signalen aan, maar niet te gelijkertijd.
Als ccp1 PWM signalen zend is CCP2 laag pwm=0
Als ccp2 pwm signalen zend is CCP1 laag pwm=0

Dus ik bied nooit 2 pwm signalen tegelijk aan.

Ook als ik een van de PWM signalen aanbied op de enable en op de in 1 of 2 5 volt zet, gebeurt er nogsteeds niet, al meet ik minder rommel.

ik heb de datasheet al zo vaak doorgelezen. waarschijnlijk zie ik iets over het hoofd...

als je op de 1 pwm aanbied maak je 2 dan laag en andersom?
je hebt ook de de Vs aangesloten op een voeding?
welke behuizing heb je?

[Bericht gewijzigd door jj op (23%)]

Als ik op de 1 pwm aanbied bied ik op de ander geen PWM aan.
Het is zo geprogrammeerd (basic)

Rechtsom:
HPwm 1 , 0, 2000
HPWM 2, servot, 2000

linksom:
HPWM 1, servot, 2000
hpwm 2 , 0, 2000

Hierdoor staat op 1 uitgang PWM op de ander niet.

VS en de VSS zijn beide aangesloten

Behuizing is MULTIWATT 15

ik heb nog een experiment uitgevoerd waar ik op de enable 1 van de 2 pwm invoerde en de in 1 aan de 5v hing en de in2 aan de massa.
Nogsteeds geen resultaat. alleen maar rommel op de uitgang.

verder heb ik alles nog eens van mijn breadbord afgerukt en alles opnieuw opgebouwd.

Alles 2x gecontroleerd zodat ik zeker weet dat ik nergens een kabelfout heb zitten.

Ook met de scoop nog eens alle pinnen van de L298 nagelopen.
Alles klopt, VS en de VSS, de GND is ok, op de in1of2 staat een mooie PWM de enable is hoog...

Ik begin er gek van de te worden.

Ik heb zo ook gebruikt voor een project. Had constant miserie, heb zo dan maar buiten gesmeten en zelf h-brug gebouwd. Veel beter

[edit]
hoeveel heb je er liggen? Bij een kabelfout kan hij al "fride" zijn. Dus als je kan nieuwe nemen. enable (6) en in1 (5) aan 5V, in2 (7) aan gnd, stroom sense (1) aan GND, GND en Vs en Vss ook goed verbinden en dan kijken op output (2 en 3). Als dat lukt proberen met PWM. Je bouwt beter langzaam op, dan vind je rapper je fout

en de gnd van de vs en de vss is het zelfde,
zitten dus aan elkaar?

Heb je de Current Sense A en B aangesloten aan de GND. Zonder deze doet de L298 niks.

EDIT: Current Sense A heb je al gedaan, sluit B ook maar kort naar GND.

Als dit niet werkt denk ik dat er iets is met je verbinding naar de massa toe. Controleer of de massa overal hetzelfde is zoals al een keer aangehaald is. Doe ook eens een weerstandmeting over de draad die de sense aan de massa legt.

[Bericht gewijzigd door Stefanh001 op (17%)]

Misschien heb je hier iets aan.

http://www.uploadarchief.net/files/download/resized/pic%20-%20met%20-%20l298.jpg

Ik doe het ook met twee pwm signalen, maar dan geinverteerd van elkaar. Vrijgave op enable_A en enable_B, en de pwm signalen op in_1,in_4 en in_2 en in_3. Zoals je op het schema kan zien staan de bruggen paralel voor meer stroom.

Hier onder nog een stukje code, zo lees ik de modelbouw ontvanger in.


; Uitleg werking programma: Eerst wordt de puls waarde gemeten.
; Dit wordt gedaan met puls in test ( dit is een ander programma ).
; De waarde van de ontvanger wordt gemeten en op een display gezet.
; Waarde van de zender stuurknuppel in de bovenste, middelste en onderste stand.
; Hoogste , midelste en laagste waarde Bvb: Ho = 457 Mi = 353 La = 243.
; Daarna wordt met een formule de pwm waarde berekend.
; We gaan uit van de kleinst gemeten waarde La = 243.
; De formule die we gebruiken is (var1-243)x1.21.
; var1 is een variabele waar de waarden Ho, Mi en La ingezet worden.
; We moeten een pwm waarde gaan maken die van 0 t/m 255 loopt.
; We rekenen met de laagste waarde en trekken die van elkaar af. 
; Als var1 = 243 - 243 = 0 x 1.21 = 0 ( laagste pwm waarde ).
; Als var1 = 353 - 243 = 110 x 1.16 = 127.6 ( middelste pwm waarde ).
; Als var1 = 457 - 243 = 214 x 1.21 = 258.94 ( hoogste waarde ).
; De pwm waarde mag niet boven de 255 uitkomen.
; Dit doen we met als waarde > 254 dan waarde = 255.
; De pwm waarde mag ook niet onder de 0 komen.
; Dit doen we met als waarde < 0 dan waarde = 0.
; De waarde 1.21 kan varieren dat licht aan de gemeten puls waarde. 
; Door het pwm 2 signaal te inveteren tov pwm 1 kan je de motor links en rechts.
; laten draaien en het toerental regelen.
; De twee signalen worden nu gemixst in de eindtrap.
; Hier onder het programma. 

Device 16F877                                  ; processor type

XTAL 10                                        ; cristal 10Mhz

Config HS_OSC,_                                ; cristal groter dan 4MHz
       WDT_OFF,_                               ; Watchdog Timer Enable uit
       PWRTE_ON,_                              ; Power-up Timer Enable aan
       BODEN_OFF,_                             ; Brown-out Reset Enable uit
       LVP_OFF,_                               ; Low Voltage Programming uit
       CPD_OFF,_                               ; Memory Code Protection uit
       WRTE_ON,_                               ; Program Memory Write Enable aan
       DEBUG_ON,_                              ; In-Circuit Debugger Mode aan
       CP_OFF                                  ; Code Protection uit

ALL_DIGITAL true                               ; alle poorten digitaal

Declare CCP1_PIN PORTC.2                       ; pwm 1 op poort C.2
Declare CCP2_PIN PORTC.1                       ; pwm 2 op poort C.1

Symbol On = 1                                  ; 1 is hoog
Symbol off = 0                                 ; 0 is laag

Symbol vrijgave       = PORTC.0                ; vrijgave op poort C.0
Symbol schak_1        = PORTB.1                ; standby op poort B.1
Symbol controle_led   = PORTB.2                ; led op poort B.2
Symbol reset_failsave = PORTB.3                ; reset failsafe op poort A.0

Symbol frequentie     = 12000                  ; keuze pwm frequentie

Dim var1 As Word                               ; variabele var1
Dim waarde As DWord                            ; variabele waarde

Clear                                          ; wis geheugen 
                                   
DelayMS 2000                                   ; wacht 2 seconden

Cls                                            ; wis display

        ;543210                                ; hulpregel poort B
PORTB = %000000                                ; poort B is laag
TRISB = %000111                                ; poort B.0,B.1,B.3 als ingang
                                               ; poort B.2 als uitgang
        ;76543210                              ; hulpregel poort C
PORTC = %00000000                              ; poort C is laag
TRISC = %00000000                              ; poort C als uitgang

start:                                         ; begin start
    vrijgave = off                             ; vrijgave uit
    var1 = PulsIn PORTB.0 , 1                  ; lees puls en zet in variabele
    waarde = (var1-243)*1.16                   ; formule naar pwm waarde
    If waarde > 124 Then                       ; als waar dan
    If waarde < 130 Then                       ; als waar dan
    controle_led = On                          ; led aan
    Else controle_led = off                    ; led uit
    If var1 < 1 Then GoTo failsave             ; als waar dan
    If var1 > 1000 Then GoTo failsave          ; als waar dan
    EndIf                                      ; einde als
    EndIf                                      ; einde als
    If waarde > 137 Then GoTo rechts_om        ; als waar dan
    If waarde < 117 Then GoTo links_om         ; als waar dan
    If schak_1 = off Then GoTo standby         ; als waar dan
    If var1 < 1 Then GoTo failsave             ; als waar dan
    If var1 > 1000 Then GoTo failsave          ; als waar dan
GoTo start                                     ; naar begin start
    
rechts_om:                                     ; begin rechts om
    If schak_1 = off Then GoTo standby         ; als waar dan
    vrijgave = On                              ; vrijgave aan
    var1 = PulsIn PORTB.0 , 1                  ; lees puls en zet in variabele
    waarde = (var1-243)*1.21                   ; formule naar pwm waarde
    If waarde > 254 Then waarde = 255          ; als waar dan
    HPWM 1 , waarde , frequentie               ; pwm 1 uitgang 0 t/m 255 , 8Khz
    HPWM 2 , ~ waarde , frequentie             ; pwm 2 uitgang 0 t/m 255 , 8Khz
    If var1 < 1 Then GoTo failsave             ; als waar dan
    If var1 > 1000 Then GoTo failsave          ; als waar dan
    If waarde = 255 Then                       ; als waar dan
    controle_led = On                          ; stuurknuppel bovein led aan
    Else controle_led = off                    ; anders led uit
    EndIf                                      ; einde als
    If waarde < 138 Then GoTo start            ; als waar dan
    If var1 < 1 Then GoTo failsave             ; als waar dan
    If var1 > 1000 Then GoTo failsave          ; als waar dan
GoTo rechts_om                                 ; naar begin rechts om

links_om:                                      ; begin links om
    If schak_1 = off Then GoTo standby         ; als waar dan
    vrijgave = On                              ; vrijgave aan
    var1 = PulsIn PORTB.0 , 1                  ; lees puls en zet in variabele
    waarde = (var1-243)*1.21                   ; formule naar pwm waarde 
    If waarde < 0 Then waarde = 0              ; als waar dan
    HPWM 1 , waarde , frequentie               ; pwm 1 uitgang 0 t/m 255 , 8Khz
    HPWM 2 , ~ waarde , frequentie             ; pwm 2 uitgang 0 t/m 255 , 8Khz
    If var1 < 1 Then GoTo failsave             ; als waar dan
    If var1 > 1000 Then GoTo failsave          ; als waar dan
    If waarde = 0 Then                         ; als waar dan
    controle_led = On                          ; stuurknuppel onderin led aan
    Else controle_led = off                    ; anders led uit
    EndIf                                      ; einde als
    If waarde > 116 Then GoTo start            ; als waar dan
    If var1 < 1 Then GoTo failsave             ; als waar dan
    If var1 > 1000 Then GoTo failsave          ; als waar dan
GoTo links_om                                  ; naar begin links om

standby:                                       ; begin wacht
    vrijgave = off                             ; vrijgave uit
    HPWM 1,0,0                                 ; pwm 1 uit
    HPWM 2,0,0                                 ; pwm 2 uit
    controle_led = On                          ; led aan
    DelayMS 300                                ; pauze
    controle_led = off                         ; led uit
    DelayMS 300                                ; pauze
    If schak_1 = On Then GoTo start            ; als waar dan
GoTo standby                                   ; naar begin wacht

failsave:                                      ; begin failsave
    vrijgave = off                             ; vrijgave uit
    HPWM 1,0,0                                 ; pwm 1 uit
    HPWM 2,0,0                                 ; pwm 2 uit
    controle_led = On                          ; led aan
    DelayMS 50                                 ; pauze
    controle_led = off                         ; led uit
    DelayMS 50                                 ; pauze
    If reset_failsave = On Then GoTo start     ; als waar dan
GoTo failsave                                  ; naar begin failsave
      
End                                            ; einde programma

Ik heb zo ook gebruikt voor een project. Had constant miserie, heb zo dan maar buiten gesmeten en zelf h-brug gebouwd. Veel beter

[edit]
hoeveel heb je er liggen? Bij een kabelfout kan hij al "fride" zijn. Dus als je kan nieuwe nemen. enable (6) en in1 (5) aan 5V, in2 (7) aan gnd, stroom sense (1) aan GND, GND en Vs en Vss ook goed verbinden en dan kijken op output (2 en 3). Als dat lukt proberen met PWM. Je bouwt beter langzaam op, dan vind je rapper je fout

Omdat ik zelf ook twijfelde heb ik het ook al eens geprobeert zonder PWM, dan werkt het.
haal de ingangen los en werp ik PWM erop gaat het fout.

Toch zal ik voor alle zekerheid vanavond nog een alles loswerpen en opnieuw beginnen.

Heb je de Current Sense A en B aangesloten aan de GND. Zonder deze doet de L298 niks.

EDIT: Current Sense A heb je al gedaan, sluit B ook maar kort naar GND.

Als dit niet werkt denk ik dat er iets is met je verbinding naar de massa toe. Controleer of de massa overal hetzelfde is zoals al een keer aangehaald is. Doe ook eens een weerstandmeting over de draad die de sense aan de massa legt.

Nee, ik heb eerst de brug mono geprobeert (alleen 1 en 2 gebruiken)
ik zal wel eens proberen de bruggen parallel te zetten.

Misschien heb je hier iets aan.

Thanks. dat is inderdaad wel handig.
Ik heb het programma iets anders opgebouwd.
Ik zie wel een aantal dngen zoals de failsave die ik toch even van je stelen. ;)

wil ik alleen graag nog weten waarom je de PWM signalen geinverteerd hebt ten opzichte van elkaar?

@ Mad Nick: omdat dat moet: die L298 werkt in een soort push-pull achtige configuratie: als de ene ingang hoog is moet de andere laag zijn. Dat is je al eens verteld, en staat dacht ik ook vrij duidelijk in het datablad. PWM bied je NIET op de Enable aan, maar op de ingangen: de Enable is letterlijk bedoeld voor wat de naam zegt.

@weardguy: daar ben ik het niet met je eens. Ik gebruikte de enable voor de PWM en op de Inputs had ik 2 "gewone" digitale outs. Zo kon ik met PWM de snelheid regelen en met de IN de richting. (dit werkte hoor). Ik had vooral problemen denk ik omdat ik meerdere IC's met elkaar koppelde en op dezelfde koelplaat monteerde (normaal mag het want de tab is GND).

En je moet inderdaad de ene hoog andere laag, probeer eens met de ene IN aan de GND en de andere aan een PWM kanaal. de enable aan de logische voeding.

@ Pipsie: het zal vast werken, maar zeker in dit geval snap ik niet waarom mensen het datablad, waar een prachtig aansluitvoorbeeld met signaal-beelden instaat, dan niet even volgen: in het datablad staat heel duidelijk dat de ene ingang hoog is, en dat de andere op dat moment laag is.

Hoewel het dus wel zal werken is het niet netjes: de Enable is bedoeld om de brug volledig buiten werking te zetten of volledig in te schakelen, onafhankelijk van wat het geheel op zijn ingangen te zien krijgt.

Het hoeft niet met twee signalen. Maar met twee pwm signalen geinverteerd van elkaar werkt het beter.

Ik doe dit ook omdat ik de regelaars ook gebruik met een potmeter, met de potmeter in het midden staat de motor stil, verdraai ik hem nu naar links of rechts dan veranderd de richting en het toerental van de motor, het zelfde gebeurd met de stuurknuppel van de zender.

Even een vraag, met welke frequentie stuur je de L298 aan. Die frequentie is beperkt hé, weet niet meer presies maar dacht van 8KHz max.

8kHz??? voor een brug die PWM ondersteund? Lijkt me weinig (kan wel mijn probleem geweest zijn, ik werkte op 15kHz)

[edit]
even opgezocht: Commutation Frequency IL = 2A: 25 kHz type en 40khZ max

[Bericht gewijzigd door pipsie op (27%)]

Oke, dan ben ik in de war met iets anders denk.

Ik stuur die brug aan met 1Khz. vrij normaal, moet eigenlijk met elke brug wel werken.

@weardguy:
Ik begrijp dat het ene signaal laag moet zijn.
Maar zoals in mijn eerdere post al gezegd is:

Rechtsom:
HPwm 1 , 0, 2000
HPWM 2, servot, 2000

linksom:
HPWM 1, servot, 2000
hpwm 2 , 0, 2000

als ik de HPWM op 0 zet is ie naar mijn mening laag.
Als ik hem inverteer is ie zekerweten laag, alleen wilde ik graag weten waarom lambiek dit zo deed.

Alvast bedankt voor de reactie's.
Ik ga even wat pielen.

ik houd jullie op de hoogte.

Geinverteerd van elkaar betekend niet dat er een hoog is en een laag, alleen als de waarde van bv pwm1 255 is dan is de waarde van pwm2 0, de rest van de waardes lopen in elkaar over. En in de middenstand dus pwm waarde +/- 127, dan is pwm1 en pwm2 praktisch gelijk. Vandaar dat de motor in de middenstand stil staat.

HET WERKT!!!!

heel erg bedankt voor jullie hulp

@lambiek
bedankt voor het schema.
nadat ik het volgens dit schema heb gebouwd, werkt het perfect.

Wel heb nog 1 vraag over een getal in picbasic.
wanneer je in picbasic een som laat uitrekenen en de uitkomst bevat een een getal achter de komma, rond de pic dit zelf af.
hoe kan ik bepalen naar welke kant dit wordt afgerond?

mogen we ook weten waar je fout zat?

Nou dat is mooi. :)

Wat betreft het afronden, volgens mij is bv 15.2 = 15 en 15.6 wordt 16. Dacht niet dat je dat zelf aan kon passen, maar helemaal zeker ben ik niet dus knoop me er niet aan op.

Wat ben je trouwens aan het maken.

@pipsie
Ik kan het je niet met zekerheid zeggen.
Ik vermoed dat ik ergens een aansluitfout heb gemaakt, omdat
het alleen maar 1 brug gebruikte. dus had ik alleen de ENable A, de IN1 en IN2 en OUT1 &OUT2 aangesloten.

Ik heb mijn breadbord leeg getrokken en opnieuw opgebouwd volgens het schema van LAMBIEK.
Daarna werkte het ineens.

@Lambiek
Ik heb een Grote Stoomlocomotief op LGB formaat die op echt stoom werkt.
Deze moet ik ook zelf "stoken". na het opdruk komen van de stoom bedien ik hem met een RC afstandbediening. deze regelt de Regulator, de rem de fluit enz.
Aangezien deze over een baan heen rijdt door mijn tuin met flink wat wagons kan het natuurlijk zijn dat hij achter in de tuin stopt omdat de stoomdruk te laag wordt.
Dan komt mijn andere LGB Locomotief in actie.deze moet de stoomloc dan opslepen tot bij mij stoel (lui he ;) )
Deze rijdt normaal op baanspanning, maar omdat mijn baan spanningsloos is (normaal rijdt alleen die stoomloc erop) moet ik de motor van de andere LOC met een batterij voeden, en dus aansturen via de zelfde RC afstandbediening (2 frequentie bediening) van mijn stoomloc.

vandaar deze aansturing...

zodra ik alles aan het lopen heb zoals het hoort zal ik de code en het schema posten.
Ik zal ook wat foto en misschien een filmpie posten.

De vraag met het afronden stel ik omdat mijn PIC zelf een waarde uitrekend voor het berekenen van de PWM aan de hand van de PULSIN.
Maar meestal zit de uitkomst op ongeveer 6.4** hierdoor rond het IC het af op 6, maar dan krijg ik onmogelijk een waarde van 255.
meestal blijf ik hangen op 230 tot 240.
En om nu in de software aan te geven dat alles boven de 230 naar 255 moet worden gezet is wel erg grof.
Dan ga ik ineens van een aardige snelheid naar VOL vermogen.
Daarom wil ik aangeven dat alles naar boven moet worden afgerond.

In ieder geval nogmaals bedankt

hoe rap gaat die pulsin. krijg je 0 tot 6 pulsen die je omzet naar schaal 0-255? want h-jij doet(var1-243)*1.16. Hoe groot is die var? Anders andere formule maken?

Wat ik altijd doe bij een nieuwe zender ontvanger, is hem uitlezen en daarna de waarde in het programma berekenen. Hier onder het schema.

http://www.uploadarchief.net/files/download/resized/uitlezing%20-%20ontvanger.jpg

En hier het programma voor de pic.



Device 16F628A                         ; processor type

Config WDT_OFF,_                       ; WatchDog Timer uit
       PWRTE_ON,_                      ; Power-up Timer Enable aan
       LVP_OFF,_                       ; Low Voltage Programming uit
       MCLRE_OFF,_                     ; Externe Master Reset Enable uit
       HS_OSC                          ; cristal groter dan 4 Mhz
       
XTAL = 10                              ; cristal 10 Mhz
          
ALL_DIGITAL true                       ; alle poorten digitaal

Declare LCD_ENPIN PORTB.2              ; enable display poort B.2
Declare LCD_RSPIN PORTB.3              ; reset display poort B.3
                                       ; data display poort B.4 t/m B.7

Symbol On = 1                          ; 1 is hoog
Symbol off = 0                         ; 0 is laag

Dim var1 As Word                       ; variabele var1
Dim waarde As Word                     ; variabele waarde

Clear                                  ; wis geheugen 
                                   
DelayMS 2000                           ; wacht 2 seconden

Cls                                    ; wis display

;poortb  543210                        ; hulpregel poort B
TRISB = %000001                        ; ontvanger op poort B.0

test:                                  ; begin test
    waarde = var1                      ; variabele is waarde
    var1 = PulsIn PORTB.0,1            ; lees puls en zet in variabele
    Print At 1,3,"WAARDE_ONTVANGER"    ; zet text op display
    Print At 2,9,Dec waarde,"  "       ; zet waarde op display
GoTo test                              ; naar begin test
      
End                                    ; einde programma

Edit:
Oja: bijna vergeten, let er wel op dat als je met een kristal van bv 10Mhz meet dat je die waarde ook in je besturings programma gebruikt.

Zie vorige programma, modelbouwregelaar, daar staat het beschreven hoe je de formule toepast.

Ik gebruik een andere manier van meten.

iedere keer als ik opstart meet ik de de maximale puls lengte (joystick in bovenste stand) en de minimale puls (joystick in onderste stand) en reken dan mijn midden uit.

max - min / 2 + min = midden.

vervolgens meet ik de deler uit.

255 / (midden - min)= deler

iedere puls die ik nu meet laat ik nu zelf rekenen.

dus mijn min = 300 max = 400 midden = 350

gemeten puls is bv 325
325-300= 25 * deler = PWM

alleen wanneer mijn deler bv 6.45 is komt de deler op 6 te staan.
en dan kom ik dus niet meer aan 255 maar bv max aan 233.

vandaar de vraag.