Nein, ich verwende verwende einen 16 Mhz Quarz und habe in den Fuses auch, meiner Meinung nach, 16 Mhz eingestellt.
Und ja ich habe trotzdem 512 Khz eingestellt. Einfach, weil die Differenz der Werte des Timers zwischen bei 512khz am größten ist. Die Umrechnungsvariablen sind jetzt auf diese Spreizung angepasst. Solange ich kein Display an dieser Schaltung habe und die Werte vernünftig auslesen kann, lasse ich es jetzt dabei.
Mir ist beim Testen aufgefallen, dass ich wohl einen Denkfehler, was die High/Low- und enable-Beschaltung angeht. Ich gebe den FET-Treibern jetzt einfach ein 1 für die eine und ein 254 für die andere Richtung. (keine 0/255 weil die Bootstrap-Schaltung der Teiber den oberen Fet nicht auslösen würde) Über den Enable-Eingang gebe ich jetzt das PWM-Signal für die Geschwindigkeit.
Ich weiß nicht genau, ob man so eine H-Brücke treibt, aber das funktioniert noch besser und ich hab keine Verslustleistung in Neutral-Stellung. Weitere Anregungen nehme ich gern entgegen.
Wen's interessiert, hier der geänderte Code
Code:
'Autosteuerung
$regfile = "m88def.dat"
$crystal = 512000
$hwstack = 40
$swstack = 40
$framesize = 40
'** Ports/Pins *********************************************************************************
Config Portd.5 = Output '11 PWM_L_vor/zurück
Config Portd.6 = Output '12 PWM_L_enable (PWM)
Config Portb.3 = Output '17 PWM_R_enable (PWM)
Config Portd.3 = Output '05 PWM_R_vor/zurück
Config Portc.3 = Output '26 Status_LED
Config Pinc.4 = Input '27 correction Left
Config Pinc.1 = Input '24 corrention Right
Config Pind.2 = Input '04 Taster
Config Pinc.0 = Input '23 rechte Eingabe Poti
Config Pinc.5 = Input '28 Linke Eingabe Poti
'** Ports benennen *****************************************************************************
Correct_l Alias Pinc.4 'pin 27
Correct_r Alias Pinc.1 'pin 24
Taster Alias Pind.2 'pin 04
Led Alias Portc.3 'pin 26
R_poti Alias Portc.0 'pin 23
L_poti Alias Portc.5 'pin 28
'RC_L_in Pin 06
'RC_R_in Pin 25
'** Variablen **********************************************************************************
Dim In_l As Integer 'Eingabevariablen Signal
Dim In_r As Integer
Dim L_direction As Bit 'Richtung der Kanäle festlegen
Dim R_direction As Bit
Dim L_quotient As Single 'Runterrechnen auf Bytewert
Dim R_quotient As Single
Dim L_verschiebung As Word 'Verschieben des Mittelwertes
Dim R_verschiebung As Word
Dim L_korrekt As Single 'Anpassen unterschiedlicher Motoren
Dim R_korrekt As Single
Dim Calc_l As Single 'Berechnung PWM
Dim Calc_r As Single
Dim Pwm_l As Integer 'Ausgabe PWM
Dim Pwm_r As Integer
Dim I As Word 'allgemeine Variable
'** Configs ************************************************************************************
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
Config Timer1 = Counter , Prescale = 8 , Noise Cancel = 1
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Enable Timer0
Enable Timer1
Enable Timer2
Start Adc
Enable Interrupts
Enable Pcint1
Enable Pcint2
Pcmsk1 = &B00000000
Pcmsk2 = &B00000000
Pcmsk1.pcint10 = 1
Pcmsk2.pcint20 = 1
On Pcint1 Rc_in_r
On Pcint2 Rc_in_l
'** Display Einrichten *************************************************************************
'Config Lcdpin = Pin , _
' Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portb.4 , Rs = Portb.5
'Config Lcd = 16 * 2
'Cursor Off
'Cls
'** Variablen zuweisen *************************************************************************
Taster = 1
L_quotient = 6.867
R_quotient = 6.621
L_verschiebung = 277
R_verschiebung = 293
'** Initialisierung ****************************************************************************
Pwm0a = 0 'Enable Aus
Pwm2a = 0
Do 'Programm freigeben
Loop Until Taster = 0
'** Hauptschleife ******************************************************************************
Go:
Do
Led = 1 'Frequenzmessung möglich
'Locate 1 , 1 : Lcd " " ; In_l ; " "
'Locate 2 , 1 : Lcd " " ; In_r ; " "
If In_l > 4000 Or In_l < 1500 Or In_r > 4000 Or In_r < 1500 Then Goto Fehler
Calc_l = In_l
Calc_r = In_r
'Linearregelung ******************************************************************************
Calc_l = Calc_l / 6.867
Calc_l = Calc_l - 277
Calc_r = Calc_r / 6.621
Calc_r = Calc_r - 300
Led = 0
'** Variablenübergabe ************************************************************************
Pwm_l = Calc_l 'Linker Kanal
Pwm_l = Pwm_l * 2
Pwm_l = Pwm_l - 256
If Pwm_l > 0 Then
L_direction = 1
Else
L_direction = 0
Pwm_l = -pwm_l
End If
If Pwm_l > 254 Then Pwm_l = 254
If Pwm_l < 1 Then Pwm_l = 1
Pwm_r = Calc_r 'rechter Kanal
Pwm_r = Pwm_r * 2
Pwm_r = Pwm_r - 256
If Pwm_r > 0 Then
R_direction = 1
Else
R_direction = 0
Pwm_r = -pwm_r
End If
If Pwm_r > 254 Then Pwm_r = 254
If Pwm_r < 1 Then Pwm_r = 1
'** PWM umsetzen *****************************************************************************
If L_direction = 1 And Pwm_l > 7 Then 'links vorwärts
Pwm0a = Pwm_l
Pwm0b = 1
End If
If L_direction = 0 And Pwm_l > 7 Then 'links rückwärts
Pwm0a = Pwm_l
Pwm0b = 254
End If
If Pwm_l <= 7 Then 'links neutral
Pwm0a = 0
Pwm0b = 128
End If
If R_direction = 1 And Pwm_r > 7 Then 'rechts vorwärts
Pwm2a = Pwm_r
Pwm2b = 1
End If
If R_direction = 0 And Pwm_r > 7 Then 'rehts vorwärts
Pwm2a = Pwm_r
Pwm2b = 254
End If
If Pwm_r <= 7 Then 'rechts vorwärts
Pwm2a = 0
Pwm2b = 128
End If
Loop
'** Empfängerdaten auslesen ********************************************************************
Rc_in_r: 'rechten RC-Kanal einlesen
If Pinc.2 = 1 Then
Timer1 = 0
Else
In_r = Timer1
End If
Return
Rc_in_l: 'linken RC-Kanal einlesen
If Pind.4 = 1 Then
Timer1 = 0
Else
In_l = Timer1
End If
Return
'** Fehlerroutine ******************************************************************************
Fehler:
Pwm0a = 0
Pwm0b = 128
Pwm2a = 0
Pwm2b = 128
Do
Led = 1
Waitms 3000
Led = 0
Waitms 3000
Loop
Lesezeichen