Inhoudsopgave:
- Stap 1: Beschrijving:
- Stap 2: AVR-timers - PWM-modus
- Stap 3: Lichtintensiteitsmeting - ADC & LDR
- Stap 4: Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N
- Stap 5: Code schrijven voor een programma in C. HEX-bestand uploaden naar het flashgeheugen van de microcontroller
- Stap 6: Het elektrische circuit
Video: AVR-microcontroller. Pulsbreedtemodulatie. СController van DC-motor en LED-lichtintensiteit: 6 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
Dag iedereen!
Pulsbreedtemodulatie (PWM) is een veel voorkomende techniek in telecommunicatie en vermogensregeling. het wordt vaak gebruikt om de stroomtoevoer naar een elektrisch apparaat te regelen, of het nu een motor, een LED, luidsprekers, enz. is. Het is in feite een modulatietechniek, waarbij de breedte van de draaggolfpuls wordt gevarieerd in overeenstemming met het analoge berichtsignaal.
We maken een eenvoudig elektrisch circuit om de rotatiesnelheid van de DC-motor afhankelijk van de lichtintensiteit te regelen. We gaan Light Dependent Resistor en AVR-microcontroller-functies zoals analoog naar digitaal conversie gebruiken om de lichtintensiteit te meten. We gaan ook de Dual H-Bridge Motor Driver Module-L298N gebruiken. Het wordt meestal gebruikt voor het regelen van de snelheid en richting van motoren, maar kan ook worden gebruikt voor andere projecten, zoals het aansturen van de helderheid van bepaalde verlichtingsprojecten. Ook een knop toegevoegd aan ons circuit om de draairichting van de motor te wisselen.
Stap 1: Beschrijving:
Elk lichaam in deze wereld heeft enige traagheid. De motor draait wanneer deze wordt ingeschakeld. Zodra het wordt uitgeschakeld, zal het de neiging hebben om te stoppen. Maar het stopt niet meteen, het duurt even. Maar voordat het volledig stopt, wordt het weer ingeschakeld! Zo begint het te bewegen. Maar ook nu duurt het even voordat hij op volle toeren draait. Maar voordat het gebeurt, wordt het uitgeschakeld, enzovoort. Het algemene effect van deze actie is dus dat de motor continu draait, maar met een lagere snelheid.
Pulsbreedtemodulatie (PWM) is een relatief recente stroomschakeltechniek voor het leveren van tussenliggende hoeveelheden elektrisch vermogen tussen volledig aan en volledig uit. Gewoonlijk hebben digitale pulsen dezelfde aan en uit tijdsperiode, maar in sommige situaties hebben we de digitale puls nodig om meer/minder aan/uit tijd te hebben. In de PWM-techniek creëren we digitale pulsen met een ongelijke hoeveelheid aan en uit om de vereiste tussenspanningswaarden te krijgen.
De bedrijfscyclus wordt bepaald door het percentage van de duur van de hoogspanning in een volledige digitale puls. Het kan worden berekend door:
% van inschakelduur = T aan /T (periode) x 100
Laten we een probleemstelling nemen. We moeten een 50 Hz PWM-signaal genereren met een inschakelduur van 45%.
Frequentie = 50 Hz
Tijdsperiode, T = T(aan) + T(uit) = 1/50 = 0,02 s = 20 ms
Inschakelduur = 45%
Dus, oplossend volgens de bovenstaande vergelijking, krijgen we
T(aan) = 9 ms
T(uit) = 11 ms
Stap 2: AVR-timers - PWM-modus
Voor het maken van PWM bevat AVR aparte hardware! Door dit te gebruiken, instrueert de CPU de hardware om PWM met een bepaalde duty cycle te produceren. De ATmega328 heeft 6 PWM-uitgangen, 2 bevinden zich op timer/counter0 (8bit), 2 bevinden zich op timer/counter1 (16bit) en 2 bevinden zich op timer/counter2 (8bit). Timer/Counter0 is het eenvoudigste PWM-apparaat op de ATmega328. Timer/Counter0 kan op 3 modi draaien:
- Snelle PWM
- Fase en frequentie gecorrigeerde PWM
- Fasegecorrigeerde PWM
elk van deze modi kan geïnverteerd of niet-geïnverteerd zijn.
Initialiseer Timer0 in PWM-modus:
TCCR0A |=(1 << WGM00)|(1 << WGM01) - WGM instellen: Snelle PWM
TCCR0A |= (1 << COM0A1)|(1 << COM0B1) - vergelijk uitgangsmodus A, B instellen
TCCR0B |= (1 << CS02) - timer instellen met prescaler = 256
Stap 3: Lichtintensiteitsmeting - ADC & LDR
Light Dependent Resistor (LDR) is een transducer die zijn weerstand verandert wanneer licht op het oppervlak verandert.
LDR's zijn gemaakt van halfgeleidermaterialen zodat ze hun lichtgevoelige eigenschappen hebben. Deze LDR's of FOTOWEERSTANDEN werken volgens het principe van "Photo Conductivity". Wat dit principe zegt, is dat wanneer licht op het oppervlak van de LDR valt (in dit geval) de geleiding van het element toeneemt of met andere woorden de weerstand van de LDR afneemt wanneer het licht op het oppervlak van de LDR valt. Deze eigenschap van de afname in weerstand voor de LDR wordt bereikt omdat het een eigenschap is van halfgeleidermateriaal dat op het oppervlak wordt gebruikt. LDR wordt meestal gebruikt om de aanwezigheid van licht te detecteren of om de intensiteit van licht te meten.
Voor het overbrengen van externe continue informatie (analoge informatie) naar een digitaal/computersysteem, moeten we deze omzetten in gehele (digitale) waarden. Dit type conversie wordt uitgevoerd door analoog naar digitaal converter (ADC). Het proces van het omzetten van een analoge waarde in een digitale waarde staat bekend als analoog naar digitaal conversie. Kortom, analoge signalen zijn signalen uit de echte wereld om ons heen, zoals geluid en licht.
Digitale signalen zijn analoge equivalenten in digitaal of numeriek formaat die goed worden begrepen door digitale systemen zoals microcontrollers. ADC is zo'n hardware die analoge signalen meet en een digitaal equivalent van hetzelfde signaal produceert. AVR-microcontrollers hebben een ingebouwde ADC-faciliteit om analoge spanning om te zetten in een geheel getal. AVR zet het om in een 10-bits nummer met een bereik van 0 tot 1023.
We gebruiken analoog naar digitaal converteren van het spanningsniveau van het scheidingscircuit met LDR om de lichtintensiteit te meten.
ADC initialiseren:
TADCSRA |= (1<<ADEN) - ADC inschakelen
ADCSRA |= (1<<ADPS2)| (1<<ADPS1)| (1ADPS0) - ADC-prescaler instellen = 128
ADMUX = (1 << REFS0) - spanningsreferentie instellen = AVCC; - Ingangskanaal instellen = ADC0
Bekijk de video met een gedetailleerde beschrijving van de ADC AVR microcontroller: AVR Microcontroller. Lichtintensiteitsmeting. ADC & LDR
Stap 4: Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N
We gebruiken DC-motordrivers omdat microcontrollers niet in staat zijn om in het algemeen niet meer dan 100 milliampère te leveren. De microcontrollers zijn slim maar niet sterk; deze module voegt wat spieren toe aan microcontrollers om krachtige gelijkstroommotoren aan te drijven. Het kan 2 gelijkstroommotoren gelijktijdig aansturen tot 2 ampère elk of één stappenmotor. We kunnen de snelheid regelen met behulp van PWM en ook de draairichting van de motoren. Het werd ook gebruikt voor het aansturen van de helderheid van LED-tape.
Speldbeschrijving:
OUT1- en OUT2-poort, die bedoeld is voor het aansluiten van een DC-motor. OUT3 en OUT4 voor het aansluiten van LED-tape.
ENA en ENB zijn enable-pinnen: door ENA op high (+5V) aan te sluiten, worden de poorten OUT1 en OUT2 ingeschakeld.
Als u de ENA-pin op low (GND) aansluit, worden de OUT1 en OUT2 uitgeschakeld. Hetzelfde geldt voor ENB en OUT3 en OUT4.
IN1 tot IN4 zijn de ingangspinnen die worden aangesloten op de AVR.
Als IN1-hoog (+5V), IN2-laag (GND), wordt de OUT1 hoog en OUT2 laag, dus we kunnen de motor aandrijven.
Als IN3-hoog (+5V), IN4-laag (GND), wordt de OUT4 hoog en OUT3 laag, dus het LED-tapelicht is aan.
Als u de draairichting van de motor wilt omkeren, moet u de polariteit IN1 en IN2 omkeren, net als voor IN3 en IN4.
Door PWM-signaal toe te passen op ENA en ENB kunt u de snelheid van de motoren op twee verschillende uitgangspoorten regelen.
Het bord kan nominaal 7V tot 12V accepteren.
Jumpers: Er zijn drie jumperpinnen; Jumper 1: Als uw motor meer dan 12V voeding nodig heeft, moet u de Jumper 1 loskoppelen en de gewenste spanning (max. 35V) op de 12V-klem aanbrengen. Breng nog een 5V-voeding en invoer op de 5V-terminal. Ja, u moet 5V invoeren als u meer dan 12V moet toepassen (wanneer Jumper 1 is verwijderd).
De 5V-ingang is voor een goede werking van het IC, aangezien het verwijderen van de jumper de ingebouwde 5V-regelaar zal uitschakelen en zal beschermen tegen een hogere ingangsspanning van de 12V-aansluiting.
De 5V-aansluiting fungeert als uitgang als uw voeding tussen 7V en 12V ligt en fungeert als ingang als u meer dan 12V toepast en de jumper is verwijderd.
Jumper 2 en Jumper 3: Als u deze twee jumpers verwijdert, moet u het in- en uitschakelsignaal van de microcontroller invoeren, de meeste gebruikers geven er de voorkeur aan om de twee jumpers te verwijderen en het signaal van de microcontroller toe te passen.
Als u de twee jumpers behoudt, zijn de OUT1 tot OUT4 altijd ingeschakeld. Onthoud de ENA-jumper voor OUT1 en OUT2. ENB-jumper voor OUT3 en OUT4.
Stap 5: Code schrijven voor een programma in C. HEX-bestand uploaden naar het flashgeheugen van de microcontroller
Schrijven en bouwen van de AVR-microcontroller-applicatie in C Code met behulp van het Integrated Development Platform - Atmel Studio.
#ifndef F_CPU#define F_CPU 16000000UL // vertelt de kristalfrequentie van de controller (16 MHz AVR ATMega328P) #endif
#include //header om gegevensstroomcontrole over pinnen in te schakelen. Definieert pinnen, poorten, enz. #include //header om de vertragingsfunctie in het programma in te schakelen
#define BUTTON1 2 // knopschakelaar aangesloten op poort B pin 2 #define DEBOUNCE_TIME 25 // tijd om te wachten tijdens "de-bouncing" knop #define LOCK_INPUT_TIME 300 // tijd om te wachten na een druk op de knop
// Timer0, PWM-initialisatie void timer0_init() {// stel timer OC0A, OC0B-pin in in toggle-modus en CTC-modus TCCR0A |= (1 << COM0A1)|(1 << COM0B1)|(1 << WGM00)| (1 << WGM01); // timer instellen met prescaler = 256 TCCR0B |= (1 << CS02); // initialiseer teller TCNT0 = 0; // initialiseer vergelijk waarde OCR0A = 0; }
// ADC-initialisatie ongeldig ADC_init() {// ADC inschakelen, bemonstering freq=osc_freq/128 prescaler instellen op maximale waarde, 128 ADCSRA |= (1<<ADEN) | (1<<ADPS2)| (1<< ADPS1)| (1<<ADPS0);
ADMUX = (1<<REFS0); // Selecteer spanningsreferentie (AVCC)
// Knop schakelaar status unsigned char button_state () {
/* de knop wordt ingedrukt wanneer BUTTON1 bit leeg is */
als (!(pincode & (1<
{
_delay_ms(DEBOUNCE_TIME);
als (!(pincode & (1<
}
retourneer 0;
}
// Poorteninitialisatie void port_init () {DDRB = 0b00011011; //PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - KNOPSCHAKELAAR DIRECTE POORTB=0b00010110;
DDRD =0b01100000; //PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD=0b00000000;
DDRC =0b00000000; // PC0-ADC PORTC=0b00000000; // Stel alle pinnen van PORTC laag in, waardoor het wordt uitgeschakeld. }
// Deze functie leest de waarde van de analoog naar digitaal om. uint16_t get_LightLevel() { _delay_ms(10); // Wacht enige tijd totdat het kanaal is geselecteerd ADCSRA |= (1<<ADSC); // Start de ADC-conversie door het ADSC-bit in te stellen. Schrijf 1 naar ADSC
while(ADCSRA & (1<<ADSC)); // Wacht tot de conversie is voltooid
// ADSC wordt tot die tijd weer 0, loop continu _delay_ms (10); retour (ADC); // Retourneer het 10-bits resultaat
}
// Deze functie wijst een nummer van het ene bereik (0-1023) opnieuw toe aan het andere (0-100). uint32_t map (uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
int hoofd(void)
{ uint16_t i1=0;
poort_init();
timer0_init(); ADC_init(); // initialisatie ADC
terwijl (1)
{ i1=kaart(get_LightLevel(), 0, 1023, 0, 100);
OCR0A=i1; // Set output vergelijk register kanaal A OCR0B = 100-i1; // Set output vergelijk register kanaal B (omgekeerd)
if (button_state()) // Als de knop wordt ingedrukt, schakelt u de status en vertraging van de LED in voor 300 ms (#define LOCK_INPUT_TIME) { PORTB ^= (1<<0); // omschakelen van de huidige status van de pin IN1. PORTB ^= (1<<1); // omschakelen van de huidige status van de pin IN2. Keer de draairichting van de motor om
PORTB ^= (1<<3); // schakelen tussen de huidige status van de pin IN3. PORTB ^= (1<<4); // schakelen tussen de huidige status van de pin IN4. LED-tape is aan/uit. _delay_ms(LOCK_INPUT_TIME); } }; retour (0); }
De programmering is voltooid. Vervolgens bouwt en compileert u de projectcode in een hex-bestand.
HEX-bestand uploaden naar het flashgeheugen van de microcontroller: typ in het DOS-promptvenster de opdracht:
avrdude –c [naam van programmeur] –p m328p –u –U flash:w:[naam van uw hex-bestand]
In mijn geval is het:
avrdude –c ISPProgv1 –p m328p –u –U flash:w:PWM.hex
Deze opdracht schrijft een hex-bestand naar het geheugen van de microcontroller. Bekijk de video met een gedetailleerde beschrijving van het branden van microcontroller-flashgeheugen: Microcontroller-flashgeheugen branden…
OK! Nu werkt de microcontroller volgens de instructies van ons programma. Laten we het bekijken!
Stap 6: Het elektrische circuit
Componenten aansluiten volgens schema.
Aanbevolen:
Visuino Pulsbreedtemodulatie (PWM) gebruiken om de helderheid van een LED te wijzigen: 7 stappen
Visuino Pulse Width Modulation (PWM) gebruiken om de helderheid van een LED te wijzigen: In deze tutorial zullen we een LED gebruiken die is aangesloten op Arduino UNO en Visuino om de helderheid te wijzigen met behulp van Pulse Width Modulation (PWM). Bekijk een demonstratievideo
Visuino RAMPS voor pulsbreedtemodulatie (PWM) met behulp van LED - Ajarnpa
Visuino RAMPS voor Pulse Width Modulation (PWM) met behulp van LED: In deze tutorial zullen we een LED gebruiken die is aangesloten op Arduino UNO en Visuino om de LED te dimmen met behulp van Pulse Width Modulation (PWM) en Ramps-component. Bekijk een demonstratievideo
Live bewaking van de waarde van uw sensor van overal ter wereld: 4 stappen
Live monitoring van de waarde van uw sensor van overal ter wereld: ik kreeg een bericht op het WhatsApp-nummer van techneuten met betrekking tot hulp bij het maken van één project. Het project was om de druk op de druksensor te meten en deze op een smartphone weer te geven. Dus ik hielp bij het maken van dat project en besloot een bijlesdocent te maken
Eenvoudige (en vuile) pulsbreedtemodulatie (PWM) met 555-timer - Ajarnpa
Eenvoudige (en vuile) pulsbreedtemodulatie (PWM) met 555 Timer: Eenvoudig circuit voor DC-motorsnelheidsregeling (ventilatorsnelheidsregeling, licht / LED-dimmen en enz.) Met behulp van de 555-timer. Ook een goed startpunt voor beginners die hun handen vuil met de 555 timer IC. Sommigen zouden beweren dat dit niet de meest
Instructies voor het voltooien van de mock-up van het ontwerp van de rupsschuif voor het heffen/verlagen van in het midden gemonteerde voetsteunen op elektrische rolstoelen - Ajarnpa
Instructies voor het voltooien van de mock-up van het ontwerp van de rupsschuif voor het omhoog/omlaag brengen van in het midden gemonteerde voetsteunen op elektrische rolstoelen: in het midden gemonteerde voetsteunen kunnen omhoog worden gebracht om onder de zitting goed te worden opgeborgen en omlaag om te worden ingezet. Een mechanisme voor onafhankelijke bediening van het opbergen en plaatsen van de voetsteun is niet inbegrepen in elektrische rolstoelen op de markt, en PWC-gebruikers hebben de behoefte geuit