PWM för pic 16f690

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Hritz
Inlägg: 5
Blev medlem: 6 april 2012, 11:42:41

PWM för pic 16f690

Inlägg av Hritz »

hej, jag håller på att bygga ir-sändare/mottagare för att kunna styra en "radio"bil men jag har lite problem med att förstå hur man använder pic:ens inbyggda pwm funktion.

jag har kollat igenom pic:ens datablad och fattat att man åtminstånde ska använda sig av följande register:

• PR2
• T2CON
• CCPR1L
• CCP1CON

jag har studerat lite exempel kod(C-kod), men jag känner inte att det direkt är kristallklart.
jag behöver kunna ge spänning av båda polariteter till dc-motorerna och tänkte då använda mig av två utgångar för att göra så till motorn, samt 2 för att kunna svänga åt båda hållen. om jag fattat rätt så ska RC2-RC5 på pic:en stödja pwm funktionerna.

jag har FOSC=8Mhz, samt satt alla C-portar till utgångar. pwm -matningen ska variera beroende på hur många pulser mottagar pic:en har fått från sändaren.

min fråga är följande: vet någon hur man gör detta(om det ens går)? isf vore det jättesnällt om denna kunde skriva lite enkel C-kod samt förklara lite hur man ska tänka med dessa register och ev nya saker som jag ej fått kunskap om.


är jättetacksam för all hjälp jag kan få :!:
Användarvisningsbild
SeniorLemuren
Inlägg: 8432
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: PWM för pic 16f690

Inlägg av SeniorLemuren »

Kolla denna länk.
Utdrag nedan.

Kod: Markera allt

// Code below is for the study of the PIC16F690 PWM output at RC5. 
// Using the Microchip low pin count demonstration board 
// Results observed using a scope at RC5/CCP1 
  
#include <pic.h>            // Include HITECH CC header file 
__CONFIG (INTIO & WDTDIS & PWRTDIS & MCLRDIS & BORDIS & UNPROTECT & IESODIS & FCMDIS ); 
//Internal clock, Watchdog off, MCLR off, Code Unprotected 
//----------------------------------------------------------------------------- 
main() 
{ 
OSCCON = 0b01110111;        // Osc 8 mhz is set or else default is 4 mhz 
PORTC = 0b00000000;          // Clear PortC port 
while(1==1) 
    { 
    TRISC = 0b00100000;        // bit 5 = 1 diables output PORTC TRIS RC5/CCP1 ECCP low 
    CCP1CON = 0b00001100;  // clear bit 5-4 DC1B<1:0> bits  0b00001100 
    PR2 = 0x0f;                       // * * * SET PWM PERIOD (frequency) 
    CCPR1L = 0b11111111;     // * * * Determines PWM duty cycle (pulse width) 
    TMR2IF = 0;                      // bit 1 of PIR1 register, clear interupt flag 
    T2CON = 0b00000100;       // bit 1-0 pre-scaler 1:1 = 00 
                                            // bit 2 = 1 Timer2 ON 
                                            // bit 6-3 post-scaler 1:1 = 0000 
    while (TMR2IF == 0)           // TMR2 = PR2, WAIT for overflow TMR2IF of PIR1 is set flag 
        { 
        } 
    TRISC = 0b00000000;        // WAITING for TMR2 to overflow 
                                            // bit 5 = 0 enable output PORTC TRIS RC5/CCP1 ECCP high 
    } 
} 

Användarvisningsbild
Klas-Kenny
Inlägg: 11843
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: PWM för pic 16f690

Inlägg av Klas-Kenny »

Ett litet tips för att enkelt få fram rätt värden på dessa register är:
http://www.micro-examples.com/public/mi ... lator.html

För att sätta duty-cykle används CCPR1L, du måste alltså inte ändra de andra registerna för att ändra det sedan.
Hritz
Inlägg: 5
Blev medlem: 6 april 2012, 11:42:41

Re: PWM för pic 16f690

Inlägg av Hritz »

tack för era svar :) , jag förstår tyvärr inte allt ändå...., har tagit ut lite saker ur det första svatet som jag fick som jag fortfarande undrar lite kring.

TRISC = 0b00100000; // bit 5 = 1 diables output PORTC TRIS RC5/CCP1 ECCP low
CCP1CON = 0b00001100; // clear bit 5-4 DC1B<1:0> bits 0b00001100

dessa två rader gör mig lite "confused" jag brukar bara använda mig av hexadecimal notation men vf vill man sätta RC5 till en ingång? och varför är TRISC = 0b00100000->bit5; men CCP1CON = 0b00001100 =clear bit 4 - 5?

CCPR1L: bestämmer duty cycle inom en period, men bestämmer man periodtiden med PR2? betyder isf 0xoF ->15Hz?(detta verkar konstigt) eller är det någon klockpuls skala?


CCP1CON = 0b00001100; // clear bit 5-4 DC1B<1:0> bits 0b00001100
TMR2IF = 0; // bit 1 of PIR1 register, clear interupt flag
T2CON = 0b00000100; // bit 1-0 pre-scaler 1:1 = 00
// bit 2 = 1 Timer2 ON
// bit 6-3 post-scaler 1:1 = 0000

jag har även lite frågor om ovanstående rader, vf behöver man "cleara" bit 5-4?
vf behöver jag göra TMR2IF=0?
med pre resp post-scaler syftar man väll på hur många gånger man ska dela ner spänningen som man ska skicka ut?
har jag fel så rätta mig gärna!

jag undrar oxå var någonstans man gör så att pwm signalen verkligen skickas ut?

är tacksam för svar!!!
Användarvisningsbild
swesysmgr
Inlägg: 14956
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: PWM för pic 16f690

Inlägg av swesysmgr »

Prescalern är sätt att dela ner inkommande klocka för PWM-signalen så att du kan ha längre periodtider än vad bitarna i registret räcker till.

Nollar olika flaggor kan man behöva göra för att vara helt säker på att allt skall gå igång, du vet inte om Timer2 interrupt är dragen eller inte när din kod börjar köras.

Detta är inte ett försök att verka otrevlig eller överlägsen men sätt av en timme till att läsa kapitel 11 i databladet två gånger och skriv ner alla flaggor som berör det du vill göra samt hur de skall initialiseras medan du läser. PWM-inställningarna kan vara lite förvirrande men är enkla när man väl förstått.
Användarvisningsbild
Klas-Kenny
Inlägg: 11843
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: PWM för pic 16f690

Inlägg av Klas-Kenny »

Läser man i databladet så rekommenderar de att man börjar med att göra PWM-utgången till ingång medan man gör konfigurationen av PWM'en och gör den till utgång först efter, detta för att undvika "skräp" på utgången innan man fått PWM'en korrekt konfigurerad. Spelar det ingen roll om man har något på utgången först så kan man hoppa över det.

Jag förstår inte riktigt hur du menar men alltså, de sätter (1) ju bit 5 i TRISC i och med att den 5e biten (bitarnas "nummer" går 76543210), och de rensar (0) bit 4 och 5 i CCP1CON.

Du behöver rensa CCP1CON4:5 för att det är de lägsta bitarna (det är 10bitars PWM på PIC16F690) av Duty-Cykle. Detta för att den inte ska ge något på utgången när du inte vill, till en början.

TMR2IF är en bit om du inte förstått det. Den ska helt enkelt sättas till 0 när man kör igång PWM'en, detta enligt databladet om du läser kring PWM.

Nästa fick du svar av swesysmgr.

När du initierat hela PWM-modulen (med dessa fyra register) så skickas signalen automatiskt ur CCP1-pinnen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PWM för pic 16f690

Inlägg av sodjan »

Det är en del oklarheter i ditt förstainlägg.

> jag behöver kunna ge spänning av båda polariteter till dc-motorerna
> och tänkte då använda mig av två utgångar för att göra så till motorn

Menar du något slags fram/back funktion? Som samtidigt ska vara PWM-styrd?
Hurdå? Genom en H-brygga ? Eller kopplat hurdå?

> pwm -matningen ska variera beroende på hur många pulser mottagar pic:en har fått från sändaren.

Beroende på hur *många* pulser från sändaren ???
Hur menar du där? Ge ett exempel på hur det kan se ut signalmässigt.
Normalt brukar man styra på servosignalens pulslängd. Eller är det inte
en vanlig RC-radiostyrnig? Är det något hemmsnickrat radioprotokoll?

> jag har studerat lite exempel kod(C-kod), men jag känner inte att det direkt är kristallklart.

Helt meningslös uppgift utan länk till den aktuella koden samt konkret uppgift om vad som inte var "kristallklart"!
Men det är sannolikt mycket bättre att läsa "11.3.7 SETUP FOR PWM OPERATION" i databladet.
Där har du en steg-för-steg instruktion som enkelt kan "översättas" till valfritt programmeringsspråk.
Och det är mycket bättre om något är oklart *där* än i någon skum kod som *vi* inte ens har sett. :-)

> jag brukar bara använda mig av hexadecimal notation...

Använd det som är lämpligast! I fallet med register där de olika bitarna har olika funktion
och inte utgör ett "värde" (som t.ex TRISx och CCP1CON) så är det enklare att köra binärt.

> ...notation men vf vill man sätta...

"vf" ?? Återkommer på flera ställen. Vad är det?

> och varför är TRISC = 0b00100000->bit5; men CCP1CON = 0b00001100 =clear bit 4 - 5?

Här hänger jag inte med. Vad menar du är problemet/konflikten mellan det?

> jag undrar oxå var någonstans man gör så att pwm signalen verkligen skickas ut?

Ja, man sätter upp PWM modulen enligt databladet. :-)
Lite oklart vad du syftar på. Varför skulle den inte "skickas ut"?

Sen så använder du ju stor bokstav på många ställen men i början på meningar
så missar ditt tangenbord konsekvent. Lite konstigt.
DavidS
Inlägg: 77
Blev medlem: 26 maj 2008, 14:56:34
Ort: Falun

Re: PWM för pic 16f690

Inlägg av DavidS »

> och varför är TRISC = 0b00100000->bit5; men CCP1CON = 0b00001100 =clear bit 4 - 5?

Här hänger jag inte med. Vad menar du är problemet/konflikten mellan det?
Jag tror att han inte är riktigt med på bit-notation eftersom han verkar föredra hex.

Till OP:
Man räknar bitar från höger och den längst till höger är bit 0.
TRISC = 0b00100000 sätter alltså bit 5 till 1.
CCP1CON = 0b00001100 =clear bit 4 - 5?
Det sätter alltså alla bits till noll förutom bit 3:2 (man skriver bit-serier på det sättet, alltså bit 1:0 är det två sista(LSB, Least Significant Bit(s)). Just i det här fallet verkar bit 5:4 vara de viktiga(har ej läst databladet).

Oftast när man arbetar mot register där varje bit är viktig brukar man sätta bit 5:4 till 0 på det här sättet:
CCP1CON = CCP1CON & 0b11001111 (Eller CCP1CON = CCP1CON & 0xCF)
Hritz
Inlägg: 5
Blev medlem: 6 april 2012, 11:42:41

Re: PWM för pic 16f690

Inlägg av Hritz »

Tack så mycket för hjälpen :) ska försöka reda ut programmeringen idag(som verkar betydligt enklare än innan).

anledningen till att jag vill ha dubbla polariteter på pwm- spänningen är att jag har lärt mig att motorns varvtal är proportionellt mot den pålagda spänningen, och jag vill kunna baka och gasa med bilen.(vf=varför)

jag antar att jag behöver använda mig av "full brygga" för att göra detta.

sändaren skickar ut pulser som sänds via en ir-diod som via en fotodiod och förstärkare tas emot av pic:en som först tar reda på hur många pulser som jag skickade, för att sedan mha (med hjälp av) dessa ska avgöra vilken typ av pwm-signal den ska skicka in till motorerna(duty cycle).

jag antar att det inte är så mycket svårare med "full brygga" konfigurationer om man fattar enkel pwm, men jag kan ha fel.

hursomhelst jag tänker göra ett försök nu, och nästa lovar jag att lägga upp koden om det inte löser sig.....
Användarvisningsbild
Klas-Kenny
Inlägg: 11843
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: PWM för pic 16f690

Inlägg av Klas-Kenny »

"anledningen till att jag vill ha dubbla polariteter på pwm- spänningen är att jag har lärt mig att motorns varvtal är proportionellt mot den pålagda spänningen, och jag vill kunna baka och gasa med bilen."

Jag tror att du missförstått det hela.. :)

PWM fungerar som så att du styr pulslängden, dvs. "medelspänningen". Skickar du alltså 5V i 50% så blir medelvärdet 2,5V, motorn kommer alltså bara gå ungefär hälften så fort.

Anledningen till "full brygga" är att kunna byta rotationsriktning på motorn vilket görs genom att växla polerna. Och man måste inte ha en PIC som har "stöd" för full brygga för att göra just det, PIC16F690 har ju det vilket underlättar om man ska köra det, men det går utmärkt utan också.
Hritz
Inlägg: 5
Blev medlem: 6 april 2012, 11:42:41

Re: PWM för pic 16f690

Inlägg av Hritz »

det var det jag menade, men om jag vill ha olika hastigheter både när man kör framåt samt backar så behöver jag väll använda tex RC2 och RC3 för att kunna bilda medelvärdes spänningar i intervallet [-5,5] (RC3-RC2,eller RC2-RC3)om matningsspänningen är 5 volt? eller finns det något annat sätt?.

en till fråga, i vilka register behöver jag skriva i om jag vill ha ut en enkel pwm- singnal på tex RC2 istället för RC5?

tack på förhand, (anledningen till att jag är så borta är att detta är första gången jag använder mig av denna typ av register programmering)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PWM för pic 16f690

Inlägg av sodjan »

> för att kunna bilda medelvärdes spänningar...

Njae, du justerar ju "duty cycle" på din PWM signal.

> i vilka register behöver jag skriva i om jag vill ha ut en enkel pwm- singnal på tex RC2 istället för RC5?

Varför vill du göra det?
Och varför tror du att det går?

Om det över huvudtaget går, framgår det av PWM delen av databladet. Men efter en snabb
koll så ser det ut som att du alltid får en enkel PWM på CCP1/P1A och det går inte att ändra.

På pinne RC2 ligger P1D vilket enbart används vid ett par varienter av PWM "Enhanced Mode",
men då används även P1A i alla fall. Du kan inte "flytta" P1A till någon annan pinne än RC2.

Hur har du egentligen tänkt att koppla det hela?

Har du läst kapitlen som heter t.ex:
"11.4.2 FULL-BRIDGE MODE"
"11.4.2.1 Direction Change in Full-Bridge Mode"
Skriv svar