Hejsan, jag har byggt ett enkelt kretskort med två drivkretsar/h-bryggor och en AVR Atmega88 som låter mig styra en stegmotor och läsa av lite sensorer via en serieport.
Jag har anslutit en metalldetektor på en I/O-pinne som är konfigurerad som en ingång, och den är sedan ansluten till en lysdiod på metalldetektorn. Spänningen från den punkten är 4.5V vid tänd lysdiod, och 0V vid släckt, så därför är den inkopplad rakt på Atmegan utan någon form av analog komparator eller så. Ful-Hack (TM). :D
Hursomhelst, dessvärre verkar det som om det genereras störningar i kabeln, eftersom Atmegan signalerar pin-change-interrupt när man kör med motorn. Tyvärr kan jag inte undersöka det närmare eftersom jag inte har tillgång till ett oscillioskop. Jag har redan undersökt möjligheten att jag helt enkelt modifierade porten i mjukvaran, men efter att ha kontrollerar assembleroutputen och kört koden i simulator är jag rätt säker på att inte det är felet.
Sladden till detektorn är lång, kanske 1.2-1.5 meter, och är en styrkabel från Elfa, oskärmad. Och den går nära en VGA-kabel och ett par nätströmskablar.
Eftersom styrkretsarna använder fyra I/O-linjer per styck trodde jag eventuellt att switchandet av dessa kunde ge rippel på övriga ben, men enligt databladet för drivsteget drar logikingångarna typiskt mindre än en microampere per linje, så det torde knappast belasta AVR-processorn i någon större utsträckning.
En annan möjlighet är ju helt enkelt att en massa störningar överförs internt på kortet, och att jag behöver stabilisera matningen där. Dock är redan logiken försörjd med separat matning, alla kretsar har en kodensator enligt tradition, och drivkretsarna har inbyggda frihjulsdioder. Dessutom uppstod aldrig några problem av detta slag under utvecklingen, inte ens när det hela var uppkopplat på en breadboard i en sjuhelsikes härva.
Så just nu lutar jag helt enkelt åt att det är störningar som plockas upp i kabeln. Eller så är det helt enkelt motorns magnetfält som tas upp av metalldetektorns spole (jag har inte hunnit testa att köra systemet med metalldetektorn avlägsnad från motorns närhet).
Hur filtrerar man bort dylika störningar lättast? Jag hade tänkt testa med en kondensator kopplad mot jord, men jag är ganska okunning om praktisk konstruktion av filter av det här slaget. Så... Någon som har lust att hjälpa mig?
Med vänliga hälsningar
Matin Persson
Störningar på en AVR atmega I/O-pinne
Helst skulle man ju vilja *se* störningarna på ett oscillioskop.
Men om vi antar att stör-pulserna är betydligt kortare än de
riktiga pulser från LED'en som du vill detektera, så skulle du
kunna sätta dit ett enkelt RC filter. Tidskonstanten väljs så att
de snabba störningrna inte "hinner igenom". Eventuellt skull man
även vilja ha en schmitt-trigger ingång (hur det nu stavas) eftersom de
är bättre på att hantera långamma flanker än vanliga CMOS ingångar.
Men om vi antar att stör-pulserna är betydligt kortare än de
riktiga pulser från LED'en som du vill detektera, så skulle du
kunna sätta dit ett enkelt RC filter. Tidskonstanten väljs så att
de snabba störningrna inte "hinner igenom". Eventuellt skull man
även vilja ha en schmitt-trigger ingång (hur det nu stavas) eftersom de
är bättre på att hantera långamma flanker än vanliga CMOS ingångar.
Kan det vara så utgången från metalldetektorn är av typen open-drain (öppen kollektor). Om du då inte har någon pullup-resistor på ledaren så KAN det fungera ändå, så länge du inte får några störningar... Är osäker på värdet på den pull-up som finns tillgänglig på atmegans egna ingångar. Kolla att det interna pull-up-motståndet är aktiverat (sätt aktuella biten i PORTx till 1).
Om nu den interna pullup-en är väldigt högohmig så kanske den ändå inte räcker till. En extern på ~5-10kohm borde eliminera alla eventuella open-drain-problem.
Om nu den interna pullup-en är väldigt högohmig så kanske den ändå inte räcker till. En extern på ~5-10kohm borde eliminera alla eventuella open-drain-problem.
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
filter
Sätt 10k i serie med signalen.
Vid atmel ingången sätter du 100nF - 1uf mellan signal och gnd (-) .
Men, hur snabba förlopp skall du egentligen mäta. behöver du ett snabbare svar än säg t.ex. 10Hz.
Om detta räcker så - Skippa pin change interrupt.
lägg en huvudloop på 100Hz
Varje gång i huvudloopen läser du av pinnen, är pinnen 1 ökar du en räknare med 1 (max värde = 10) , är den 0 minskar du samma räknare med 3 (min värde =0).
När din räknare är = 10 så har du en "etta" på ingången.
Är räknaren < 5 har du en "nolla"
Denna typ av mjukvarufiltrering går att förfina och förbättra ytterligare...
Swech
Vid atmel ingången sätter du 100nF - 1uf mellan signal och gnd (-) .
Men, hur snabba förlopp skall du egentligen mäta. behöver du ett snabbare svar än säg t.ex. 10Hz.
Om detta räcker så - Skippa pin change interrupt.
lägg en huvudloop på 100Hz
Varje gång i huvudloopen läser du av pinnen, är pinnen 1 ökar du en räknare med 1 (max värde = 10) , är den 0 minskar du samma räknare med 3 (min värde =0).
När din räknare är = 10 så har du en "etta" på ingången.
Är räknaren < 5 har du en "nolla"
Denna typ av mjukvarufiltrering går att förfina och förbättra ytterligare...
Swech
Tack för alla förslag. För det första ska jag berätta att en giltig signal från sensorn är en "hög" spänning under ungefär 500-600 ms, och det verkar som om transienterna/störningarna är kortare än så. Jag hade därför tänkt klämma dit ett RC-filter som ni föreslaget av lite skit som jag har liggande, tanken var något i stil med ett 560 ohms motstånd och en 100uF elektrolyt, eller vad som finns tillgängligt. Dessutom kom jag att tänka på (via konversation med en bekant) att sensorn byggdes för att drivas på ett 9V batteri. Som det är nu drivs den på nätagget, ett Nordic Power på 50W om jag inte minns fel. Jag har haft strul med det tigigare p.g.a. dess högga rippelvärde på uppemot 600mV, var tvungen att använda tantaler på logikströmförsörjningen för att få tillräckligt stabil spänning för att brown-outen inte skulle trigga. Saken är den att sensorn (gjord för batteridrift) körs på en "ofiltrerade" 12V-linan, och det är densamma som driver stegmotorn. Eftersom störningarna uppkommer när motorn rampas upp mot full hastighet misstänker jag att störningarna kanske fortplantar sig genom sensorn och in på signalledaren.
Hursomhelst så skall jag imorgon montera ett RC-filer på ingången, dubbelkolla den interna portkonfigen och förbättra matningen till sensorn. Om det fortfarande strular var tanken att bygga ett ghetto-oscillioskop med en annan Atmega och dess ADC plus en PC. Inte mycket ram-minne att buffra i, men wtf, bättre än inget.
Tack för hjälpen, jag ska berätta hur det går!
Hursomhelst så skall jag imorgon montera ett RC-filer på ingången, dubbelkolla den interna portkonfigen och förbättra matningen till sensorn. Om det fortfarande strular var tanken att bygga ett ghetto-oscillioskop med en annan Atmega och dess ADC plus en PC. Inte mycket ram-minne att buffra i, men wtf, bättre än inget.
Tack för hjälpen, jag ska berätta hur det går!
-
- Inlägg: 7122
- Blev medlem: 31 augusti 2006, 16:42:43
- Ort: Jamtland
Eftersom han har 4,5V när dioden lyser verkar det inte som open_drain. Kan istället vara så att det behövs pull-down. När lysdioden inte lyser är den högohmig och inget belastar ner spänningen förrän störningarna kommer över ca 2V och LED börjar leda.oJsan skrev:Kan det vara så utgången från metalldetektorn är av typen open-drain (öppen kollektor).
Prova om pull-down på 10kohm räcker annars går du ner i resistans.
Edit: Ta bort all pull-up om du har någon!