Problem med LDR på Pic
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
Problem med LDR på Pic
Kör mjukvaru-PWM i en Pic 16F88, och jag försöker nu få PWM:en att stanna om det är ljust i rummet. På RB5 har jag kopplat ett LDR och en trimmer, och när statusen på denna port ändras körs en interruptrutin som kollar statusen på RB5 och startar/stoppar PWM:en beroende på om det är ljust eller mörkt. Detta fungerar bra, förutom på gränsen mellan ljust och mörkt där det verkar som om Pic:en inte kan bestämma sig för om ingången är hög eller låg vilket leder till att lysdioden som PWM:en styr flimrar. Hur kan man undvika detta?
- JimmyAndersson
- Inlägg: 26578
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
>det verkar som om Pic:en inte kan bestämma sig för om ingången är hög eller låg
LDR-motståndet ger värden som ena stunden ger en 'hög' signal (en 1:a) och i nästa stund ger en 'låg' (en 0:a). Det ligger liksom på gränsen hela tiden och kan byta mellan 'låg' och 'hög' när som helst ungefär...
Jag vet inte hur du har kopplat, men jag har två förslag:
1: Om man gör en liten koppling med LDR till en OP-förstärkare (eller komparator, eller två transistorer) så kan man med en potentiometer justera så att kopplingen ger en 0:a när det är mörkt och en 1:a när det är ljust. Det går då att justera så att den inte är lika känslig när det är precis lite sådär 'halvmörk/ljust'. (Denna signal kopplas till en digital ingång på PIC-kretsen.)
Sedan kan man göra en liten rutin i PIC-kretsen som låter det gå en viss tid mellan varje avläsning från 'LCD-bygget'. Detta gör att du får ännu bättre resultat.
2: En annan variant är att man gör en liknande variant som ovan, men behåller den analog så att den ger en spänning mellan 0-5v. Det kopplar man till en analog ingång på PIC-kretsen och programmerar så att 0-1v motsvarar mörker och 4-5v motsvarar när det är ljust.
Detta är lättare att bygga men kräver lite mer kodande.
LDR-motståndet ger värden som ena stunden ger en 'hög' signal (en 1:a) och i nästa stund ger en 'låg' (en 0:a). Det ligger liksom på gränsen hela tiden och kan byta mellan 'låg' och 'hög' när som helst ungefär...
Jag vet inte hur du har kopplat, men jag har två förslag:
1: Om man gör en liten koppling med LDR till en OP-förstärkare (eller komparator, eller två transistorer) så kan man med en potentiometer justera så att kopplingen ger en 0:a när det är mörkt och en 1:a när det är ljust. Det går då att justera så att den inte är lika känslig när det är precis lite sådär 'halvmörk/ljust'. (Denna signal kopplas till en digital ingång på PIC-kretsen.)
Sedan kan man göra en liten rutin i PIC-kretsen som låter det gå en viss tid mellan varje avläsning från 'LCD-bygget'. Detta gör att du får ännu bättre resultat.
2: En annan variant är att man gör en liknande variant som ovan, men behåller den analog så att den ger en spänning mellan 0-5v. Det kopplar man till en analog ingång på PIC-kretsen och programmerar så att 0-1v motsvarar mörker och 4-5v motsvarar när det är ljust.
Detta är lättare att bygga men kräver lite mer kodande.
Eftersom denna kontroller har inbygd komperator skulle du kunna använda den till att bygga en schmitttrigger vilket jag misstänker är det JimmyAndersson menar i allternativ 1
Men det enklaste är kanske att lösa det i mjukvara genoma att kolla så att porten är stabil under en stund kan göras med hjälp av en timer eller bara en liten delay loop.
Men det enklaste är kanske att lösa det i mjukvara genoma att kolla så att porten är stabil under en stund kan göras med hjälp av en timer eller bara en liten delay loop.
En digial I/O pinne skall aldrig ha annat än digital I/O !
Används en komparator. Se kap 13 i databladet.
Obs att du fortfarande kan få ett läge där det "står och väger".
Du skulle kunna lägga till en "bias" till LDR spänningen via
en extra I/O pinne som du sätter hög/låg när komparatorn slår om.
Eller ändra den inbyggda spänningsrefferensen om "steget" passar.
Se kap 14.
Använd komparatorns interrupt så kommer allt att snurra i bakgrunden
utan du behöver bry dig om det i din huvudkod...
Används en komparator. Se kap 13 i databladet.
Obs att du fortfarande kan få ett läge där det "står och väger".
Du skulle kunna lägga till en "bias" till LDR spänningen via
en extra I/O pinne som du sätter hög/låg när komparatorn slår om.
Eller ändra den inbyggda spänningsrefferensen om "steget" passar.
Se kap 14.
Använd komparatorns interrupt så kommer allt att snurra i bakgrunden
utan du behöver bry dig om det i din huvudkod...
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
Tack för idéerna! Att koppla LDR'en till en analog ingång var vad jag hade tänkt från början, men då blir det svårt att använda interrupt vid ändring. En komparator hjälper väl egentligen inte mot problemet vid omslag? Komparatorn kommer väl också att växla fram och tebax? Sedan har jag använt RA0-RA2 som A/D-ingångar redan...
Att vänta en stund och kolla igen (som vid kontaktavstudsning) blir lite besvärligt, ljuset som mäts är dagsljus man kan ju få vänta ganska länge på att ljusnivån ändras...
Det bästa vore kanske en separat opamp med hysteres (eller vad det nu hette) som går hög vid kanske 4 volt och låg vid typ 1 volt?
Att vänta en stund och kolla igen (som vid kontaktavstudsning) blir lite besvärligt, ljuset som mäts är dagsljus man kan ju få vänta ganska länge på att ljusnivån ändras...
Det bästa vore kanske en separat opamp med hysteres (eller vad det nu hette) som går hög vid kanske 4 volt och låg vid typ 1 volt?
- EagleSpirit
- Inlägg: 1288
- Blev medlem: 27 maj 2003, 23:15:48
- Ort: Västerås
- Kontakt:
Jag har för mig att komparatorn har interrupt, men är inte helt säker. Det borde finnas tycker jag. Om det nu inte finns, är du säker på att du behöver interrupt? Du kanske kan lösa det genom att kolla värdet en gång i sekunden eller nåt sånt.
Eftersom det är en µC du håller på med så är det du själv som bestämmer vad du ska göra med den, i princip. Med det menar jag att visst kommer komparatorn att växla fram och tillbaks om du programmerar att den ska göra det. Men du kan även skapa egen hysteres, precis som du kan göra med en OP-amp. Det är bara att läsa databladet och se vilka funktioner som finns och lägga till några rader kod.
En enkel metod är att mäta en analog ingång varje sekund och om värdet är över 60% mörker ska den stänga av PWMen och om värdet är under 50% mörker ska den starta PWMen. Det betyder att under de där 10% så kommer ingenting att hända. Detta kräver väl inte mer än 10 rader kod eller något liknande.
edit: om det är som sodjan säger så är det ju inga problem. PICen har troligtvis de funktioner du behöver.
Eftersom det är en µC du håller på med så är det du själv som bestämmer vad du ska göra med den, i princip. Med det menar jag att visst kommer komparatorn att växla fram och tillbaks om du programmerar att den ska göra det. Men du kan även skapa egen hysteres, precis som du kan göra med en OP-amp. Det är bara att läsa databladet och se vilka funktioner som finns och lägga till några rader kod.
En enkel metod är att mäta en analog ingång varje sekund och om värdet är över 60% mörker ska den stänga av PWMen och om värdet är under 50% mörker ska den starta PWMen. Det betyder att under de där 10% så kommer ingenting att hända. Detta kräver väl inte mer än 10 rader kod eller något liknande.
edit: om det är som sodjan säger så är det ju inga problem. PICen har troligtvis de funktioner du behöver.