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.
pipsie
Probeert veel + Denkt vaak + Weet weinig = Leert iets
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
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.
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?
weardguy
http://www.m-voorloop.nl --- Ik? Welnee! Ik zit nog lang niet achter de germaniums.
@ 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.
pipsie
Probeert veel + Denkt vaak + Weet weinig = Leert iets
@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.
weardguy
http://www.m-voorloop.nl --- Ik? Welnee! Ik zit nog lang niet achter de germaniums.
@ 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.
pipsie
Probeert veel + Denkt vaak + Weet weinig = Leert iets
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%)]
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, 2000linksom:
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?
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
pipsie
Probeert veel + Denkt vaak + Weet weinig = Leert iets
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.
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.

