Sida 1 av 1
PIC16F690 Full-Bridge PWM
Postat: 11 september 2010, 17:49:31
av Klas-Kenny
Jag har suttit bra länge nu och försökt få en PIC att styra en H-brygga, men jag lyckas inte få igång PWM.
Har kollat väldigt mycket i databladet och jag tycker jag följt det bra och men får det ändå inte till att fungera.
Har även googlat väldigt mycket, och vad jag hittat är antingen kod i C, eller enbart för "single".
Har ingen kod att visa då jag testat oändligt många saker, men inget har fungerat, och nu är allt raderat
Så vad jag söker är Assembly-kod för att köra Full-bridge PWM som jag kan studera för att förstå hur man ska göra, tycker det är lättare med praktiska exempel än så som det är beskrivet i databladet.
Någon som har kod eller någon bra länk på lager?

Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 01:09:38
av sodjan
> Så vad jag söker är Assembly-kod för att köra Full-bridge PWM
Alltså "fyr-fas" för direkt styrning av en 4-ingångars H-brygga ?
Så vitt jag vet (eller i alla fall förstår) så är det enbart PIC'arna med
"motor-control" som har det. Vad är det igentligen du vill att din 16F690
ska göra ? Kan du beskriva vad du vill att PWM utgångarna ska göra ?
Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 11:09:35
av bearing
Hittade den här:
http://www.ermicro.com/blog/?p=706
Koden är i C, men borde vara enkel att skriva i assembler. H-bryggan är av simpel sort, uppbyggd med bipolära transistorer som drivs med 5V. Ifall en du ämnar styra en H-brygga med MOSFET-transistorer, behöver transistorerna styras med dödtid, vilket den här koden inte ger. Däremot finns MOSFET-drivkretsar för halvbrygga med inbyggd dödtid, som gör att den här koden kan användas.
Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 11:13:03
av victor_passe
Det finns en del i databladet där det står punkt för punkt hur du ska få igång full-bridge PWM.
Jag skrev kod för exakt det i förrgår, om du mot förmodan inte hittar den sektionen själv kan jag skicka lite kod(koden ligger på annan plats, annars skulle jag skriva koden med en gång.)
Edit: sektion 11.3.7 är det du ska leta efter.
Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 12:39:07
av sodjan
OK. Backar lite där, 16F690 har ju full bridge-mode med 4 utgångar, "11.4.2 FULL-BRIDGE MODE".
Ja men då så, vad är problemet nu igen ? Det verkar ju som att allt finns i databladet...
Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 16:41:46
av Klas-Kenny
Som jag skrev i mitt första inlägg har jag kollat i databladet, just i den sektionen som handlar om detta och jag har skrivit kod efter vad som står där, men antagligen är det något jag missuppfattar, där av denna tråd.
bearing: Varit inne på den sidan tidigare, men hänger inte med i koden som är i C
victor_passe: Din kod skulle uppskattas enormt
Som sagt, jag är inte ute efter att någon ska göra jobbet åt mig och skriva min kod åt mig, dock vill jag ha kod att studera och se hur man gör för att få igång detta då jag (tydligen..) missuppfattar något i databladet.
Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 17:00:18
av sodjan
> ...dock vill jag ha kod att studera...
Nej, du har missförstått det hela, det är *vi* som vill ha *din* kod.
> ...och jag har skrivit kod efter vad som står där,
Visa den då.
> men hänger inte med i koden som är i C
Vad är det som är svårt att förstå med t.ex :
Det är i princip detsamma som
Kod: Markera allt
banksel CCP1CON
movlw b'01001100'
movwf CCP1CON
Och resten av koden var ju väldigt lättläst, det är i princip bara
lite if-then-else satser med direkta uppdateringar av register.
Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 17:22:02
av Klas-Kenny
Sodjan:
Från första inlägget:
Klas-Kenny skrev:Har ingen kod att visa då jag testat oändligt många saker, men inget har fungerat, och nu är allt raderat
Jag kollade lite extra på den koden i hopp om att förstå den, dock hittade jag
/* Init PWM for Single Output */
Alltså, den där koden använder tydligen inte full bridge-mode utan single, och då jag inte vet exakt vad som skiljer i användandet av single och full bridge kan jag inte använda den där.
Alltså, jag vet ju vad som skiljer i vad PIC'en ger ut i single och full bridge, men just hur man får den att ge ut rätt saker vet jag ej hur man gör i full bridge, det är där problemet är.
Edit: Scrollade ner längre nu, där va visst kod för full bridge, ska kolla på den koden nu

Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 17:27:14
av sodjan
> och nu är allt raderat
Ja, det är ju knappast *vårat* problem...
> Scrollade ner längre nu, där va visst kod för full bridge,
Exakt.

Jag tyckte att det var ganska tydligt hur de satte upp det hela.
Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 17:29:38
av Klas-Kenny
Nog är det inte ert problem, men det förändrar inte faktumet att jag vill ha kod att studera
Nåväl, efter ett mål mat skall den koden studeras!
Re: PIC16F690 Full-Bridge PWM
Postat: 12 september 2010, 19:51:32
av Klas-Kenny
Nu fungerar det klockrent, tackar för hjälpen!
Man skulle ju inte göra alls som jag trodde

Re: PIC16F690 Full-Bridge PWM
Postat: 13 september 2010, 00:06:31
av sodjan
Vad var problemet och vad hade du missförstått ?
Re: PIC16F690 Full-Bridge PWM
Postat: 13 september 2010, 00:10:04
av Klas-Kenny
I databladet står det
6. Enable PWM output after a new PWM cycle has
started:
• Wait until Timer2 overflows (TMR2IF bit of
the PIR1 register is set).
• Enable the CCP1 pin output driver by clearing
the associated TRIS bit.
Detta tog jag som att man i "MainLoop" ska kolla om TMR2IF är satt och sedan sätta CCP1 som utgång, och köra om detta hela tiden. Vilket uppenbarligen va käpprätt åt h*****e

Re: PIC16F690 Full-Bridge PWM
Postat: 13 september 2010, 00:27:17
av sodjan
Det där är punkt 6 under "11.3.7 SETUP FOR PWM OPERATION".
Notera *SETUP*. Det står inget om att man ska göra det
mer än *en* gång.
Sen så låter just den där punkten som något för att minska
störningar på PWM pinnen/pinnarna i samband med setup av
modulen, jag tror inte att det är nödvändigt för funktionen att
vänta på TMR2IF så där om en liten "glitch" är OK på utgången.
Å andra sidan, att sätta en pinne till utgång som redan är utgång
kan knappast ha gjort att det inte fungerade alls. Om det inte var
så att Timer2 inte var startad så att TMR2IF aldrig sattes alls...
Aja, det är ju lite svårt att veta nu, och det spelar inte så stor
roll längre kanske...
