Guten Tag, ich will mir eine Unterbodenbeläuchtung für ein Auto (showcar) Bauen. Da ich verschiedene Programe brauche, habe ich mir ein kleines Program für einen µC geschrieben. Da die LEDs nicht einfach ausgehen sollen, sondern "langsam" habe ich einfach einen BUZ11 (der mir in einem anderen anderes Projekt hier empfohlen wurde) hergenommen. Daran hab ich den Elko und einen Widerstand mit 10k gegen Masse gelegt und vor dem µC einen Diode um den zu schützen. So müsste es doch eigentlich klappen oder? gruß Matthias
fieleicht meind der michael das du mahl meer auf deine rechtschreipung achden solltesd?!
achso, ja das höre ich leider öfters. Ich bin Legastheniker. Ich tu mir da schwer. Ich muss mir wohl angewöhnen eine Rechtschreibprüfung zu verwenden!
Die Lösung mit dem Kondensator ist nicht gut, die Helligkeit der LED wird nicht gleichmässig mit der Spannung am Kondensator abnehmen. Vermutlich müsstes Du eher 100 kOhm verwenden. Und beim Einschalten müsster der uC zum Laden des Elkos ein viel zu hoher Strompeek liefern, du solltest noch etwas 330 Ohm in Serie zur Diode schalten, wenn Du nicht möchtest dass der uC-Ausgang schon früh kaputt geht. Mein Vorschlag wäre, dass Du den Elko und die Diode weglässt und die Helligkeit per Software (PWM) steuerst, wenn Du schon ein uC hast! Dann kannst Du Ein- und Ausschaltgeschwindigkeit per SW steuern und sogar während dem Betrieb variieren...
ja ich weiß, dass ein softpwm die elegantere Lösung wäre. Ist aber leider für mich zu schwer zum programmieren :(
Nur Mut, PWM kriegst Du schon hin, da kannst Du auch gleich etwas dazulernen. Hier im Forum findest Du bestimmt Beispiele oder Leute, die Dir mit Programmbeispielen helfen können. Was für einen uC verwendest Du? Welche Programiersprache? was hast Du bisher schon programiert..?
Anbei ein Beispiel für SW-PWM. main.h:
1 | //----------------------------------------------------------------------
|
2 | //main.h : main header file for the project
|
3 | //----------------------------------------------------------------------
|
4 | |
5 | #ifndef _MAIN_H_
|
6 | #define _MAIN_H_
|
7 | |
8 | // GCC specific
|
9 | #include <stdlib.h> |
10 | #include <stdint.h> |
11 | |
12 | // AVR-LibC specific
|
13 | #include <avr/io.h> |
14 | #include <inttypes.h> |
15 | #include <util/delay.h> |
16 | |
17 | //======================================================================
|
18 | // Definition of types
|
19 | //----------------------------------------------------------------------
|
20 | typedef signed char s08; |
21 | typedef signed int s16; |
22 | typedef signed long s32; |
23 | typedef signed long long s64; |
24 | typedef unsigned char u08; |
25 | typedef unsigned int u16; |
26 | typedef unsigned long u32; |
27 | typedef unsigned long long u64; |
28 | |
29 | //======================================================================
|
30 | // Various defines
|
31 | //----------------------------------------------------------------------
|
32 | #define OFF 0 // Output Low-Level
|
33 | #define ON 1 // Output High-Level
|
34 | |
35 | //======================================================================
|
36 | // Definition for I/O-Pin control
|
37 | //----------------------------------------------------------------------
|
38 | #define PIN_0 0x01 // IO-Pin(0)
|
39 | #define PIN_1 0x02 // IO-Pin(1)
|
40 | #define PIN_2 0x04 // IO-Pin(2)
|
41 | #define PIN_3 0x08 // IO-Pin(3)
|
42 | #define PIN_4 0x10 // IO-Pin(4)
|
43 | #define PIN_5 0x20 // IO-Pin(5)
|
44 | #define PIN_6 0x40 // IO-Pin(6)
|
45 | #define PIN_7 0x80 // IO-Pin(7)
|
46 | |
47 | #define PORT_A &PORTA, &DDRA, &PINA
|
48 | #define PORT_B &PORTB, &DDRB, &PINB
|
49 | #define PORT_C &PORTC, &DDRC, &PINC
|
50 | #define PORT_D &PORTD, &DDRD, &PIND
|
51 | #define PORT_E &PORTE, &DDRE, &PINE
|
52 | #define PORT_F &PORTF, &DDRF, &PINF
|
53 | #define PORT_G &PORTG, &DDRG, &PING
|
54 | |
55 | #endif //_MAIN_H_
|
main.c:
1 | #include "main.h" |
2 | |
3 | #define LED1 PORT_B, PIN_7
|
4 | |
5 | void pwm_fade(volatile u08 *PORT, volatile u08 *DDR, volatile u08 *PIN, u08 msk, u08 status, u16 time); |
6 | |
7 | int main() |
8 | {
|
9 | while(1) // Endlos-Schlaufe |
10 | {
|
11 | pwm_fade(LED1,ON,1000); // LED1 einschalten, fading während 1000ms |
12 | pwm_fade(LED1,OFF,500); // LED1 ausschalten, fading während 5000ms |
13 | }
|
14 | }
|
15 | |
16 | |
17 | void pwm_fade(volatile u08 *PORT, volatile u08 *DDR, volatile u08 *PIN, u08 msk, u08 status, u16 time) |
18 | {
|
19 | u08 t=0; |
20 | u08 p=64; // 64 PWM-Steps |
21 | time = (time+64) >> 7; // (2 ms x 64 Steps) => time / 128 |
22 | *DDR |= msk; // Set IO-pin as output |
23 | //--------------------------------------------------------------------
|
24 | // Fading from LOW to HIGH
|
25 | //--------------------------------------------------------------------
|
26 | if (status == ON) |
27 | {
|
28 | while(p--) |
29 | {
|
30 | t=(u08)time; |
31 | while(t--) |
32 | {
|
33 | *PORT &= ~msk; // Set IO-pin Low |
34 | for(u08 i=0; i<p; i++) |
35 | {
|
36 | _delay_us(31); // 2ms/64 Schritte = 31us |
37 | }
|
38 | *PORT |= msk; // Set IO-pin High |
39 | for(u08 i=p; i<64; i++) |
40 | {
|
41 | _delay_us(31); // 2ms/64 Schritte = 31us |
42 | }
|
43 | }
|
44 | }
|
45 | *PORT |= msk; // Set IO-pin High |
46 | }
|
47 | //--------------------------------------------------------------------
|
48 | // Fading from HIGH to LOW
|
49 | //--------------------------------------------------------------------
|
50 | else if (status == OFF) |
51 | {
|
52 | while(p--) |
53 | {
|
54 | t=(u08)time; |
55 | while(t--) |
56 | {
|
57 | *PORT |= msk; // Set IO-pin High |
58 | for(u08 i=0; i<p; i++) |
59 | {
|
60 | _delay_us(31); // 2ms/64 Schritte = 31us |
61 | }
|
62 | *PORT &= ~msk; // Set IO-pin Low |
63 | for(u08 i=p; i<64; i++) |
64 | {
|
65 | _delay_us(31); // 2ms/64 Schritte = 31us |
66 | }
|
67 | }
|
68 | }
|
69 | *PORT &= ~msk; // Set IO-pin Low |
70 | }
|
71 | //--------------------------------------------------------------------
|
72 | }
|
Ich weiss, dieses Beispiel ist nicht super Effizient und auch nicht sonderlich "schön", weil ohne Timer und Interrupt, aber für Anfänger interressant zum Einstieg...
Moin, genau, PWM ist das Zauberwort. Peter hat oben zwar "in Software" geschrieben, damit meint er aber nur, daß du was programmieren sollst :) . Der AVR hat nen eingabautes PWM-Modul, du braucht du kaum noch zu programmieren. Und wenn das ein Showcar (und keine total spackige und alberne Proletenkutsche) werden soll, dann such doch mal nach "Moodlight". Dann kannst du deiner Beleuchtung noch ganz andere Effekte verpassen :) ! Gruß
>Die meisten AVRs haben PWM eigebaut.
Das stimmt, man ist dann aber an die spezifischen IO-Pins gebunden, die
SW-PWM funktioniert mit jedem beliebeigen IO-Pin.
Aber zur Zeit kennen wir weder die HW-Schaltung (bzw. uC-Typ) noch die
Programmiersprache die Matthias verwenden will.
Peter schrieb: > die > SW-PWM funktioniert mit jedem beliebeigen IO-Pin. Klaro, das stimmt. Aber aus dem, was der TO bisher gepostet hat (was ja noch nicht viel war) hab ich erstmal geschlossen, daß er etwas programmier-scheu ist. Da wäre die HW-Lösung vielleicht angenehmer. BTW: so schrecklich fand ich die Rechtschreibung gar nicht. Da hab ich hier schon weitaus schlimmeres gesehen. Besonders haarstreubend: Verschreiber im Titel! Wenn ich schon "simmulieren" lese...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.