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ß
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ß