Fyrkantsvåg med Picbasic

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
xl15
Inlägg: 73
Blev medlem: 14 december 2006, 16:02:37
Ort: Lund
Kontakt:

Fyrkantsvåg med Picbasic

Inlägg av xl15 »

Jag skulle behöva en justerbar fyrkantsvåg från en 16F628. Tittade på exemplet nedan, men den ger på tok för hög frekvens. Jag har ändrat PR2 = xx men kommer inte lägre än 3-4 kHz. Annars är det perfekt att ha en fyrkantsvåg liggande i bakgrunden eftersom den ska gå hela tiden men ändras pga andra händelser. Jag skulle behöva kunna justera frekvensen mellan kanske 100 och 1000 Hz.
Några idéer?

PicBasic Pro Code:

' Setting up hardware PWM for 38KHz operation.


DEFINE LOADER_USED 1'Setup for boot-loader programming

TRISC.2 = 0 ' CCP1 (PortC.2 = Output)
PR2 = 25 ' Set PWM Period for approximately 38KHz
CCPR1L = 13 ' Set PWM Duty-Cycle to 50%
CCP1CON = %00001100 ' Select PWM Mode
T2CON = %00000100 ' Timer2 = ON + 1:1 prescale
TRISB.0 = 0

ADDRESS VAR BYTE
DAT VAR BYTE
ID VAR BYTE
ADDRESS = 10
ID = 25

BEGIN:
FOR DAT = 0 TO 255
SEROUT PORTB.0,4,[ID,ADDRESS,DAT]
PAUSE 100
NEXT
GOTO BEGIN
H.O
Inlägg: 5729
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg av H.O »

Hej,
(Mitt första inlägg här....be gentle...)

Om du kör med 4MHz klocka så är lägsta möjliga frekvensen du kan uppnå ~244Hz, om du kör med 20Mhz så är det ~1221Hz.

Om du kör med 4Mhz och sätter prescalern till 1:4 samt PR2 till 249 så skall du få 1000Hz, sätt DutyCycle till 500 för 50% puls/pause.

250Hz: Prescaler 1:16, PR2: 249, DutyReg: 500 = 50%
300Hz: Prescaler 1:16, PR2: 207, DutyReg: 416 = 50%
500Hz: Prescaler 1:16, PR2: 124, DutyReg: 250 = 50%
700Hz: Prescaler 1:16, PR2: 88, DutyReg: 178 = 50%
800Hz: Prescaler 1:16, PR2: 77, DutyReg: 156 = 50%

/Henrik Olsson.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43191
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Inlägg av sodjan »

Du kan få precis hur låg frakvens som helst, men kanske inte med
just CCP/PWM modulen. Den har sitt område där den fungerar bra.

Låga frekvenser är enklast att fixa med ett timer-avbrott och lite
kod som "togglar" en pinne. Sedan är det bara att lägga till en räknare
och räkna avbrott om du vill ha riktigt låga frekvensen. I princip kommer
även denna lösning att bli "liggande i bakgrunden"...
xl15
Inlägg: 73
Blev medlem: 14 december 2006, 16:02:37
Ort: Lund
Kontakt:

Inlägg av xl15 »

Jag testade med: high, paus 1ms, low, paus 1ms osv. Blev för dålig upplösning om jag ökade till 2ms. Men jag fick tips att använda us istället. Ska prova det och även prova med att ändra prescalern.
Tack för svaren sålänge.
Skriv svar