PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spannungssignal verändern.



Masterraven9
06.10.2010, 00:51
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.


$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

Gock
06.10.2010, 12:02
Den Code habe ich mir nicht angesehen, tut er überhauptp das, was er soll?
Wie hast Du gemessen? Ein normales Multimeter ist ungeeignet, um Effektivwerte einer PWM Spannung anzuzeigen. Da brauchts ein Oszi.
Die Störungen, von denen Du schreibst, hängen von sehr vielen Unbekannten ab: Schaltung, Layout, Spannungsversorgung usw.
Allgemein kann man sie minimieren, indem man mehrere Messungen macht und mittelt oder die Auflösung verringert.
Aber bei diesen Schwankungen schätze ich mal, es liegt an erst genanntem.
So ganz klar ist mir die Sache nicht.
Zu diesem Thema gibt es allerdings auch schon sehr viele Beiträge hier, einfach mal suchen.
Gruß

Richard
06.10.2010, 12:16
Um mittels PWM eine Gleichspannung zu erzeugen muss am PWM Ausgang ein Tiefpass sitzen der aus dem PWM Signal eine gemittelte Gleichspannung erzeugt die dann mit einem Multimeter
gemessen werden kann. Irgend welche Verluste wird es immer geben....PWM ist kein echter DAC.

Gruß Richard

Masterraven9
06.10.2010, 20:45
Also an sich wollte ich einen Tuningchip für mein Auto basteln.
Wäre bestimmt besser wenn ich da einen seperaten DAC nehme gibts einen ATMega mit einer höheren Auflösugn als 10Bit?
Beim Multimeter sind die Schwankungen nicht so schnell ersichtlich aber ich lasse mir die Werte halt unter dem Emulator anzeigen und dort sehe ich das es Schwankungen gibt bei der Stromversorgung gibt es keine Probleme.