Forum: Mikrocontroller und Digitale Elektronik ADC-gesteuerte PWM mit LED-Anzeige


von Stu S. (stussy)


Lesenswert?

#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 16000000UL                            // Annahme von 16 
MHz Takt

void ADC_Init() {
  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); 
// ADC aktivieren, Prescaler auf 128 setzen
  ADMUX = (1 << REFS0);                            // Referenzspannung 
auf AVCC setzen
}

uint16_t ADC_Read(uint8_t channel) {
  ADMUX = (ADMUX & 0xF0) | (channel & 0x0F);                  // 
ADC-Kanal auswählen
  ADCSRA |= (1 << ADSC);                            // Starte 
ADC-Konvertierung
  while (ADCSRA & (1 << ADSC));                        // Warte, bis 
Konvertierung abgeschlossen ist
  return ADC;                                  // Gib den ADC-Wert 
zurück
}

void PWM_Init() {
  TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);            // 
Fast PWM-Modus konfigurieren
  TCCR0B = (1 << CS01);                            // Prescaler auf 8 
setzen
  DDRD |= (1 << PD6);                              // PD6 (Pin 6) als 
PWM-Ausgang setzen
}

void SetPWM(uint8_t dutyCycle) {
  OCR0A = dutyCycle;                              // PWM Duty Cycle 
setzen
}

int main(void) {
  ADC_Init();                                  // ADC initialisieren
  PWM_Init();                                  // PWM initialisieren
  DDRH |= (1 << PH6) | (1 << PH5);                      // PH6 und PH5 
als Ausgänge für LEDs setzen

  while (1) {
    uint16_t adcValue = ADC_Read(0);                    // ADC-Wert vom 
Potentiometer lesen
    uint8_t dutyCycle = adcValue >> 2;                    // Duty Cycle 
berechnen (Rechtsschiebeoperation um 2 Bits)

    // LED an PH6 steuern (statt PB7)
    if (dutyCycle >= 64) {
      PORTH |= (1 << PH6);                        // Setze das Bit für 
den Pin PH6
      } else {
      PORTH &= ~(1 << PH6);                        // Lösche das Bit für 
den Pin PH6
    }

    // LED an PH5 ein-/ausschalten, wenn Duty Cycle zwischen 40% und 50% 
liegt
    if (dutyCycle >= 40 && dutyCycle <= 50) {
      PORTH |= (1 << PH5);                        // Setze das Bit für 
den Pin PH5
      } else {
      PORTH &= ~(1 << PH5);                        // Lösche das Bit für 
den Pin PH5
    }

    SetPWM(dutyCycle);                            // PWM Duty Cycle 
setzen

    _delay_ms(100);                                     // Kurze Pause 
für Stabilität
  }

  return 0;
}

von Rahul D. (rahul)


Lesenswert?

Aus dem Hinweistext:
1. Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
2.
1
C-Code

von Sebastian R. (sebastian_r569)


Lesenswert?

Denkst du nicht, dass etwas mehr Kontext sinnvoll wäre, anstatt uns 
einfach nur deinen unformatierten Quelltext aus ChatGPT hier 
hinzurotzen?

: Bearbeitet durch User
von Michael P. (Firma: n.a.) (micha1102)


Lesenswert?

Stu S. schrieb:
> #include <avr/io.h>
> ...

Ob die Forenbetreiber hier ahnen was auf sie so zukommt?
Vielleicht ist es ja schon ein AI-Agent, der hier selbständig postet.

Die nächsten Agenten desselben Kalibers beginnen dann mit der 
Kommentierung. Das wird noch lustig...

von Alexander (alecxs)


Lesenswert?

SPAM - Thread und User löschen und gut.

von Georg M. (g_m)


Lesenswert?

Sieht aus wie ein Code für obsolete AVR-Mikrocontroller.

von Sebastian R. (sebastian_r569)


Lesenswert?

Georg M. schrieb:
> für obsolete AVR-Mikrocontroller.

Welche konkreten Modelle sind denn obsolet?

von Stu S. (stussy)


Lesenswert?

tut mir leid für dich dass mein C++ Code dich so stört. Habe vergessen 
Text hinzuzufügen, das meinen Beitrag erklärt. Ist immerhin auch mein 
erster Beitrag, also Dont Blame me <3

: Bearbeitet durch User
von Sebastian R. (sebastian_r569)


Lesenswert?

Stu S. schrieb:
> Habe vergessen Text hinzuzufügen, das meinen Beitrag erklärt.

Und leider hast du es auch in deinem zweiten Beitrag vergessen :(

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.