In deze tutorial gaan we de FLEX-sensor koppelen aan de ATMEGA8-microcontroller. In ATMEGA8 gaan we de 10bit ADC-functie (analoog naar digitaal conversie) gebruiken om deze klus te klaren. Nu kan de ADC in ATMEGA geen invoer van meer dan + 5V aan.
Wat is een Flex-sensor?
Een FLEX-sensor is een transducer die zijn weerstand verandert wanneer zijn vorm wordt veranderd. Het wordt getoond in onderstaande afbeelding.
Deze sensor wordt gebruikt om de veranderingen in lineariteit waar te nemen. Dus wanneer de FLEX-sensor gebogen is, wordt de weerstand drastisch gebogen. Dit wordt weergegeven in onderstaande afbeelding.
Om deze verandering in weerstand om te zetten in verandering in spanning, gaan we een spanningsdelercircuit gebruiken. In dit resistieve netwerk hebben we een constante weerstand en een andere variabele weerstand. Zoals weergegeven in onderstaande afbeelding, is R1 hier een constante weerstand en is R2 een FLEX-sensor die als weerstand fungeert. Het middelpunt van de tak wordt gemeten. Als weerstand R2 verandert, verandert de Vout lineair mee. Hiermee hebben we dus een spanning die verandert met lineariteit.
Het belangrijkste om hier op te merken is dat de input van de controller voor ADC-conversie zo laag is als 50 µAmp. Dit laadeffect van een op weerstand gebaseerde spanningsdeler is belangrijk omdat de stroom die wordt getrokken uit Vout van de spanningsdeler het foutpercentage verhoogt, voorlopig hoeven we ons geen zorgen te maken over het laadeffect.
We gaan twee weerstanden nemen en een verdelercircuit vormen zodat we voor een Vin van 25 Volt een 5 Volt Vout krijgen. Dus alles wat we hoeven te doen is de Vout-waarde te vermenigvuldigen met "5" in het programma om de echte ingangsspanning te krijgen.
Componenten vereist
HARDWARE: ATMEGA8, Voeding (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF condensator, 100nF condensator (5 stuks), 100KΩ weerstand.
SOFTWARE: Atmel studio 6.1, progisp of flash magie.
Schakelschema en werkuitleg
In het circuit is PORTD van ATMEGA8 verbonden met datapoort LCD. In 16x2 LCD zijn er in totaal 16 pinnen als er een achtergrondverlichting is, als er geen achtergrondverlichting is, zijn er 14 pinnen. Men kan de achterlichtpinnen van stroom voorzien of laten. Nu zitten er in de 14 pinnen 8 datapinnen (7-14 of D0-D7), 2 voedingspinnen (1 & 2 of VSS & VDD of gnd & + 5v), 3 e pin voor contrastregeling (VEE-regelt hoe dik de karakters moeten zijn afgebeeld) en 3 controlepennen (RS & RW & E).
In het circuit kun je zien dat ik maar twee controlepennen heb genomen. Het contrastbit en READ / WRITE worden niet vaak gebruikt, zodat ze kunnen worden kortgesloten naar aarde. Dit plaatst LCD in het hoogste contrast en leesmodus. We hoeven alleen de ENABLE- en RS-pinnen te bedienen om tekens en gegevens dienovereenkomstig te verzenden.
De LCD-aansluitingen met ATmega8 zijn als volgt:
PIN1 of VSS naar aarde
PIN2 of VDD of VCC tot + 5v vermogen
PIN3 of VEE to Ground (geeft maximaal contrast voor een beginner)
PIN4 of RS (Registerselectie) naar PB0 van uC
PIN5 of RW (lezen / schrijven) naar aarde (zet LCD in leesmodus vergemakkelijkt de communicatie voor de gebruiker)
PIN6 of E (inschakelen) naar PB1 van uC
PIN7 of D0 naar PD0 van uC
PIN8 of D1 naar PD1 van uC
PIN9 of D2 naar PD2 van uC
PIN10 of D3 naar PD3 van uC
PIN11 of D4 tot D4 van uC
PIN12 of D5 naar PD5 van uC
PIN13 of D6 naar PD6 van uC
PIN14 of D7 naar PD7 van uC
In het circuit kun je zien dat we 8-bits communicatie hebben gebruikt (D0-D7), maar dit is niet verplicht, we kunnen 4-bits communicatie gebruiken (D4-D7) maar met 4-bits communicatie wordt het programma een beetje ingewikkeld, dus gingen we gewoon met 8-bits communicatie. (Bekijk ook deze tutorial: 16x2 LCD interface met AVR microcontroller)
Dus van louter observatie van bovenaf, verbinden we 10 pinnen van het LCD-scherm met de controller waarin 8 pinnen datapinnen zijn en 2 pinnen voor besturing.
De spanning over R2 is niet volledig lineair; het zal luidruchtig zijn. Om de ruis eruit te filteren worden condensatoren over elke weerstand in het delercircuit geplaatst, zoals weergegeven in de afbeelding.
De 1K-pot hier is om de nauwkeurigheid van ADC aan te passen. Laten we het nu hebben over ADC van ATMEGA8.
In ATMEGA8 kunnen we analoge invoer geven aan elk van de VIER kanalen van PORTC, het maakt niet uit welk kanaal we kiezen, want ze zijn allemaal hetzelfde, we gaan kanaal 0 of PIN0 van PORTC kiezen.
In ATMEGA8 heeft de ADC een resolutie van 10 bits, zodat de controller een minimale verandering van Vref / 2 ^ 10 kan detecteren, dus als de referentiespanning 5V is, krijgen we een digitale outputstap voor elke 5/2 ^ 10 = 5mV. Dus voor elke stap van 5mV in de ingang hebben we een toename van één bij digitale uitgang.
Nu moeten we het register van ADC instellen op basis van de volgende voorwaarden, 1. Allereerst moeten we de ADC-functie in ADC inschakelen.
2. Hier krijg je een maximale ingangsspanning voor ADC-conversie is + 5V. We kunnen dus de maximale waarde of referentie van ADC naar 5V instellen.
3. De controller heeft een trigger-conversiefunctie, wat betekent dat ADC-conversie alleen plaatsvindt na een externe trigger, aangezien we niet willen dat we de registers hoeven in te stellen om de ADC continu vrij te laten draaien.
4. Voor elke ADC zijn de conversiefrequentie (analoge waarde naar digitale waarde) en nauwkeurigheid van digitale uitvoer omgekeerd evenredig. Dus voor een betere nauwkeurigheid van de digitale uitvoer moeten we een lagere frequentie kiezen. Voor een normale ADC-klok stellen we de voorverkoop van ADC in op maximale waarde (2). Omdat we de interne klok van 1MHZ gebruiken, zal de klok van ADC (1000000/2) zijn.
Dit zijn de enige vier dingen die we moeten weten om aan de slag te gaan met ADC.
Alle bovenstaande vier functies worden ingesteld door twee registers:
ROOD (ADEN): Dit bit moet worden ingesteld om de ADC-functie van ATMEGA in te schakelen.
BLAUW (REFS1, REFS0): deze twee bits worden gebruikt om de referentiespanning in te stellen (of de maximale ingangsspanning die we gaan geven). Omdat we een referentiespanning van 5V willen, moet REFS0 worden ingesteld volgens de tabel.
GEEL (ADFR): deze bit moet worden ingesteld om de ADC continu te laten werken (vrijloopmodus).
PINK (MUX0-MUX3): deze vier bits zijn voor het aangeven van het ingangskanaal. Omdat we ADC0 of PIN0 gaan gebruiken, hoeven we geen bits in te stellen zoals bij de tabel.
BRUIN (ADPS0-ADPS2): deze drie bits zijn voor het instellen van de prescalar voor ADC. Omdat we een prescalar van 2 gebruiken, moeten we een bit instellen.
DONKERGROEN (ADSC): deze bit is ingesteld voor de ADC om de conversie te starten. Dit bit kan in het programma worden uitgeschakeld wanneer we de conversie moeten stoppen.
De interface van de FLEX-sensor met ATmega8 wordt stap voor stap uitgelegd in de onderstaande C-code.