ADC-gesteuerte PWM mit LED-Anzeige

OP #8014005

Das Programm liest über den ADC den Wert eines Potentiometers ein und wandelt ihn in ein PWM-Signal um. Dieses PWM-Signal (an PD6) kann z. B. zur Helligkeits- oder Drehzahlsteuerung verwendet werden. Zusätzlich schaltet es zwei LEDs abhängig vom eingestellten Duty Cycle: eine ab ca. 25 % und eine nur in einem kleinen Bereich zwischen etwa 40–50. Es handelt sich also um eine einfache Potentiometer-zu-PWM-Steuerung mit Statusanzeige.

Angehängte Dateien:
Beitrag #8014110 wurde von einem Moderator gelöscht.
#8014415

Georg M. schrieb:

Der Code ist für einen veralteten AVR-Mikrocontroller bestimmt, daher diese kryptografische Notation:ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);

Was ist daran kryptografisch? Sind dir magic numbers lieber, für die man erstmal die Namen und Bedeutungen der Bitpositionen bestimmen muss?

#8014423

Georg M. schrieb:

Der Code ist für einen veralteten AVR-Mikrocontroller bestimmt, daher diese kryptografische Notation:

Auch moderne AVRs haben diese Notation noch und wenn man sich ein bisschen damit beschäftigt, versteht man die Register- und Bitnamen problemlos.

ADCSRA: ADC Control and Status Register A ADEN: ADC Enable ADSC: ADC Start Conversion ADFR: ADC Free Running Select ADIF: ADC Interrupt Flag ADIE: ADC Interrupt Enable

Nenn mir einen Controller, bei dem die Register intuitiver benannt sind (auf Registerebene, nicht in einem HAL)

#8014432

@TO: Lass dich nicht unterkriegen, mach weiter so. Für dich ist es ein Projekt, für andere, die die die Weisheit mit Löffeln gefressen haben, ein Grund zu stänkern.

+1 (ich versuch auch grad mir C beizubringen, was für ne Schei..e 😁, wenn man fast 40 Jahre Pascal hatte)

Beitrag #8014439 wurde von einem Moderator gelöscht.
Beitrag #8014444 wurde von einem Moderator gelöscht.
#8014446

Georg M. schrieb:

CMP0EN --- Compare Channel 0 Enable WGMODE_SINGLESLOPE --- Waveform Generation Mode: Single-slope PWM

Schöne Makros. Dahinter kann man dann auch die "kryptische Notation" verbergen. Gegen sinnvollen Fortschritt wehrt sich niemand. Die alte Notation basiert auf den Registern und deren Bits, nicht auf der Zielfunktion. Die kann man ggf. halt noch weiter abstrahieren, was Atmel/Microhip inzwischen demnach wohl macht. Im Datenblatt nachgucken, was was macht, muss man eh. Und wenn man nicht mal so einfache Bitschubschreien versteht...

Beitrag #8014452 wurde von einem Moderator gelöscht.
#8014456

Rahul D. schrieb:

Crazy Harry schrieb:

ich versuch auch grad mir C beizubringen, was für ne Schei..e 😁, wenn man fast 40 Jahre Pascal hatte

Mimimi?! Mit so einer Einstellung kann das nichts werden.

Eben, Alfred Arnold hat es mit seinem Universal-Assembler auch geschafft. Heute fällt das kaum noch auf

1
  static char *FileMask;
2
  FileMask = (char*)malloc(sizeof(char) * STRINGSIZE);

Zwischendurch sah es mal so aus:

1
        int main(int argc, char **argv)
2
BEGIN 
3
   char *Env,*ph1,*ph2;
4
   String Dummy;
5
   int i;
6
   static Boolean First=TRUE;
7
   CMDProcessed ParUnprocessed;     /* bearbeitete Kommandozeilenparameter */
8

9
   ParamCount=argc-1; ParamStr=argv;
10

11
   if (First)
12
    BEGIN
13
     endian_init(); nls_init(); bpemu_init(); stdhandl_init();
Beitrag #8014459 wurde von einem Moderator gelöscht.
Beitrag #8015144 wurde von einem Moderator gelöscht.
Beitrag #8015477 wurde von einem Moderator gelöscht.
#8015489

Crazy Harry schrieb:

auch wenn bisher nur gemotzt wurde

Man muss auch unterscheiden zwischen motzen und konstruktiver Kritik bzw. Verbesserungsvorschlägen.

Konstruktive Kritik: Es ist niemandem geholfen den Code hier als PDF anzuhängen. Als reine C Datei, in diesem Fall am besten main.c benannt, wäre hier auf jedenfall besser.

Und was bringt mir der Code wenn ich nicht weiß für was für eine uC er geschrieben wurde? Ich meine das ist kein abstrakter Code den ich durch eine HAL Kapseln könnte. Das ist HAL und Applikation in einem. Also durch die Register Angaben und Header nur für eine begrenzte Menge an uC geeignet. Ohne die Abgabe ist er also ziemlich nutzlos.

Motzen:

Die 50 Zeilen Code die gerade Mal die Basics dieses Forums abbilden als Projekt zu Posten ist überflüssig. In der Artikelsammlung steht das alles schon drin. Gerade mit der speziellen Ausprägung der Schwellwerte kann das so vermutlich kein zweiter brauchen.

Ich denke, man erkennt den Unterschied.

Beitrag #8015670 wurde von einem Moderator gelöscht.
Beitrag #8016287 wurde von einem Moderator gelöscht.
Moderator Persönliche Seite #8016450

Leute, reisst Euch mal zusammen. Der Code im PDF ist immerhin kopierbar, als JPEG nicht. Beides auf die gleiche Stufe zu stellen ist daher nicht ganz fair.

Statt sich hier an Äußerlichkeiten aufzugeilen hätte man doch einfach mal den Source hier als .c anhängen können, oder? Da Ihr das bisher nicht geschafft habt, mach ich das mal.

Angehängte Dateien:
: Bearbeitet durch Moderator
#8016459

Gefällt mir. Scheint etwas ähnliches zu sein wie:

1
#!python
2
# vim: fileencoding=utf-8: ts=4: sw=4: expandtab:
3
#╭──────────────────────────────────────────────────────────────────────────────╮
4
#│      PICO_ADC_PWM_LED.PY                                                     │
5
#╰──────────────────────────────────────────────────────────────────────────────╯
6
from machine import Pin, PWM, ADC
7

8
PWM_GPIO  = const(0)
9
ADC_GPIO  = const(26)
10
LED1_GPIO = const(1)
11
LED2_GPIO = const(2)
12

13
adc = ADC(ADC_GPIO)
14
pwm = PWM(PWM_GPIO,freq=1000,duty_u16=0)
15
led1 = Pin(LED1_GPIO,Pin.OUT,0)
16
led2 = Pin(LED2_GPIO,Pin.OUT,0)
17

18
pct = 2**16/100
19
while True:
20
    analog = adc.read_u16()
21
    pwm.duty_u16(analog)
22
    led1.value(1 if analog > 25*pct else 0)
23
    led2.value(1 if 40*pct < analog < 50*pct else 0)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Monate alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.