Inhaltsverzeichnis:

AVR-Mikrocontroller. Pulsweitenmodulation. СController von DC-Motor und LED-Lichtintensität. - Gunook
AVR-Mikrocontroller. Pulsweitenmodulation. СController von DC-Motor und LED-Lichtintensität. - Gunook

Video: AVR-Mikrocontroller. Pulsweitenmodulation. СController von DC-Motor und LED-Lichtintensität. - Gunook

Video: AVR-Mikrocontroller. Pulsweitenmodulation. СController von DC-Motor und LED-Lichtintensität. - Gunook
Video: Hardware Counter [08 | AVR - Mikrocontroller C] by Fusel 2024, November
Anonim
Image
Image

Hallo alle zusammen!

Pulsweitenmodulation (PWM) ist eine sehr verbreitete Technik in der Telekommunikation und Leistungssteuerung. Es wird üblicherweise verwendet, um die Stromversorgung eines elektrischen Geräts zu steuern, sei es ein Motor, eine LED, Lautsprecher usw. Es handelt sich im Grunde um eine Modulationstechnik, bei der die Breite des Trägerimpulses in Übereinstimmung mit dem analogen Nachrichtensignal variiert wird.

Wir machen eine einfache elektrische Schaltung, um die Drehzahl des Gleichstrommotors in Abhängigkeit von der Lichtintensität zu steuern. Wir werden lichtabhängige Widerstände und AVR-Mikrocontroller-Funktionen wie die Analog-Digital-Wandlung verwenden, um die Lichtintensität zu messen. Außerdem werden wir das Dual-H-Brücken-Motortreibermodul-L298N verwenden. Es wird normalerweise zur Steuerung von Motordrehzahl und -richtung verwendet, kann aber auch für andere Projekte verwendet werden, z. B. zum Steuern der Helligkeit bestimmter Beleuchtungsprojekte. Außerdem wurde unserer Schaltung eine Schaltfläche hinzugefügt, um die Drehrichtung des Motors umzuschalten.

Schritt 1: Beschreibung

Beschreibung
Beschreibung
Beschreibung
Beschreibung

Jeder Körper auf dieser Welt hat eine gewisse Trägheit. Der Motor dreht sich, wenn er eingeschaltet wird. Sobald es ausgeschaltet wird, neigt es dazu, zu stoppen. Aber es hört nicht sofort auf, es dauert einige Zeit. Aber bevor es vollständig stoppt, wird es wieder eingeschaltet! So beginnt es sich zu bewegen. Aber auch jetzt dauert es einige Zeit, bis es seine volle Geschwindigkeit erreicht. Aber bevor es passiert, wird es ausgeschaltet und so weiter. Der Gesamteffekt dieser Aktion besteht also darin, dass sich der Motor kontinuierlich dreht, jedoch mit einer geringeren Geschwindigkeit.

Pulsweitenmodulation (PWM) ist eine vergleichsweise neue Leistungsschalttechnik zum Bereitstellen von Zwischenmengen elektrischer Leistung zwischen vollständig eingeschalteten und vollständig ausgeschalteten Pegeln. Normalerweise haben digitale Pulse die gleiche Ein- und Ausschaltzeit, aber in einigen Situationen müssen wir den digitalen Puls mehr/weniger Ein-/Auszeit haben. Bei der PWM-Technik erzeugen wir digitale Impulse mit ungleicher Anzahl von Ein- und Aus-Zustand, um die erforderlichen Zwischenspannungswerte zu erhalten.

Das Tastverhältnis wird durch den Prozentsatz der Hochspannungsdauer in einem vollständigen digitalen Impuls definiert. Es kann berechnet werden nach:

% des Arbeitszyklus = T on /T (Periodenzeit) x 100

Nehmen wir eine Problemstellung. Wir müssen ein 50-Hz-PWM-Signal mit einem Arbeitszyklus von 45% erzeugen.

Frequenz = 50 Hz

Zeitdauer, T = T(ein) + T(aus) = 1/50 = 0,02 s = 20 ms

Arbeitszyklus = 45%

Wenn wir also nach der oben angegebenen Gleichung auflösen, erhalten wir

T(ein) = 9 ms

T(aus) = 11 ms

Schritt 2: AVR-Timer – PWM-Modus

AVR-Timer – PWM-Modus
AVR-Timer – PWM-Modus
AVR-Timer – PWM-Modus
AVR-Timer – PWM-Modus

Um PWM zu machen, enthält AVR separate Hardware! Dadurch weist die CPU die Hardware an, PWM mit einem bestimmten Arbeitszyklus zu erzeugen. Der ATmega328 hat 6 PWM-Ausgänge, 2 befinden sich auf Timer/Counter0 (8bit), 2 befinden sich auf Timer/Counter1 (16bit) und 2 befinden sich auf Timer/Counter2 (8bit). Timer/Counter0 ist das einfachste PWM-Gerät auf dem ATmega328. Timer/Counter0 kann in 3 Modi ausgeführt werden:

  • Schnelle PWM
  • Phasen- und frequenzkorrigierte PWM
  • Phasenkorrigierte PWM

jeder dieser Modi kann invertiert oder nicht invertiert sein.

Timer0 im PWM-Modus initialisieren:

TCCR0A |=(1 << WGM00)|(1 << WGM01) - WGM einrichten: Fast PWM

TCCR0A |= (1 << COM0A1)|(1 << COM0B1) - Vergleichsausgangsmodus A, B. einrichten

TCCR0B |= (1 << CS02) - Timer mit Prescaler einrichten = 256

Schritt 3: Lichtintensitätsmessung - ADC & LDR

Lichtintensitätsmessung - ADC & LDR
Lichtintensitätsmessung - ADC & LDR
Lichtintensitätsmessung - ADC & LDR
Lichtintensitätsmessung - ADC & LDR
Lichtintensitätsmessung - ADC & LDR
Lichtintensitätsmessung - ADC & LDR

Der lichtabhängige Widerstand (LDR) ist ein Wandler, der seinen Widerstand ändert, wenn Licht auf seine Oberfläche fällt.

LDRs werden aus Halbleitermaterialien hergestellt, damit sie ihre lichtempfindlichen Eigenschaften haben. Diese LDRs oder FOTOWIDERSTÄNDE arbeiten nach dem Prinzip der „Fotoleitfähigkeit“. Dieses Prinzip besagt nun, dass jedes Mal, wenn Licht auf die Oberfläche des LDR fällt (in diesem Fall), die Leitfähigkeit des Elements steigt, oder anders ausgedrückt, der Widerstand des LDR sinkt, wenn das Licht auf die Oberfläche des LDR fällt. Diese Eigenschaft der Widerstandsverringerung für den LDR wird erreicht, weil sie eine Eigenschaft des auf der Oberfläche verwendeten Halbleitermaterials ist. LDR werden meistens verwendet, um das Vorhandensein von Licht zu erkennen oder die Lichtintensität zu messen.

Um externe kontinuierliche Informationen (analoge Informationen) in ein digitales/Computersystem zu übertragen, müssen wir sie in ganzzahlige (digitale) Werte umwandeln. Diese Art der Umwandlung wird von einem Analog-Digital-Wandler (ADC) durchgeführt. Das Umwandeln eines Analogwerts in einen Digitalwert wird als Analog-Digital-Wandlung bezeichnet. Kurz gesagt, analoge Signale sind reale Signale um uns herum wie Ton und Licht.

Digitale Signale sind analoge Äquivalente im digitalen oder numerischen Format, die von digitalen Systemen wie Mikrocontrollern gut verstanden werden. ADC ist eine solche Hardware, die analoge Signale misst und ein digitales Äquivalent desselben Signals erzeugt. AVR-Mikrocontroller verfügen über eine eingebaute ADC-Funktion, um analoge Spannungen in eine ganze Zahl umzuwandeln. AVR wandelt es in eine 10-Bit-Zahl im Bereich von 0 bis 1023 um.

Wir verwenden die Analog-Digital-Umwandlung des Spannungspegels von der Teilerschaltung mit LDR, um die Lichtintensität zu messen.

ADC initialisieren:

TADCSRA |= (1<<ADEN) - ADC aktivieren

ADCSRA |= (1<<ADPS2)| (1<<ADPS1)| (1ADPS0) - ADC-Prescaler einrichten = 128

ADMUX = (1 << REFS0) - Spannungsreferenz einrichten = AVCC; - Eingangskanal einrichten = ADC0

Sehen Sie sich das Video mit einer detaillierten Beschreibung des ADC AVR-Mikrocontrollers an: AVR-Mikrocontroller. Messung der Lichtintensität. ADC & LDR

Schritt 4: Controller-DC-Motor und Dual-H-Brücken-Motortreibermodul-L298N

Controller-DC-Motor und Dual-H-Brücken-Motortreibermodul-L298N
Controller-DC-Motor und Dual-H-Brücken-Motortreibermodul-L298N
Controller-DC-Motor und Dual-H-Brücken-Motortreibermodul-L298N
Controller-DC-Motor und Dual-H-Brücken-Motortreibermodul-L298N
Controller-DC-Motor und Dual-H-Brücken-Motortreibermodul-L298N
Controller-DC-Motor und Dual-H-Brücken-Motortreibermodul-L298N

Wir verwenden DC-Motortreiber, da Mikrocontroller im Allgemeinen keinen Strom von nicht mehr als 100 Milliampere liefern können. Die Mikrocontroller sind intelligent, aber nicht stark; Dieses Modul wird Mikrocontrollern einige Muskeln hinzufügen, um Hochleistungs-DC-Motoren anzutreiben. Es kann 2 Gleichstrommotoren gleichzeitig mit jeweils bis zu 2 Ampere oder einen Schrittmotor steuern. Wir können die Geschwindigkeit mit PWM und auch die Drehrichtung der Motoren steuern. Es wird auch zum Ansteuern der Helligkeit von LED-Band verwendet.

Pin-Beschreibung:

OUT1- und OUT2-Port, der zum Anschluss des Gleichstrommotors dient. OUT3 und OUT4 zum Anschluss von LED-Band.

ENA und ENB sind Enable-Pins: Durch Verbinden von ENA mit High (+5V) werden die Ports OUT1 und OUT2 aktiviert.

Wenn Sie den ENA-Pin mit Low (GND) verbinden, werden OUT1 und OUT2 deaktiviert. Ebenso für ENB und OUT3 und OUT4.

IN1 bis IN4 sind die Eingangspins, die mit dem AVR verbunden werden.

Wenn IN1-high (+5V), IN2-low (GND), wird OUT1 hoch und OUT2 wird niedrig, sodass wir den Motor antreiben können.

Wenn IN3-high (+5V), IN4-low(GND), wird OUT4 auf High und OUT3 auf Low, also ist das LED-Bandlicht an.

Wenn Sie die Drehrichtung des Motors umkehren möchten, kehren Sie einfach die Polarität von IN1 und IN2 um, ähnlich für IN3 und IN4.

Durch Anlegen eines PWM-Signals an ENA und ENB können Sie die Geschwindigkeit der Motoren an zwei verschiedenen Ausgangsanschlüssen steuern.

Die Platine kann nominell 7 V bis 12 V aufnehmen.

Jumper: Es gibt drei Jumper-Pins; Jumper 1: Wenn Ihr Motor mehr als 12 V benötigt, müssen Sie Jumper 1 trennen und die gewünschte Spannung (max. 35 V) an die 12 V-Klemme anlegen. Bringen Sie eine weitere 5-V-Versorgung und einen Eingang an der 5-V-Klemme. Ja, Sie müssen 5 V eingeben, wenn Sie mehr als 12 V anlegen müssen (wenn Jumper 1 entfernt ist).

Der 5-V-Eingang dient der ordnungsgemäßen Funktion des ICs, da das Entfernen des Jumpers den eingebauten 5-V-Regler deaktiviert und vor einer höheren Eingangsspannung von der 12-V-Klemme schützt.

Die 5-V-Klemme fungiert als Ausgang, wenn Ihre Versorgung zwischen 7 V und 12 V liegt, und fungiert als Eingang, wenn Sie mehr als 12 V anlegen und der Jumper entfernt wurde.

Jumper 2 und Jumper 3: Wenn Sie diese beiden Jumper entfernen, müssen Sie das Aktivierungs- und Deaktivierungssignal vom Mikrocontroller eingeben. Die meisten Benutzer ziehen es vor, die beiden Jumper zu entfernen und das Signal vom Mikrocontroller anzulegen.

Wenn Sie die beiden Jumper behalten, sind OUT1 bis OUT4 immer aktiviert. Denken Sie an den ENA-Jumper für OUT1 und OUT2. ENB-Jumper für OUT3 und OUT4.

Schritt 5: Schreiben von Code für ein Programm in C. Hochladen der HEX-Datei in den Mikrocontroller-Flash-Speicher

Schreiben und Erstellen der AVR-Mikrocontroller-Anwendung in C-Code mit der integrierten Entwicklungsplattform - Atmel Studio.

#ifndef F_CPU#define F_CPU 16000000UL // Angabe der Quarzfrequenz des Controllers (16 MHz AVR ATMega328P) #endif

#include //Header, um die Datenflusskontrolle über Pins zu ermöglichen. Definiert Pins, Ports usw. #include //header, um die Verzögerungsfunktion im Programm zu aktivieren

#define BUTTON1 2 // Tastenschalter an Port B Pin 2 angeschlossen #define DEBOUNCE_TIME 25 // Wartezeit beim "Entprellen" Taste #define LOCK_INPUT_TIME 300 // Wartezeit nach einem Tastendruck

// Timer0, PWM-Initialisierung void timer0_init () { // Timer OC0A, OC0B-Pin im Toggle-Modus und CTC-Modus einrichten TCCR0A |= (1 << COM0A1)|(1 << COM0B1)|(1 << WGM00)| (1 << WGM01); // Timer mit Prescaler einrichten = 256 TCCR0B |= (1 << CS02); // Zähler initialisieren TCNT0 = 0; // Vergleichswert initialisieren OCR0A = 0; }

// ADC-Initialisierung void ADC_init() { // ADC aktivieren, Sampling freq=osc_freq/128 Prescaler auf maximalen Wert setzen, 128 ADCSRA |= (1<<ADEN) | (1<<ADPS2)| (1<< ADPS1)| (1<<ADPS0);

ADMUX = (1<<REFS0); // Spannungsreferenz (AVCC) auswählen

// Schalterstatus unsigned char button_state() {

/* die Taste wird gedrückt, wenn das BUTTON1-Bit gelöscht ist */

if (!(PINB & (1<

{

_delay_ms(DEBOUNCE_TIME);

if (!(PINB & (1<

}

0 zurückgeben;

}

// Port-Initialisierung void port_init () { DDRB = 0b00011011; //PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - TASTE SCHALTER DIREKT PORTB=0b00010110;

DDRD = 0b01100000; //PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD=0b00000000;

DDRC = 0b00000000; // PC0-ADC-PORTC=0b00000000; // Setzen Sie alle Pins von PORTC auf niedrig, wodurch es ausgeschaltet wird. }

// Diese Funktion liest den Wert der Analog-Digital-Konvertierung. uint16_t get_LightLevel() { _delay_ms(10); // Warten Sie einige Zeit, bis der Kanal ausgewählt ist ADCSRA |= (1<<ADSC); // Starten Sie die ADC-Konvertierung, indem Sie das ADSC-Bit setzen. Schreiben Sie 1 in ADSC

while(ADCSRA & (1<<ADSC)); // Warten Sie, bis die Konvertierung abgeschlossen ist

// ADSC wird bis dahin wieder 0, Schleife kontinuierlich ausführen _delay_ms(10); zurück (ADC); // Rückgabe des 10-Bit-Ergebnisses

}

// Diese Funktion ordnet eine Zahl von einem Bereich (0-1023) zu einem anderen (0-100) neu zu. 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 main(void)

{ uint16_t i1=0;

port_init();

timer0_init(); ADC_init(); // Initialisierung ADC

während (1)

{ i1=map(get_LightLevel(), 0, 1023, 0, 100);

OCR0A=i1; // Setze Ausgang Vergleichsregister Kanal A OCR0B=100-i1; // Ausgangsvergleichsregister Kanal B setzen (invertiert)

if (button_state()) // Wenn die Taste gedrückt wird, schalten Sie den Status der LED um und verzögern Sie 300ms (#define LOCK_INPUT_TIME) { PORTB ^= (1<<0); // Umschalten des aktuellen Zustands des Pins IN1. PORTB ^= (1<<1); // Umschalten des aktuellen Zustands des Pins IN2. Drehrichtung des Motors umkehren

PORTB ^= (1<<3); // Umschalten des aktuellen Zustands des Pins IN3. PORTB ^= (1<<4); // Umschalten des aktuellen Zustands des Pins IN4. LED-Band ist aus-/eingeschaltet. _delay_ms(LOCK_INPUT_TIME); } }; zurück (0); }

Die Programmierung ist abgeschlossen. Als nächstes erstellen und kompilieren Sie den Projektcode in eine Hex-Datei.

Hochladen der HEX-Datei in den Flash-Speicher des Mikrocontrollers: Geben Sie im DOS-Eingabeaufforderungsfenster den Befehl ein:

avrdude –c [Name des Programmierers] –p m328p –u –U flash:w:[Name deiner Hex-Datei]

In meinem Fall ist es:

avrdude –c ISPProgv1 –p m328p –u –U flash:w:PWM.hex

Dieser Befehl schreibt eine Hex-Datei in den Speicher des Mikrocontrollers. Sehen Sie sich das Video mit einer detaillierten Beschreibung des Brennens des Mikrocontroller-Flash-Speichers an: Brennen des Mikrocontroller-Flash-Speichers…

Okay! Nun arbeitet der Mikrocontroller gemäß den Anweisungen unseres Programms. Schauen wir es uns an!

Schritt 6: Der Stromkreis

Der Stromkreis
Der Stromkreis
Der Stromkreis
Der Stromkreis

Komponenten gemäß Schaltplan anschließen.

Empfohlen: