
Das ist mein erstes Projekt nach dem Rentenstart. Die mit viel Engagement von den Kollegen gebaute Pyramide war einfach zu hell für die gemütliche Weihnachtsstimmung.
Da kam sofort die Idee, die LED-Lampen zu dimmen. Problem der Lampen ist nur, das da drin nur ein Vorschaltkondensator und die Gleichrichterbrücke ist. Also muß die Netzspannung runtergeregelt werden. Wenn man aber sich den Strom durch die LED’s anschaut, sieht man sofort, daß die dann flimmern müssen, weil nur noch in den Sinusspitzen Strom fließt.
Lösung von mir:
mit Atmelcontroller ATTiny25 einen kleinen Sinusgenerator für 400Hz bauen, NF-Verstärker (von Amazon 35W Digitalverstärker) nachschalten und das Ausgangssignal an einen Netztrafo sekundärseitig anschließen. Als Extra dann noch: ein Poti am Eingang vom NF-Verstärker und schon ist die regelbare Sinusspannung 80 – 150V / 400Hz da. Stromversorgung aus den vorhandenen 24V-Schaltnetzteil.
Der Sinusgenerator erhält noch einen RC-Ausgangsfilter, damit es nicht soviel Oberwellen gibt (EMV).
Code von Sinusgenerator:
/*
* main.c
*
* Created on: 05.11.2018
* Author: Dieter
*/
/*
Fuse set: Clock_div_8 aus (8MHz RC-Clock), Rest auf Standard-Einstellungen
Pin 1 Reset (PB5)
Pin 2 PB3
Pin 3 PB4
Pin 4 GND
Pin 5 PB0
Pin 6 PB1
Pin 7 PB2
Pin 8 VCC
*/
#define F_CPU 8000000UL
#include <avr/pgmspace.h>
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <math.h>
uint8_t idx = 0;
uint8_t sine[128];
int main(void) {
// Fill Sinus-Table
for (uint8_t i = 0; i < 128; i++)
{
sine[i] = (uint8_t) (sin(i * 2 * 3.1415 / 128) * 127 + 128);
}
PORTB = 0b00000000;
DDRB = (1 << PB1) | (1 << PB4);
PLLCSR |= (1 << PLLE); // PLL starten
//wait for PLL Lock
while (!(PLLCSR & (1 << PLOCK)))
;
PLLCSR |= (1 << PCKE); // PLL_Clock = 64MHz
OCR1B = sine[idx & 0x7f];
OCR1A = sine[(idx + 32) & 0x7f];
//Timer1 /2 PWM 1A Timer1_Clock = 32MHz; PWM-Takt = 125KHz
// Enable PWM on PB1 (Pin 6)
TCCR1 = (1 << CS10) | (1 << PWM1A) | (1 << COM1A1);
//Enable PWM on PB4 (Pin 3)
GTCCR = (1 << PWM1B) | (1 << COM1B1);
_delay_us(500); // 500µs warten, damit sich Ausgangsfilter einschwingen
// Schleife für 128 Punkte der Sinuskurve in PWM programmieren
while (1)
{
OCR1B = sine[idx & 0x7f];
OCR1A = sine[(idx + 32) & 0x7f];
idx++;
_delay_us(16); // 400Hz
// _delay_us(500); // 15Hz
// _delay_us(151); // 50Hz
// ohne delay // 2.2KHz
// ohne delay und OCR1A // 3.8KHz
}
}
Code-Sprache: PHP (php)