Hy Leude,
ich bin grad frisch in die AVR Geschichte eingestiegen weil ich etwas versuchen wollte. Da ich weder vom Hardwareaufbau noch von der Software so richtig Ahnung habe hoffe ich auf eure Hilfe.
Ich besitze ein Lernboard von Amazon, welches einen ATmega88 beherbergt.
Aufgabenstellung
Board wird von Netzteil mit 5V betrieben.
Am AD Eingang ADC0 liegt eine Spannung an, zwischen 0-5V.
Diese Spannung soll gemessen und bearbeitet wieder ausgegen werden, d.h. wenn z.B. 2,4V anliegen soll der ATmega 2,2V ausgeben über die Timer Funktion am Ausgang PB1 oder PB2.
Wichtig hierbei der Controller muss sofort aus Spannungsänderungen an ADC0 reagieren.
Hier mein Programm bis jetzt.
Code:
$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Zaehler As Long
Dim Kurve As Byte
Dim Rawinp As Word
Dim Rawout1 As Word
Dim Converter As Integer
Dim Calc As Single
Dim _step As Single
Config Pinb.1 = Output
Config Pinb.2 = Output
Zaehler = 0
Config Timer1 = Pwm , Prescale = 8 , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Enable Timer1
Enable Interrupts
Do
Rawinp = Getadc(0)
Gosub _kurve_3
Pwm1a = Rawout1
Pwm1b = Rawout1
Incr Zaehler
If Zaehler = 10000 Then
Print "inp:" ; Rawinp ; ":out:" ; Rawout1
Zaehler = 0
End If
Loop
End
_kurve_3:
Select Case Rawinp
Case Is >= 881
Rawout1 = 880
Case 717 To 880
Calc = 880 - 717
Calc = 31 / Calc
_step = Rawinp - 717
_step = _step * Calc
_step = Round(_step)
Converter = _step - 31
Rawout1 = Rawinp + Converter
Case 635 To 716
Calc = 716 - 635
Calc = 10 / Calc
_step = Rawinp - 635
_step = _step * Calc
_step = Round(_step)
Converter = _step - 41
Rawout1 = Rawinp + Converter
Case 574 To 634
Calc = 634 - 573
Calc = 10 / Calc
_step = Rawinp - 573
_step = _step * Calc
_step = Round(_step)
Converter = _step - 51
Rawout1 = Rawinp + Converter
Case 513 To 573
Calc = 573 - 513
Calc = 10 / Calc
_step = Rawinp - 513
_step = _step * Calc
_step = Round(_step)
Converter = _step - 61
Rawout1 = Rawinp + Converter
Case 451 To 512
Calc = 512 - 451
Calc = 10 / Calc
_step = Rawinp - 451
_step = _step * Calc
_step = Round(_step)
Converter = 0 - 51
Converter = Converter - _step
Rawout1 = Rawinp + Converter
Case 400 To 450
Calc = 450 - 400
Calc = 10 / Calc
_step = Rawinp - 400
_step = _step * Calc
_step = Round(_step)
Converter = 0 - 41
Converter = Converter - _step
Rawout1 = Rawinp + Converter
Case 349 To 399
Calc = 399 - 349
Calc = 18 / Calc
_step = Rawinp - 349
_step = _step * Calc
_step = Round(_step)
Converter = 0 - 23
Converter = Converter - _step
Rawout1 = Rawinp + Converter
Case 287 To 348
Calc = 348 - 287
Calc = 10 / Calc
_step = Rawinp - 287
_step = _step * Calc
_step = Round(_step)
Converter = 0 - 10
Converter = Converter - _step
Rawout1 = Rawinp + Converter
Case 185 To 286
Calc = 286 - 185
Calc = 10 / Calc
_step = Rawinp - 185
_step = _step * Calc
_step = Round(_step)
Converter = 0
Converter = Converter - _step
Rawout1 = Rawinp + Converter
Case Is <= 184
Rawout1 = Rawinp
End Select
Return
Probleme:
Spannugnssignal wird über ein regelbares Netzteil simuliert (ohne Masseanschluß wird immer max. Wert ausgegeben).
Starke Schwankungen, mit diesem Controller hab ich nur 1024 verschiedene Möglichkeiten aber da gibt es Schwankungen bis hin zu 25 Schritten.
Auch wenn ich den Amperwert am Netzteil um 1mA hochnehme wird sofort der maximale Wert angezeigt.
So jetzt ist erstmal alles zum aktuellen Stand bekannt, fällt vielleicht jemanden ein was ich noch verändern muss damit es wie gewünscht funktioniert (egal ob Soft- oder Hardwareseitig)?
Vielen Dank
Lesezeichen