Forum: Projekte & Code ADC-gesteuerte PWM mit LED-Anzeige


von Stu S. (stussy)


Angehängte Dateien:

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.

von N. M. (mani)


Lesenswert?

Ohne die "Qualität" des Codes beurteilen zu wollen 2 Anmerkungen dazu:
Für was für einen Controller ist das?
Code als PDF? Warum?

von Georg M. (g_m)


Lesenswert?

N. M. schrieb:
> Für was für einen Controller ist das?

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

Beitrag #8014110 wurde von einem Moderator gelöscht.
von Rahul D. (rahul)


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?

von Sebastian R. (sebastian_r569)


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)

von Crazy Harry (crazy_h)


Lesenswert?

@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.
von Georg M. (g_m)


Lesenswert?

Rahul D. schrieb:
> Was ist daran kryptografisch?

Alles.

Rahul D. schrieb:
> Sind dir magic numbers lieber, für die man erstmal die Namen und
> Bedeutungen der Bitpositionen bestimmen muss?

Nein, genau umgekehrt, es geht um Namen und Bedeutungen.

Aktuelle Notation z.B.:

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

Beitrag #8014444 wurde von einem Moderator gelöscht.
von Georg M. (g_m)


Lesenswert?

Crazy Harry schrieb:
> ich versuch auch grad mir C beizubringen

Kein Hexenwerk.

https://www.w3schools.com/c/index.php

von Rahul D. (rahul)


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.
von Bauform B. (bauformb)


Lesenswert?

Rahul D. schrieb im Beitrag #8014439:
> 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.
von Crazy Harry (crazy_h)


Lesenswert?

Crazy Harry schrieb:
> die die die Weisheit mit Löffeln gefressen haben

Rahul D. schrieb im Beitrag #8014439:
> Mimimi?! Mit so einer Einstellung kann das nichts werden.

Siehst, da ist einer 😁

Dergute W. schrieb im Beitrag #8014444:
> Ich hab' uebrigens C nach ca. 4 Jahren Pascal angefangen, da fand' ich
> das eher eine Erleichterung.

noch einer


Ist normal hier: Maulen anstatt sagen, wie es richtig geht.

Beitrag #8015144 wurde von einem Moderator gelöscht.
Beitrag #8015477 wurde von einem Moderator gelöscht.
von N. M. (mani)


Lesenswert?

Crazy Harry schrieb im Beitrag #8015477:
> 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.
von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

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.

: Bearbeitet durch Moderator
von Norbert (der_norbert)


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)

von Alexander (alecxs)


Lesenswert?

Frank M. schrieb:
> Da Ihr das bisher nicht geschafft habt, mach ich das mal.

Aber wozu? Der ursprüngliche Thread wurde komplett gelöscht.

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Bauform B. schrieb:
> sizeof(char)

sizeof (char) ist per Definition immer 1 und kann daher weggelassen 
werden.

von Veit D. (devil-elec)


Lesenswert?

Frank M. schrieb:
> 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.

Also Frank, ganz ehrlich, dass noch schön reden zu wollen ist Quatsch. 
Damit fördert man nur solchen Unsinn.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

1
  while (ADCSRA & (1 << ADSC))                                        // Warte, bis Konvertierung abgeschlossen ist
2
    ;

Bin schon garnicht mehr gewohnt kein FreeRT-OS zu haben^^

Oder Rust mit async und await^^

: Bearbeitet durch User
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.