Skapa två olika frekvenser med timer1 på AVR?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Skapa två olika frekvenser med timer1 på AVR?

Inlägg av Glattnos »

Hej

Jag drev en stegmotor(via en stegmotor-drivare med STEP ich DIR) med en Atmega328p men kommer inte på hur jag ska kunna driva två motorer. För att driva en använde jag CTC i timer1 där timern räknar upp till OCR1A, togglar STEP-pinnen(OC1A), sen räknar timern ner till 0, togglar igen och börjar räkna upp igen.
Då får man ett fint pulståg som man kan styra frekvensen på genom att ändra OCR1A-registret.

Men nu tänkte jag att det var enkelt att implementera en ytterligare stegmotor eftersom det finns ett OCR1B-register som styr en OC1B-pinne. Men nej, i data-bladet står det att det är OCR1A som styr toppen på räknaren så det är fortfarande det registret som styr frekvensen, så naturligtvis tänkte jag lite fel.

Jag har läst i data-bladet och googlat men inte tagit mig förbi problemet. Jag har funderat också hur man skulle kunna lösa det men har hjärnsläpp så jag hoppas på att någon kan peka mig i rätt riktning.

Alltså jag vill skicka pulståg med olika frekvens till två olika stegmotor-drivare, men med hjälp av endast en timer(timer1 är den jag har ledig för tillfället), det är bra om duty-cycle är 50% men inte nödvändigt. Hur kan jag göra det?
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4689
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Skapa två olika frekvenser med timer1 på AVR?

Inlägg av Swech »

Du låter timern räkna mellan 0-65535 istället. 0000 - FFFFh
Så har du output compare på A och B.
I varje output compare så räknar du ut det absoluta värdet för nästa omslag för den kanalen.

T.ex. om du på A vill ha omslag vid varje 1000de puls.
Först är ocr1a = 1000
vid compare så adderar du 1000 till ocr1a -> 2000 .... 3000.... 4000 osv.

Om du samtidigt har t.ex. 820 pulser på B så har du output compare 820, 1640. ..... osv.

Du behöver inte heller bry dig om någon extra matte då räknarna slår om från 65535 till 0 igen.
exemplet med 1000 ger 64000, 65000, 465 (66000 - 65535 = 465 )

Swech
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Skapa två olika frekvenser med timer1 på AVR?

Inlägg av Icecap »

Det kunde vara kul att veta lite om hastigheten på pulserna...
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Skapa två olika frekvenser med timer1 på AVR?

Inlägg av Glattnos »

Swech: Tack så mycket! Såklart kan man göra så, jag var nog för inlåst i tankesättet jag hade när jag drev en motor :) Jag hittade en tråd på ett anat forum där dom diskuterat att det inte gick att få två frekvenser från en timer och jag blev så förvirrad för det kändes som att allt fanns för att åstadkomma just det utan allt för mycket special-lösningar :)

Icecap: I nuläget har jag 60 - 8000 μs. Det behövs inte riktigt så stort spann men det är bra när man laborerar. Stegmotorerna sitter på driften på en liten robot som jag har byggt :)

Edit: Ändrade tiderna efter att ha räknat lite mer rätt(kanske) :)
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Skapa två olika frekvenser med timer1 på AVR?

Inlägg av Glattnos »

Det funkar perfekt på båda motorerna, dock har jag en fråga till. Om jag vill stoppa pulståget till en motor, vad är bäst då?

Jag har provat med detta:

Kod: Markera allt

TIMSK1 = TIMSK1 &  ~(1<<OCIE1A); //Stoppa motor A
Men den tycks snurra ändå. Borde inte det fungera?
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Skapa två olika frekvenser med timer1 på AVR?

Inlägg av Glattnos »

Oj, jag tror jag kom på det. Compare Match inträffar även om inte Compare Match Interrupt inträffar så jag måste:

Kod: Markera allt

 TCCR1A = TCCR1A &  ~(1<<COM1A0);
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Skapa två olika frekvenser med timer1 på AVR?

Inlägg av Glattnos »

Dammar av denna gamla tråd. Original-frågan var hur man skapar två olika frekvenser med bara en timer. Nu undrar jag om man på något liknande smart sätt kan skapa tre olika frekvenser med bara en timer?

Det finns ju i just Atmega328p endast timers med två Compare-register så man kan ju inte gå tillväga på exakt samma sätt som för två frekvenser. Jag har en take om att man genom att jämföra värdena och ha en räknare i avbrottsrutinen skulle kunna köra två frekvenser i samma Compare-intrrupt men...det känns lite meckigt om det finns något bättre sätt :)
Skriv svar