Inhoudsopgave:

Inleiding tot ADC in AVR-microcontroller - voor beginners: 14 stappen
Inleiding tot ADC in AVR-microcontroller - voor beginners: 14 stappen

Video: Inleiding tot ADC in AVR-microcontroller - voor beginners: 14 stappen

Video: Inleiding tot ADC in AVR-microcontroller - voor beginners: 14 stappen
Video: Webinar Python: Een makkelijke manier om microcontrollers te programmeren 2024, November
Anonim
Inleiding tot ADC in AVR-microcontroller | voor beginners
Inleiding tot ADC in AVR-microcontroller | voor beginners

In deze tutorial weet je alles ADC in avr microcontroller

Stap 1: Wat is een ADC?

Een ADC, of analoog naar digitaal converter, maakt het mogelijk om een analoge spanning om te zetten in een digitale waarde die kan worden gebruikt door een microcontroller. Er zijn veel bronnen van analoge signalen die men zou willen meten. Er zijn analoge sensoren beschikbaar die temperatuur, lichtintensiteit, afstand, positie en kracht meten, om er maar een paar te noemen.

Stap 2: Hoe werkt ADC in AVR- Microcontroller

Met de AVR ADC kan de AVR-microcontroller analoge spanningen omzetten in digitale waarden met weinig tot geen externe onderdelen. De ATmega8 heeft een 10-bit opeenvolgende benadering ADC. ATmega8 heeft 7-kanaals ADC op PortC. De ADC heeft een aparte analoge voedingsspanningspen, AVCC. AVCC mag niet meer dan ± 0,3V verschillen van VCC. De spanningsreferentie mag extern ontkoppeld zijn op de AREF-pin. AVCC wordt gebruikt als de spanningsreferentie. De ADC kan ook worden ingesteld om continu te draaien (de vrijloopmodus) of om slechts één conversie uit te voeren.

Stap 3: ADC-conversieformule

ADC-conversieformule
ADC-conversieformule

Waar Vin de spanning op de geselecteerde ingangspen is en Vref de geselecteerde spanningsreferentie

Stap 4: Hoe ADC configureren in ATmega8?

Hoe ADC configureren in ATmega8?
Hoe ADC configureren in ATmega8?

De volgende registers worden gebruikt voor de implementatie van ADC in ATmega8:

Selectie ADC-multiplexer

Stap 5: ADLAR-selectie

ADLAR-selectie
ADLAR-selectie
ADLAR-selectie
ADLAR-selectie

Resultaat ADC links aanpassen De ADLAR-bit beïnvloedt de presentatie van het ADC-conversieresultaat in het ADC-gegevensregister. Schrijf er een naar ADLAR om het resultaat naar links aan te passen. Anders is het resultaat goed aangepast

Wanneer een ADC-conversie is voltooid, wordt het resultaat gevonden in ADCH en ADCL. Wanneer ADCL wordt gelezen, wordt het ADC-gegevensregister niet bijgewerkt totdat ADCH is gelezen. Als het resultaat dus wordt aangepast en niet meer dan 8-bits precisie is vereist, is het voldoende om ADCH te lezen. Anders moet eerst ADCL worden gelezen en daarna ADCH. Analoge kanaalselectiebits De waarde van deze bits selecteert welke analoge ingangen zijn aangesloten op de ADC.

Stap 6: ADCSRA-selectie

ADCSRA-selectie
ADCSRA-selectie
ADCSRA-selectie
ADCSRA-selectie

• Bit 7 – ADEN: ADC inschakelen Door deze bit naar één te schrijven, wordt de ADC ingeschakeld. Door het naar nul te schrijven, wordt de ADC uitgeschakeld

• Bit 6 – ADSC: ADC-startconversie In de enkele conversiemodus schrijft u deze bit naar één om elke conversie te starten. Schrijf in de Free Running-modus dit bit naar één om de eerste conversie te starten.

• Bit 5 – ADFR: ADC Free Running Select Wanneer deze bit is ingesteld (één), werkt de ADC in de Free Running-modus. In deze modus bemonstert en actualiseert de ADC de gegevensregisters continu. Als u dit bit (nul) wist, wordt de Free Running-modus beëindigd.

• Bit 4 – ADIF: ADC-onderbrekingsvlag Deze bit wordt ingesteld wanneer een ADC-conversie is voltooid en de gegevensregisters worden bijgewerkt. De ADC Conversion Complete Interrupt wordt uitgevoerd als de ADIE-bit en de I-bit in SREG zijn ingesteld. ADIF wordt door hardware gewist bij het uitvoeren van de bijbehorende interrupt Handling Vector. Als alternatief wordt ADIF gewist door een logische naar de vlag te schrijven.

• Bit 3 – ADIE: ADC Interrupt Enable Wanneer deze bit naar één wordt geschreven en de I-bit in SREG is ingesteld, wordt de ADC Conversion Complete Interrupt geactiveerd.

• Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits Volgens de datasheet moet deze prescaler zo worden ingesteld dat de ADC-ingangsfrequentie tussen 50 KHz en 200 KHz ligt. De ADC-klok wordt afgeleid van de systeemklok met behulp van ADPS2:0. Deze bits bepalen de delingsfactor tussen de XTAL-frequentie en de ingangsklok naar de ADC.

Stap 7: Als u ADC-waarde wilt nemen, moet u wat werk hebben gedaan dat hieronder wordt vermeld

  • ADC-waarde instellen
  • Uitgangs-LED-pin configureren:
  • ADC-hardware configureren
  • ADC inschakelen
  • Start analoog naar digitaal conversies
  • TERWIJL voor altijd

ALS ADC-waarde hoger is dan de ingestelde waarde, LED inschakelen ELSE LED uitschakelen

Stap 8: ADC-waarde instellen

Code: uint8_t ADCWaarde = 128;

Stap 9: Uitgangs-LED-pin configureren

Code: DDRB|= (1 << PB1);

Stap 10: ADC-hardware configureren

ADC-hardware configureren

Dit wordt gedaan door het instellen van bits in de besturingsregisters voor de ADC. Laten we eerst de prescalar voor de ADC instellen. Volgens de datasheet moet deze prescaler zo worden ingesteld dat de ADC-ingangsfrequentie tussen 50 KHz en 200 KHz ligt. De ADC-klok is afgeleid van de systeemklok. Bij een systeemfrequentie van 1 MHz resulteert een prescaler van 8 in een ADC-frequentie van 125 Khz. De voorschaling wordt ingesteld door de ADPS-bits in het ADCSRA-register. Volgens de datasheet moeten alle drie de ADPS2:0-bits op 011 worden ingesteld om de 8-prescaler te krijgen.

Code: ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

Laten we vervolgens de ADC-referentiespanning instellen. Dit wordt bestuurd door de REFS-bits in het ADMUX-register. Het volgende stelt de referentiespanning in op AVCC.

Code: ADMUX |= (1 << REFS0);

Om het kanaal dat door de multiplexer naar de ADC gaat, in te stellen, moeten de MUX-bits in het ADMUX-register dienovereenkomstig worden ingesteld. Aangezien we hier ADC5 gebruiken

Code: ADMUX&=0xF0; ADMUX|=5;

Om de ADC in de vrijlopende modus te zetten, stelt u de toepasselijke naam ADFR-bit in het ADCSRA-register in:

Code: ADCSRA |= (1 << ADFR);

Een laatste wijziging van de instellingen wordt aangebracht om het lezen van de ADC-waarde eenvoudiger te maken. Hoewel de ADC een resolutie van 10 bits heeft, is zoveel informatie vaak niet nodig. Deze 10-bits waarde is verdeeld over twee 8-bits registers, ADCH en ADCL. Standaard worden de laagste 8 bits van de ADC-waarde gevonden in ADCL, waarbij de bovenste twee de laagste twee bits van ADCH zijn. Door de ADLAR-bit in het ADMUX-register in te stellen, kunnen we de ADC-waarde links uitlijnen. Dit plaatst de hoogste 8 bits van de meting in het ADCH-register, met de rest in het ADCL-register. Als we vervolgens het ADCH-register lezen, krijgen we een 8-bits waarde die onze 0 tot 5 volt-meting vertegenwoordigt als een getal van 0 tot 255. We veranderen in feite onze 10-bits ADC-meting in een 8-bits meting. Hier is de code om het ADLAR-bit in te stellen:

Code:

ADMUX |= (1 << ADLAR); Dat voltooit de installatie van de ADC-hardware voor dit voorbeeld. Er moeten nog twee bits worden ingesteld voordat de ADC gaat meten.

Stap 11: ADC inschakelen

Om de ADC in te schakelen, stelt u de ADEN-bit in ADCSRA in:

Code: ADCSRA |= (1 << ADEN);

Stap 12: Start analoog naar digitaal conversies

Om de ADC-metingen te starten, moet de ADSC-bit in ADCSRA worden ingesteld:

Code: ADCSRA |= (1 << ADSC);

Op dit punt zou de ADC continu beginnen met het bemonsteren van de spanning die op ADC5 wordt gepresenteerd. De code tot nu toe zou er als volgt uitzien:

Stap 13: WHLE Forever

Het enige dat u nog hoeft te doen, is de ADC-waarde testen en de LED's instellen om een hoog/laag indicatie weer te geven. Aangezien de ADC-waarde in ADCH een maximale waarde van 255 heeft, werd een testwaarde van th gekozen om te bepalen of de spanning hoog of laag was. Met een eenvoudige IF/ELSE-instructie in de FOR-lussen kunnen we de juiste LED inschakelen:

Code

if(ADCH >ADCWaarde)

{

PORTB |= (1 << PB0); // Schakel LED in

}

anders

{

PORTB&= ~(1 << PB0); // Schakel LED uit

}

Stap 14: Aan het einde volledige code is

Code:

#erbij betrekken

int hoofd (void)

{

uint8_t ADCWaarde = 128;

DDRB |= (1 << PB0); // Stel LED1 in als uitgang

ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Stel ADC prescalar in op 8 - // 125KHz sample rate 1MHz

ADMUX |= (1 << REFS0); // Stel ADC-referentie in op AVCC

ADMUX |= (1 << ADLAR); // Pas het ADC-resultaat links aan om gemakkelijk 8-bits lezen mogelijk te maken

ADMUX&=0xF0;

ADMUX|=5; // MUX-waarden moesten worden gewijzigd om ADC0 te gebruiken

ADCSRA |= (1 << ADFR); // Stel ADC in op vrijloopmodus

ADCSRA |= (1 << ADEN); // Schakel ADC in

ADCSRA |= (1 << ADSC); // Start A2D-conversies terwijl (1) // Loop Forever

{

if(ADCH > ADCWaarde)

{

PORTB |= (1 << PB0); // Schakel LED1 in

}

anders

{

PORTE &= ~(1 << PB1); // Schakel LED1 uit

}

}

retourneer 0;

}

Publiceer eerst deze tutorial Klik hier

Aanbevolen: