PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega48: Servo über Poti ansteuern



dimonw
05.11.2012, 08:17
Hallo,

ich habe ein folgendes Problem. Ich kann mein Servo jetzt über bascom ansteuern, kriege es aber nicht hin, den Servo über Poti anzusteuern.
Könnt ihr einen kurzen Programmcode schreiben?

So sieht mein Programm ohne Poti Ansteuerung aus.

Vielen Dank

'******** Compailereinstellung Anfang ***
$crystal = 12000000
$regfile = "m48def.dat"
$baud = 9600
'******* Compailereinstellung ende ******
'******** Config Ports Anfang ***********
Config Servos = 1 , Servo1 = Portb.1 , Reload = 10
Config Pinb.1 = Output
Config Portc = Input
Config Portd = Output
Enable Interrupts
'******** Config Ports Ende *************
'******** Deklaration Anfang ************
Dim Position As Byte
Dim Zaehler As Byte

'******** Dekleration Ende **************
'******** Initialisierung Anfang ********
Zaehler = 10
Position = 105
'******** Initialisierung Ende **********
'******** Hauptprogramm Anfang **********
Servo(1) = Position

Do
If Pinc.1 = 0 Then
Waitms 100
Position = Position + Zaehler

If Position = 165 Then
Position = 105
End If

Servo(1) = Position
Portd.0 = 1
Waitms 200
Portd.0 = 0

Elseif Pinc.2 = 0 Then
Waitms 100
Position = Position - Zaehler

If Position = 45 Then
Position = 105
End If

Servo(1) = Position
Portd.0 = 1
Waitms 200
Portd.0 = 0

End If
Loop

End

HeXPloreR
05.11.2012, 08:43
Hallo,

schaue Dir bitte die Initialisierung von einem ADC an. Damit kannst Du dann den eingelesen Wert (momentaner Widerstand vom Poti) für das Servo im Programm weiter verwenden.

Viele Erfolg weiterhin und Gruß

Searcher
05.11.2012, 14:04
Weil ich mit dem Servo Befehl von BASCOM Schwierigkeiten habe, biete ich Dir hier eine Alternative (Ohne Gewähr)
Vor Einschalten das Poti ungefähr in Mittelstellung bringen.

'Modellbauservo einstellen mit Poti

'BASCOM-Demo Version 2.0.5.0 sollte auch auf höheren Versionen laufen.

'Servopulsfrequenz = 50Hz
'Servopulslänge von 821 µs bis 2181 µs in 256 Stufen einstellbar (Auflösung 5,333 µs)

'ADC Meßwertschwankungen werden abgefangen

'Servosignalausgabe an PB1(OC1A)
'Potischleifer an PC0(ADC0), die anderen beiden Anschlüsse an GND und VCC (Referenz für ADC ist intern VCC)

$regfile = "m48def.dat"
$crystal = 12000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 9600

Dim Adc_result As Word
Dim Alt_wert As Word
Dim Differenz As Integer

Config Portb.1 = Output 'Servo MUSS an PB1 !!!

'*** Timer1 Konfiguration auf "Fast PWM", prescale = 64, top = ICR1, clear OC1A on compare match ***
Icr1 = 3749
Tccr1a = Bits(com1a1 , Wgm11)
Tccr1b = Bits(wgm13 , Wgm12 , Cs11 , Cs10)
'*************************** Timer1 Konfiguration ENDE ***********************

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Do
Adc_result = Getadc(0) 'Potiabgriffanschluß an PC0(ADC0),die anderen je an GND und VCC
Differenz = Adc_result - Alt_wert
Differenz = Abs(differenz)
If Differenz > 3 Then
Alt_wert = Adc_result
Shift Adc_Result , Right , 2
Ocr1a = 154 + Adc_Result
End If
Loop

End 'end program

Gruß
Searcher