PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM über Poti steuern



Zille
18.08.2014, 18:58
Hallo zusammen :)

Es handelt sich um folgendes:

Atmega32
externer 8 MHz Quarz
PWM erzeugung zur ansteuerung einer MOSFET-Treiberstufe für einen 30cm RGB-Streifen (Hardwaretechnisch alles einwandfrei aufgebaut)

Um Euch mein Problem näher schildern zu können erkläre ich euch zunächst meine IST-Situation :


Ich habe ein C-Programm geschrieben mit dem ich in der Lage bin alle drei Timer (0,1,2) je als 8 Bit Phasencorrecte "PWM-Erzeuger" arbeiten zu lassen. Schreibe ich nun feste Werte in die Outputcompareregister der entsprechenden Timer so kann ich mir die Farben mischen wie ich es gern haben möchte. :)


Nun möchte ich die PWM aber nicht durch fixxe Werte vorgeben, sondern über 3 Potis je einen Channel (OCR) ansteuern. Mein derzeitiger Stand ist der, dass ich in der Lage bin die RGB-Farben über die Potis zu verändern, aber leider eben nur, wenn ich die Potis verstelle und anschließend das Programm neu aufspiele....ich hätte es gerne so, dass ich das Programm einmal aufspiele und anschließend direkte Farbwechsel bei Analogwertänderung erzeuge. Ich habe mir schon einiges an Gedacnken gemacht, komme aber leider nicht auf meinen Denkfehler....

Hier mein aktuelles Programm:

----------------------------------------------------------------------------------------------------------------------

/*
* RGB_Peavey.c
*
* Created: 09.08.2014 13:35:24
* Author: Zille
*/

#define F_CPU 8000000

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "adc.h"

// Farben der LEDs - Jede beeinflusst eine PWM des ATmega32

uint16_t R = 0;
uint16_t G = 0;
uint16_t B = 0;

void PWM_init(void)
{
// Ausgänge der drei Channels definieren

DDRB |= (1<<PB3); // 8 Bit OC0
DDRD |= (1<<PD7); // 8 Bit OC2
DDRD |= (1<<PD5); // 16 Bit OC1A

// Timer Einstellungen

TCCR0 |= (1<<WGM00) | (1<<COM01) | (1<<CS00); // 1.8 Bit Timer: Phase correct PWM Mode, Clear Up - Set down OC0, prescaler 1024 | (1<<CS02)
TCCR2 |= (1<<WGM20) | (1<<COM21) | (1<<CS20); // 2.8 Bit Timer: Phase correct PWM Mode, Clear Up - Set down OC2, prescaler 1024 | (1<<CS22)
TCCR1A |= (1<<WGM10) | (1<<COM1A0) | (1<<COM1A1); // 16 Bit Timer: 8 Bit Phase correct PWM Mode, Clear Up -Set down OCR1A,
TCCR1B |= (1<<CS10); // und prescaler 1024 (1<<CS12) |

// Compareinterrupts erlauben

TIMSK |= (1<<OCIE0) | (1<<OCIE1A) | (1<<OCIE2);

// Interrupts generell erlauben

sei();
}


int main(void)
{
// Initialisierungen

ADC_Init();
PWM_init();

// Die drei Poti Eingänge definieren

DDRA &= ~(1<<PA0);
DDRA &= ~(1<<PA1);
DDRA &= ~(1<<PA2);



while(1)
{
R = (ADC_Read(0)/4);
G = (ADC_Read(1)/4);
B = (ADC_Read(2)/4);

OCR0=G; //
OCR2=R; // Rot
OCR1A=B; // Blau inverse

}
}


----------------------------------------------------------------------------------------------------------------------------------------------



Für jede Hilfe bin ich dankbar :)

Wenn etwas fehlt an informationen dann einfach bescheid geben


Gruß

Che Guevara
18.08.2014, 19:54
Hi,

also zuerst fällt mir auf, dass du zwar einen 16MHz angeschlossen hast, dem Programm aber 8MHz mitteilst.
Um etwas zu deinem eigentlichen Problem sagen zu können, müsste man wohl die ADC_INIT und ADC_READ Funktionen kennen.
Wenn ich es richtig verstanden habe, wird nur einmalig beim Programmstart der ADC Wert eingelesen und in die PWM-Register geschrieben?
Achja --- Code am besten in den CodeTags schreiben / hineinkopieren, ist um einiges lesbarer ;)

Gruß
Chris

Zille
19.08.2014, 06:56
Hi,

hab mich vertan, hab einen 8 MHz Quarz ;)

Der Analogwert wird in der While-Schleife eingelesen (adc_read) und an die OCR ausgegeben....also eigentlich ständig.
Die Analogwerterfassung dürfte auch im Freerun stehen, heißt dass er auch ständig neu einließt....


Wenn ich zuhause bin stelle ich die genauen einstellungen zur Verfügung.

Gruß

PICture
20.08.2014, 09:07
Hallo!

Es geht auch ohne µC: "Der 555 erzeugt PWM-Signal" in http://www.domnick-elektronik.de/elek555.htm .

Apostel13
26.08.2014, 18:07
Wie soll man dazu etwas sagen, wenn Die Funktionen um die es eigentlich geht, hier nicht ersichtlich sind...?

Unregistriert
26.08.2014, 19:33
Wie soll man dazu etwas sagen, wenn Die Funktionen um die es eigentlich geht, hier nicht ersichtlich sind...?Tja, da könnte mann nur sagen: scrollen, lesen, Ahhhh-sagen. Denn ich lese in der verlinkten Site "Der 555 erzeugt PWM-Signal" . . .

Apostel13
26.08.2014, 23:01
Was für ein Unsinn. Der Fragesteller hat nicht danach gefragt ob und wie man mit einem 555'er ein PWM-Signal erzeugt, sondern wollte Hilfe bei seinem Code.

Man kann ein PWM auch mit passiven Elementen und Transistoren erzeugen oder mit einem Schalter und einem Galeerensklaven. Das alles ist aber keine Antwort auf die eigentliche Frage. Aber es ist das nervige an solchen Foren. Antworten auf Fragen, die niemand gestellt hat.