So hab es jetzt endlich mal geschafft die PWM Frequenz flexibel einlesbar zu gestallten.
Momentan über Eingabe am Terminal (1. Wert die Frequenz, 2. Wert die Leistung, wobei 100% Leistung 50% Pulsweite sind)
Code:
$regfile = "m32def.dat"
$framesize = 500
$swstack = 500
$hwstack = 500
$crystal = 16000000
$baud = 9600
Dim Freq As Word , Pw As Single
Dim Pulsweite As Word
Dim Frequenz As Long
Config Portd.4 = Output
Config Timer1 = Pwm , Compare B Pwm = Clear Down , Compare A Pwm = Clear Up , ' CompareB für PWM, CompareA =0
Tccr1b = 17 '1 für Prescaler 1, anderes Bit?
'Tccr1a = &B00100001 'See datasheet for details.
'Tccr1b = &B00010001 'See datasheet for details.
Compare1b = 65535
Enable Interrupts
Do
If Ischarwaiting() = 1 Then
Input Frequenz Noecho
Input Pulsweite Noecho
Frequenz = 8000000 / Frequenz '80 ergibt 100kHz, Umrechnung für Frequenz in Freq-Wert
Freq = Frequenz 'Wieder as 2 Byte Word
Ocr1ah = High(freq) 'Frequenz high-Byte
Ocr1al = Low(freq) 'Frequenz low-Byte, zählt x Timerimpulse 80=100kHz
If Pulsweite > 100 Then Pulsweite = 100 'maximale Leistung bei 50% PW, höhere Werte kürzen
Pw = Freq / 200 '50% PW für 100% Leistung
Pw = Pulsweite * Pw 'x% Leistung
Pulsweite = Round(pw) 'in 2 Byte Word
Enable Timer1
If Pulsweite = 0 Then
Pulsweite = 65535 'bei Leistung 0, Ausschalten (5V)
Disable Timer1
End If
Compare1b = Pulsweite
End If
Loop
Bin aber noch immer auf der Suche, wie man die Frequenz aus alternativer Quelle richtig bestimmen kann. Zur Not halt mit INT0 Interrupt, wobei dann das auswerten zur Zeit schwieriger wird.
Vielleicht fällt mir oder jemand anderem ja noch was ein. Wäre zumindest schön das über den Input Capture Pin un die passende Funktion zu handeln.
Lesezeichen