Hallo,
ich nutze einen "mySmart USB light" und die Demoversion von Bascom-AVR.
Das mit dem "Verfusen" von ATmegas hab ich schon durch bei der Einstellung des Quarzes. Zwei davon hab ich schon auf externen Quarz gesetzt und muss sie erstmal wieder recovern. "Nächstes Projekt"
Mittlerweile nutze ich die Einstellung: "111111: Ext. Crystal Osc." Eine Frequenz steht da leider nicht dabei. Ich hoffe, das sind 16 Mhz.
Hier nun mein Projekt.
Doppelte H-Brücke für zwei 24V/250 W Motoren.
ATMEGA88, 4xIR2104 als FET-Treiber, 16x IRF1404 FET's, 8x MBR1645 als FET-Schutz
Hauptprogramm läuft mit Berechnungen bei ca. 5,6 Khz durch. Das reicht meiner Meinung nach.Bei Signalverslust läuft das Programm direkt in die Fehlerroutine und schaltet die Treiber aus.Jeder, der mit "alten" Modellbaufernbedienungen Erfahrungen hat, weiß wie fatal ein Signalverlust an den Servos/Fahrtregler ist. Da "stirbt" meistens was. (Modell, Motor, ....)
Hier noch der Code. Sicherlich gibts da Dinge, die man noch besser gestalten könnte, aber so läufts sauber und ich weiß auch wie.
Vielen Dank für Eure Hilfe.
p.s.: Wo bekomm ich eine bezahlbare Vollversion von BASCOM-AVR her?
Code:
'Autosteuerung
$regfile = "m88def.dat"
$crystal = 512000
$hwstack = 40
$swstack = 40
$framesize = 40
'** Ports/Pins *********************************************************************************
Config Portd.5 = Output '11 PWM_L_Low
Config Portd.6 = Output '12 PWM_L_High
Config Portb.3 = Output '17 PWM_R_High
Config Portd.3 = Output '05 PWM_R_low
Config Portb.2 = Output '16 Enable links
Config Portc.3 = Output '26 Status_LED
Config Portb.1 = Output '15 enable Rechts
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
Enable_l Alias Portb.2 'pin 16
Enable_r Alias Portb.1 'pin 15
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 In_type As Bit 'Art der Eingabe
Dim L_high As Word 'Ausmaße Links
Dim L_mid As Word
Dim L_low As Word
Dim R_high As Word 'Ausmaße Rechts
Dim R_mid As Word
Dim R_low As Word
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 Byte 'Ausgabe PWM
Dim Pwm_r As Byte
Dim I As Word 'allgemeine Variable
'** Configs ************************************************************************************
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 256
Config Timer1 = Counter , Prescale = 8 , Noise Cancel = 1
Config Timer2 = Pwm , Compare A Pwm = Clear Up , 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
Enable_l = 0
Enable_r = 0
L_quotient = 6.867
R_quotient = 6.621
L_verschiebung = 277
R_verschiebung = 293
'** Initialisierung ****************************************************************************
Do
Loop Until Taster = 0
'** Hauptschleife ******************************************************************************
Go:
Do
Led = 1 'Frequenzmessung möglich
'Locate 1 , 1 : Lcd " " ; In_l ; " "
'Locate 2 , 1 : Lcd " " ; In_r ; " "
Led = 0
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
If Calc_l > 254 Then Calc_l = 254
If Calc_l < 1 Then Calc_l = 1
If Calc_r > 254 Then Calc_r = 254
If Calc_r < 1 Then Calc_r = 1
'** Variablenübergabe ************************************************************************
Pwm_l = Calc_l
Pwm_r = Calc_r
'** PWM umsetzen *****************************************************************************
If Pwm_l > 148 Or Pwm_l < 108 Then
Enable_l = 1
Else
Enable_l = 0
End If
If Pwm_r > 148 Or Pwm_r < 108 Then
Enable_r = 1
Else
Enable_r = 0
End If
Pwm0a = Pwm_l
Pwm0b = Pwm_l
Pwm2a = Pwm_r
Pwm2b = Pwm_r
Loop
'** Empfängerdaten auslesen ********************************************************************
Rc_in_r:
If Pinc.2 = 1 Then
Timer1 = 0
Else
In_r = Timer1
End If
Return
Rc_in_l:
If Pind.4 = 1 Then
Timer1 = 0
Else
In_l = Timer1
End If
Return
'** Fehlerroutine ******************************************************************************
Fehler:
Enable_l = 0
Enable_r = 0
Pwm0a = 128
Pwm0b = 128
Pwm2a = 128
Pwm2b = 128
Do
Led = 1
Waitms 3000
Led = 0
Waitms 3000
Loop
Lesezeichen