Hallo,
ich kann dir nur einen c-code (winavr) zur Verfügung stellen:
Code:
#include <avr\io.h>
#include <avr\interrupt.h>
void PwmInit(void) {
gTimerCounter0 = 0;
sPwmMode = pwmMode;
/* Timer/Counter 0 initialization
* Clock source: System Clock / 1024
* Clock Mode: Fast PWM
* Clock value:
* 5,46ms, 12MHz -> prescale 256 (Frequenz ca. 183Hz)
* duty cycle 50% -> OCR0 127
*/
TCCR0 = 0
| BIT_WGM00 | BIT_WGM01 /* Fast PWM */
| BIT_COM00 | BIT_COM01 /* Set OC0 on Compare Match, Clear OC 0 at Top */
| BIT_CS02; /* N = 256 */
TIMSK |= (0
| BIT_TOIE0 /* Output Compare Interrupt Enable */
| BIT_OCIE0); /* Overflow Interrupt Enable */
OCR0 = 0x7f; /* 50% */
TCNT0 = 0;
}
ISR(TIMER0_COMP_vect) {
/* todo: Ausgänge ausschalten */
}
ISR(TIMER0_OVF_vect) {
/* todo: Ausgänge setzen */
}
void BrightnessSet(unsigned char brightness) {
OCR0 = brightness;
}
Der Prescaler für den Timer wurde mit 12MHz (für den Atmega16) bestimmt.
Ich habe damit eine Frequenz von ca. 183Hz, das reicht um die LEDs durchgängig leuchten zu sehen.
Die Helligkeit kann in 256 Schritten eingestellt werden, defaultmäßig liegt sie in diesem Beispiel bei 50%.
LG,
Alex
Lesezeichen