1 | '+------------------------------------------------------------------------------+'
|
2 | '| Titel : Endarbeit: "Schwebender Magnet" |'
|
3 | '+------------------------------------------------------------------------------+'
|
4 | '| Funktion : Der Magnet schwebt unter einer Spule. |'
|
5 | '| Anschlüsse : PB1=PWM, PC0=ADC |'
|
6 | '+------------------------------------------------------------------------------+'
|
7 | '| Name : Weinberg Denny |'
|
8 | '| Copyright : Copyright © Denny 2009 |'
|
9 | '| E-Mail Adresse : Denny_Weinberg@hotmail.com |'
|
10 | '+------------------------------------------------------------------------------+'
|
11 |
|
12 |
|
13 | '|----------------------------------Controller----------------------------------|'
|
14 | $regfile = "m8def.dat" 'ATmega8
|
15 | $crystal = 3686400 'Quarzfrequenz (Extern)
|
16 | $baud = 9600 'Funktionierende Baudrate
|
17 |
|
18 |
|
19 | '|----------------------------------Variablen-----------------------------------|'
|
20 | Dim Position As Integer 'Analoge Spannung des Hallsensors
|
21 | Dim Pulsweite As Integer 'Die Pulsweite für den Spulenstrom
|
22 | Dim Alteposition As Integer 'Position der letzten Messung
|
23 | Dim Positionsveraenderung As Integer 'Die Veränderung der Spannung des Hallsensors während eines Zyklus
|
24 |
|
25 | Dim Daempfung As Integer 'Die Dämpfung des Magneten
|
26 |
|
27 | Dim Sollwert As Integer 'Damit man die Position des Magneten verstellen kann
|
28 |
|
29 | Dim Nummer As Byte 'ASCII-Code die seriell ankommen
|
30 | Dim Zeichen As String * 5 'Seriell ankommende Zeichen
|
31 |
|
32 | Dim Eingeschaltet As Bit 'Um alles auszuschalten
|
33 |
|
34 | Dim Anfangsbuchstabe As String * 1 'Hilfsbuchstabe bei Änderungen
|
35 | Dim Endwert As String * 4 'Der wirkliche Wert der benötigt wird
|
36 |
|
37 | Dim Zeichengroesse As Byte
|
38 |
|
39 |
|
40 | '|---------------------------------Konfiguration--------------------------------|'
|
41 | Declare Sub Berechnen() 'Unterprogramm um die Variablen zu berechnen
|
42 | Declare Sub Auswerten() 'Unterprogramm um die berechneten Werte auszuwerten
|
43 |
|
44 | Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Analog-Digital-Wandler
|
45 | Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'Pulsweitenmodulation
|
46 |
|
47 | On Urxc Serialin 'Interrupt der seriellen schnittstelle
|
48 | Enable Urxc 'Interrupt der seriellen schnittstelle einschalten
|
49 |
|
50 | Enable Interrupts 'Interrupts einschalten
|
51 |
|
52 |
|
53 | '|------------------------------Eingänge und Ausgänge---------------------------|'
|
54 | Config Portb.0 = Output 'Freier Pin (LED)
|
55 |
|
56 |
|
57 | '|---------------------------------Einstellungen--------------------------------|'
|
58 | Set Eingeschaltet 'Einschalten
|
59 |
|
60 | Daempfung = 150 'Standartwert
|
61 |
|
62 | Sollwert = 100
|
63 |
|
64 | Portb.0 = 1 'LED Einschalten
|
65 |
|
66 |
|
67 | '|---------------------------------Hauptprogramm--------------------------------|'
|
68 | Do
|
69 | If Eingeschaltet = 1 Then
|
70 | Start Adc
|
71 | Position = Getadc(0) 'Analoge Spannung des Hallsensors messen
|
72 | Stop Adc
|
73 | Toggle Portb.0 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
74 | Call Berechnen
|
75 |
|
76 | Call Auswerten
|
77 | Else
|
78 | Pulsweite = 0
|
79 | End If
|
80 |
|
81 | Compare1a = Pulsweite 'Spulenstrom regeln
|
82 | Loop
|
83 |
|
84 |
|
85 | '|--------------------------------Werte berechnen-------------------------------|'
|
86 | Sub Berechnen()
|
87 | Position = Position - 512 'Weil der Sensor die halbe Spannung in einer Richtung angibt
|
88 |
|
89 | Position = Position / 2 'Word-->Byte = /4 und Hallsensor = halbe Spannung = *2 => /2 =>0...255
|
90 |
|
91 | Pulsweite = Position - Sollwert
|
92 |
|
93 | Positionsveraenderung = Position - Alteposition 'Positionsveränderung berechnen
|
94 | Positionsveraenderung = Positionsveraenderung * Daempfung 'Dämpfung hinzurechnen
|
95 |
|
96 | Pulsweite = Pulsweite + Positionsveraenderung 'Pulsweite berechnen
|
97 |
|
98 | 'Pulsweite = Pulsweite + Offset 'Offset hinzurechnen
|
99 | End Sub
|
100 |
|
101 |
|
102 | '|-----------------------------------Auswerten----------------------------------|'
|
103 | Sub Auswerten()
|
104 | If Position > 0 Then
|
105 | If Pulsweite > 255 Then Pulsweite = 255 'Begrenzungen der Pulsweite einhalten
|
106 | If Pulsweite < 0 Then Pulsweite = 0 'Begrenzungen der Pulsweite einhalten
|
107 |
|
108 | Alteposition = Position 'Alteposition setzen
|
109 | Else 'Wenn der Magnet falsch rum hängt wird er umgedreht
|
110 | Pulsweite = 255
|
111 | End If
|
112 | End Sub
|
113 |
|
114 |
|
115 | '|---------------------Interrupt der seriellen Schnittstelle--------------------|'
|
116 | Serialin:
|
117 | Nummer = Inkey() 'ASCII-Code einlesen
|
118 |
|
119 | Select Case Nummer
|
120 | Case 13 'Nummer 13 ist das Enter, das gesendet wird, wenn alles gesendet ist
|
121 | Select Case Zeichen
|
122 | Case "EiA"
|
123 | Print Eingeschaltet 'Zurücksenden, ob das Gerât eingeschaltet ist
|
124 | Case "OFF"
|
125 | Print Sollwert
|
126 | Case "DAE"
|
127 | Print Daempfung 'Dämpfung zurücksenden
|
128 | Case "Aus"
|
129 | Reset Eingeschaltet 'Ausschalten
|
130 | Case "Ein"
|
131 | Set Eingeschaltet 'Einschalten
|
132 | Case "PB0"
|
133 | Toggle Portb.0 'PortB.0 Ein- /Ausschalten
|
134 | Case Else
|
135 | Zeichengroesse = Len(zeichen) - 1 'Zeichengröße, um den Endwert herauszufinden
|
136 |
|
137 | Anfangsbuchstabe = Left(zeichen , 1) 'Anfangsbuchstabe rausschneiden
|
138 | Endwert = Right(zeichen , Zeichengroesse) 'Endwert rausschneiden
|
139 |
|
140 | Select Case Anfangsbuchstabe
|
141 | Case "O"
|
142 | Sollwert = Val(endwert) 'Es wurde das Offset gesenden
|
143 | Case "D"
|
144 | Daempfung = Val(endwert) 'Es wurde die Dämpfung gesenden
|
145 | End Select
|
146 | End Select
|
147 |
|
148 | Zeichen = "" 'Zeichen zurücksetzen
|
149 | Case Else
|
150 | Zeichen = Zeichen + Chr(nummer) 'Nächstes zeichen hinzusetzen
|
151 | End Select
|
152 | Return 'Ins Hauptprogramm zurückspringen
|
153 | '|------------------------------------The End-----------------------------------|'
|