Lite tips om att använda CCP modulen
Lite tips om att använda CCP modulen
Jag skall mäta frekvensen av två flödesmätare som ger ifrån sig två oberoende pulser.
En 18F452 skall läsa av pulserna och jag hade tänkt mig använda mig av CCP modul 1 och 2.
Flödesmätaren mäter flöden och har en kapacitet av 0.1 l/m till 2.5 l/m med en upplösning av 20 000 pulser/l. Detta ger minsta antal pulser på 200 pulser/minut och max antal pulser på 50 000 pulser/minut. Detta i sin tur ger ca 33 pulser/sekund(Hz) till 833 pulser/sekund(Hz).
Går det överhuvudtaget använda dessa två CCP moduler oberoende och har någon erfarenhet av detta?
Hur skall jag tänka för att inte TMR går runt?
En 18F452 skall läsa av pulserna och jag hade tänkt mig använda mig av CCP modul 1 och 2.
Flödesmätaren mäter flöden och har en kapacitet av 0.1 l/m till 2.5 l/m med en upplösning av 20 000 pulser/l. Detta ger minsta antal pulser på 200 pulser/minut och max antal pulser på 50 000 pulser/minut. Detta i sin tur ger ca 33 pulser/sekund(Hz) till 833 pulser/sekund(Hz).
Går det överhuvudtaget använda dessa två CCP moduler oberoende och har någon erfarenhet av detta?
Hur skall jag tänka för att inte TMR går runt?
Först så skulle jag rekomendera en modernare modell.
Det finns flera som är raka uppgraderingar från 542'an,
t.ex 4520 eller 4525. De nya moderna har en "Enhanced"
CCP modul. Jag vet inte på rak arm hur stor roll det spelar,
men det bör ju inte vara sämre i alla fall...
Ska det bara så att säga "räkna på" ?
Du skulle kunna använda t.ex Timer0 och Timer1 och bara låta
dom ge interrupt när de "snurrar runt" och med dessa räkna flödet.
Båda kan ta sin klocka från en extern källa.
Vilken upplösning behöver du ?
D.v.s måste du "se" varje individuell puls från givarna ?
Det går ju i och för sig genom att läsa av TMR0/TMR1
när man har behov och lägga värdet till summan man har.
Är det den totala volymen eller den aktuella flödeshastigheten
(eller båda) som du vill se ?
Det finns flera som är raka uppgraderingar från 542'an,
t.ex 4520 eller 4525. De nya moderna har en "Enhanced"
CCP modul. Jag vet inte på rak arm hur stor roll det spelar,
men det bör ju inte vara sämre i alla fall...

Ska det bara så att säga "räkna på" ?
Du skulle kunna använda t.ex Timer0 och Timer1 och bara låta
dom ge interrupt när de "snurrar runt" och med dessa räkna flödet.
Båda kan ta sin klocka från en extern källa.
Vilken upplösning behöver du ?
D.v.s måste du "se" varje individuell puls från givarna ?
Det går ju i och för sig genom att läsa av TMR0/TMR1
när man har behov och lägga värdet till summan man har.
Är det den totala volymen eller den aktuella flödeshastigheten
(eller båda) som du vill se ?
Sorry Bearing
Det skall vara minimum 2000 pulser/min och det blir ca 33Hz.
Jag tror att det räcker momentan förbrukning men när jag väl tänker lite längre kanske även totalförbrukningen vara intressant. Låt oss först nöja oss med momentan förbrukning.
Jag ser i vart fall två sätt att implementera flödesgivarna.
1) Läsa av TMR0 och räkna tid och pulser (typ pulsein) eller
2) Använda CCP capture
Det som talar emot CCP är att jag inte har så hög frekvens.
I första exemplet hur skall jag räkna om jag sätter TMR0 prescale 1:8 och har en 4MHz osc. Hur lång tid blir det mellan interrupten? Vi antar att jag väljer TMR0 som 16bitars räknare.
Det skall vara minimum 2000 pulser/min och det blir ca 33Hz.
Jag tror att det räcker momentan förbrukning men när jag väl tänker lite längre kanske även totalförbrukningen vara intressant. Låt oss först nöja oss med momentan förbrukning.
Jag ser i vart fall två sätt att implementera flödesgivarna.
1) Läsa av TMR0 och räkna tid och pulser (typ pulsein) eller
2) Använda CCP capture
Det som talar emot CCP är att jag inte har så hög frekvens.
I första exemplet hur skall jag räkna om jag sätter TMR0 prescale 1:8 och har en 4MHz osc. Hur lång tid blir det mellan interrupten? Vi antar att jag väljer TMR0 som 16bitars räknare.
> har en 4MHz osc.
Varför ?
Det har ingen betydelse för själva *räknandet*, pulserna kommer ju
utifrån. Däremot kan de ha betydelse för uträkningen av flöde/tidsenhet.
Annars är det bara att räkna hur många pulser du behöver för
att räkna till 2^^16 * 8.
Om du vill ha flödet/tidsenhet så måste du även mäta någon tid
i koden så att du har något att jämföra med.
Jag har inte kollat så noga, men ofta (men inte alltid) kan man hitta en
lämplig uppsättning av allt så att man slipper räkna så mycket...
Jag skulle först försöka med 1:1 prescaler, men det beror på vilken
upplösning du behöver. med 1:8 så "ser" du ju bara var 8'de puls.
Sannolikt helt OK, men i alla fall.
Varför ?
Det har ingen betydelse för själva *räknandet*, pulserna kommer ju
utifrån. Däremot kan de ha betydelse för uträkningen av flöde/tidsenhet.
Annars är det bara att räkna hur många pulser du behöver för
att räkna till 2^^16 * 8.
Om du vill ha flödet/tidsenhet så måste du även mäta någon tid
i koden så att du har något att jämföra med.
Jag har inte kollat så noga, men ofta (men inte alltid) kan man hitta en
lämplig uppsättning av allt så att man slipper räkna så mycket...
Jag skulle först försöka med 1:1 prescaler, men det beror på vilken
upplösning du behöver. med 1:8 så "ser" du ju bara var 8'de puls.
Sannolikt helt OK, men i alla fall.
Jag tänkte på följande sätt.
Fånga upp interupten när TMR0 går runt dvs från FFFFh till 0000h och när detta sker räkna upp räknare så när ett antal interupts skett så har exempelvis ca 1000ms gått. Inte helt exakt men ändå kanske tillräckligt.
Jag vill nämligen mäta tidsenhet när jag räknar pulserna.
Fånga upp interupten när TMR0 går runt dvs från FFFFh till 0000h och när detta sker räkna upp räknare så när ett antal interupts skett så har exempelvis ca 1000ms gått. Inte helt exakt men ändå kanske tillräckligt.
Jag vill nämligen mäta tidsenhet när jag räknar pulserna.