ADC-gesteuerte PWM mit LED-Anzeige

OP #8014005
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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)

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

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren