2st PWM i PIC18LF2320...
- JimmyAndersson
- Inlägg: 26578
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
2st PWM i PIC18LF2320...
Håller på att programmera för att få 2st olika PWM-utgångar på en PIC18LF2320.
Tänkte kolla en sak för säkerhetskull:
CCP1 (PWM-utgång 1) använder CCP1CON. CCP2 (PWM-utgång 2) använder CCP2CON. Så långt är jag med.
(Det känns visserligen lite bakvänt är att TRISC 2 sätter CCP1 och TRISC 1 sätter CCP2, men det får man leva med...)
När det gäller att sätta olika hastigheter (på PWM'n) är jag inte lika säker:
"Perioden" och "Timer2 Prescale" blir samma för både CCP1 och CCP2 eller? För att få olika hastigheter så använder man alltså bara olika DutyCycle (för CCP1 och CCP2) ? Stämmer detta eller är jag ute och cyklar på hal is?
Tänkte kolla en sak för säkerhetskull:
CCP1 (PWM-utgång 1) använder CCP1CON. CCP2 (PWM-utgång 2) använder CCP2CON. Så långt är jag med.
(Det känns visserligen lite bakvänt är att TRISC 2 sätter CCP1 och TRISC 1 sätter CCP2, men det får man leva med...)
När det gäller att sätta olika hastigheter (på PWM'n) är jag inte lika säker:
"Perioden" och "Timer2 Prescale" blir samma för både CCP1 och CCP2 eller? För att få olika hastigheter så använder man alltså bara olika DutyCycle (för CCP1 och CCP2) ? Stämmer detta eller är jag ute och cyklar på hal is?
> (Det känns visserligen lite bakvänt är att TRISC 2 sätter CCP 1 och TRISC 1 sätter CCP 2 , men det får man leva med...)
Skriv :
BCF TRISC, CCP1
BCF TRISC, CCP2
så behöver du inte reta dig på det...
CCP1 och CCP2 är definierade i INC filen till rätt pinnar.
> "Perioden" och "Timer2 Prescale" blir samma för både CCP1 och CCP2 eller?
Ja, så står det i tabell 15-2 på sidan 134 i databladet.
> För att få olika hastigheter så använder man alltså bara olika DutyCycle (för CCP1 och CCP2) ?
Jag är inte säker på vad du menar med "hastighet". !?
Som databladet sägar, frekvensen är samma för båda PWM modulerna (styrs via TMR2), men duty-cycle varieras individuellt (via CCPRxL/CCPRxH)..
Skriv :
BCF TRISC, CCP1
BCF TRISC, CCP2
så behöver du inte reta dig på det...

CCP1 och CCP2 är definierade i INC filen till rätt pinnar.
> "Perioden" och "Timer2 Prescale" blir samma för både CCP1 och CCP2 eller?
Ja, så står det i tabell 15-2 på sidan 134 i databladet.
> För att få olika hastigheter så använder man alltså bara olika DutyCycle (för CCP1 och CCP2) ?
Jag är inte säker på vad du menar med "hastighet". !?
Som databladet sägar, frekvensen är samma för båda PWM modulerna (styrs via TMR2), men duty-cycle varieras individuellt (via CCPRxL/CCPRxH)..
Jo, kanske det 
Men om vi skall vara lite allvarliga, så är det fullständingt ovidkommande vad som är mer eller mindre troligt, inlägget var otydligt på denna punkt och det bara försvårar att ge ett bra och riktigt svar. Därför min brasklapp om att jag inte visste (och fortfarande inte vet) vad "hastighet" syftade/syftar på...

Men om vi skall vara lite allvarliga, så är det fullständingt ovidkommande vad som är mer eller mindre troligt, inlägget var otydligt på denna punkt och det bara försvårar att ge ett bra och riktigt svar. Därför min brasklapp om att jag inte visste (och fortfarande inte vet) vad "hastighet" syftade/syftar på...
- JimmyAndersson
- Inlägg: 26578
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
>BCF TRISC, CCP1
Assembler?
Men jag förstår hur du menar. Bra idé!
Det var lite otydligt att bara skriva "hastigheten". Det jag menade var helt enkelt förhållandet mellan duty cycle (pulsen) och pausen mellan varje duty cycle. Resultatet av det förhållandet uppfattas ju av t.ex motorn som en hastighet. Ändrar man Duty Cycle eller pausen (som ju är Perioden minus DutyCycle) så ändras ju hastigheten på motorn.
edit: Bäst att tillägga att jag vet att man inte kan ändra själva pausen, den får man "på köpet" när man ställer in DutyCycle och Perioden.
Jag kan ta min test-kod som exempel: Två lysdioder är kopplade till CCP1 respektive CCP2. Två potar kopplade till PIC-kretsen som reglerar hur starkt varje lysdiod ska lysa, (dvs hur "tätt" pulserna ska komma och hur långa de ska vara.)
Då använder alltså de båda CCP-modulerna samma period-längd, men hur lång varje puls (dvs Duty Cycle) ska vara ställs separat för varje CCP-modul.
Oki. Då hade jag alltså förstått databladet.
Jag fick inga fel när jag körde "build", men tyvärr har jag inte haft möjlighet att testa koden eftersom min labbplatta är isärplockad för renovering...
Annars antar jag att koden blir den samma oavsett om jag kopplar in en motor eller apelsin. Resultatet kan däremot variera...
edit: Jag passar på att skicka med en till fråga: Om man vill använda en pin som analog ingång så används ju inte TRIS. Men ändå är det väl en bra idé att sätta den pinnen som ingång med TRIS "just in case" ?
Då får man ju en liten "säkerhet" ifall man kodar fel och försöker skicka ut något på den pinnen som man skickar in en spänning på. Dvs. om man kopplar en utgång från en OP-förstärkare till en "hög" utgång på PIC-kretsen... (PIC-kretsen kanske överlever om man skickar in en signal till en utgång, men det är ju ändå inte så nyttigt.)
...Hoppas du förstår, det är lite knepigt att förklara. Kan lugna eventuella oroliga läsare med att jag aldrig kopplat något fel av den typen, men det skadar inte att koppla och koda "säkert" ändå.
Assembler?

Det var lite otydligt att bara skriva "hastigheten". Det jag menade var helt enkelt förhållandet mellan duty cycle (pulsen) och pausen mellan varje duty cycle. Resultatet av det förhållandet uppfattas ju av t.ex motorn som en hastighet. Ändrar man Duty Cycle eller pausen (som ju är Perioden minus DutyCycle) så ändras ju hastigheten på motorn.
edit: Bäst att tillägga att jag vet att man inte kan ändra själva pausen, den får man "på köpet" när man ställer in DutyCycle och Perioden.
Jag kan ta min test-kod som exempel: Två lysdioder är kopplade till CCP1 respektive CCP2. Två potar kopplade till PIC-kretsen som reglerar hur starkt varje lysdiod ska lysa, (dvs hur "tätt" pulserna ska komma och hur långa de ska vara.)
Då använder alltså de båda CCP-modulerna samma period-längd, men hur lång varje puls (dvs Duty Cycle) ska vara ställs separat för varje CCP-modul.
Oki. Då hade jag alltså förstått databladet.
Jag fick inga fel när jag körde "build", men tyvärr har jag inte haft möjlighet att testa koden eftersom min labbplatta är isärplockad för renovering...
Annars antar jag att koden blir den samma oavsett om jag kopplar in en motor eller apelsin. Resultatet kan däremot variera...

edit: Jag passar på att skicka med en till fråga: Om man vill använda en pin som analog ingång så används ju inte TRIS. Men ändå är det väl en bra idé att sätta den pinnen som ingång med TRIS "just in case" ?
Då får man ju en liten "säkerhet" ifall man kodar fel och försöker skicka ut något på den pinnen som man skickar in en spänning på. Dvs. om man kopplar en utgång från en OP-förstärkare till en "hög" utgång på PIC-kretsen... (PIC-kretsen kanske överlever om man skickar in en signal till en utgång, men det är ju ändå inte så nyttigt.)
...Hoppas du förstår, det är lite knepigt att förklara. Kan lugna eventuella oroliga läsare med att jag aldrig kopplat något fel av den typen, men det skadar inte att koppla och koda "säkert" ändå.
> Resultatet av det förhållandet uppfattas ju av t.ex motorn som en hastighet.
Nja, olika duty cycle uppfattas väll av motorn som olika mängd tillförd elektrisk *effekt*. Detta *kan* sedan ge upphov till olika hastighet, men det beror på mycket annat, t.ex vad motorn är kopplad till.
> Om man vill använda en pin som analog ingång så används ju inte TRIS.
Det står faktiskt i databladet (kap 19.6 på sid 218 i min kopia av DS39599C) att TRIS bitarna för de analoga ingångrna skall vara satta som just ingångar. Om man har TRIS som utgång, så kommer AD omvandlaren bara att "läsa av" nivån på den digitala utgången. Jag har inte provat, men det står så i alla fall...
Nja, olika duty cycle uppfattas väll av motorn som olika mängd tillförd elektrisk *effekt*. Detta *kan* sedan ge upphov till olika hastighet, men det beror på mycket annat, t.ex vad motorn är kopplad till.

> Om man vill använda en pin som analog ingång så används ju inte TRIS.
Det står faktiskt i databladet (kap 19.6 på sid 218 i min kopia av DS39599C) att TRIS bitarna för de analoga ingångrna skall vara satta som just ingångar. Om man har TRIS som utgång, så kommer AD omvandlaren bara att "läsa av" nivån på den digitala utgången. Jag har inte provat, men det står så i alla fall...

- JimmyAndersson
- Inlägg: 26578
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Har testat lite PWM-kod för 18LF2320. Först gjorde jag en kod som skulle tona upp LED1 (kopplad till CCP1) sedan tona ner den och tona upp LED2 (kopplad till CCP2) för att sedan tona ner den och börja om.
LED1 tonade aldrig ner till "nästan helt släckt", den tonade bara mellan "nästan full ljusstyrka" och "full ljusstyrka". LED2 tonade precis som det var tänkt.
Så jag gjorde ett test där både LED1 och LED2 fick CCPRxL-värdet %00000010 och borde därför lysa lika svagt. Resultat: LED1 lyser starkt och LED2 så svagt som den ska med det värdet.
Här är testkoden för "lysa-svagt":
Har jag missat något?
Kretsen fungerar förresten i 40MHz. (Det har varken 18LF1320 eller 18F1320 gjort). Om det beror på själva kretsen eller min renoverade labbplatta vet jag inte ännu. Det får framtida tester utvisa.
LED1 tonade aldrig ner till "nästan helt släckt", den tonade bara mellan "nästan full ljusstyrka" och "full ljusstyrka". LED2 tonade precis som det var tänkt.
Så jag gjorde ett test där både LED1 och LED2 fick CCPRxL-värdet %00000010 och borde därför lysa lika svagt. Resultat: LED1 lyser starkt och LED2 så svagt som den ska med det värdet.
Här är testkoden för "lysa-svagt":
Kod: Markera allt
'CONFIG3H (CCP2MX) i config har satts till ON för att CCP2 ska använda Pin12 på kretsen. I databladet står det att CCP2MX ska vara "cleared" när man vill använda Pin12, men kör jag med CCP2MX satt till OFF så används Pin24.....
'FÖR PWM NR 1 och 2
TRISA = $0 ' Utgångar på A
TRISB = $0 ' Utgångar på B
TRISC.2=0 ' CCP1 är output för PWM1
TRISC.1=0 ' CCP2 är output för PWM2
PORTA = $0 ' Rensa utgångarna på A
PORTB = $0 ' Rensa utgångarna på B
PORTC = $0 ' Rensa utgångarna på C
'FÖR PWM NR 1
CCP1CON.7=0 'Reserved
CCP1CON.6=0 'Reserved
CCP1CON.5=0 'Sista biten (bit 7) i Duty Cycle
CCP1CON.4=0 'Näst sista biten (bit 6) i Duty Cycle
CCP1CON.3=1 'Inställd på PWM-mode
CCP1CON.2=1 'Inställd på PWM-mode
CCP1CON.1=1 'CCP1M1 Utgång active low (enligt "Enhanced PWM)
CCP1CON.0=1 'CCP1M0 Utgång active low (enligt "Enhanced PWM)
CCPR1L =%00000010 'Duty cycle
'FÖR PWM NR 2
CCP2CON.7=0 'Reserved
CCP2CON.6=0 'Reserved
CCP2CON.5=0 'Sista biten (bit 7) i Duty Cycle
CCP2CON.4=0 'Näst sista biten (bit 6) i Duty Cycle
CCP2CON.3=1 'Inställd på PWM-mode
CCP2CON.2=1 'Inställd på PWM-mode
CCP2CON.1=1 'CCP1M1 Utgång active low (enligt "Enhanced PWM)
CCP2CON.0=1 'CCP1M0 Utgång active low (enligt "Enhanced PWM)
CCPR2L =%00000010 'Duty cycle
'FÖR PWM NR 1 och 2
PR2 = $1F ' Perioden. (Då ska Timer2 Prescaler vara 1 och Max upplösning blir 7 bitar.)
T2CON.1=0 ' Timer2 Prescaler = 1
T2CON.0=0 ' Timer2 Prescaler = 1
T2CON.2=1 ' Stänger på Timer2
Kretsen fungerar förresten i 40MHz. (Det har varken 18LF1320 eller 18F1320 gjort). Om det beror på själva kretsen eller min renoverade labbplatta vet jag inte ännu. Det får framtida tester utvisa.
- JimmyAndersson
- Inlägg: 26578
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
> CCP1CON's bit 1 och 0,
De är markerade med "x", alltså "don't care" när man kör CCP'n i PWM mode.
> Du (eller någon annan) råkar inte ha tid/lust/ork att testa, om jag mailar en hex-fil ?
Skall jag testa så gör jag det med min egen källkod.
Hur som helst, det blir i alla fall inte denna vecka, jag måste jobba lite för de som betalar min lön också...
De är markerade med "x", alltså "don't care" när man kör CCP'n i PWM mode.
> Du (eller någon annan) råkar inte ha tid/lust/ork att testa, om jag mailar en hex-fil ?
Skall jag testa så gör jag det med min egen källkod.
Hur som helst, det blir i alla fall inte denna vecka, jag måste jobba lite för de som betalar min lön också...
- JimmyAndersson
- Inlägg: 26578
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt: