Nachbau des AD210 von AK Modulbus
von Ralf Beesner
Elektronik-Labor
Projekte
AVR
Übersicht
In einem älteren Beitrag (ClabT13.html) hatte
ich beschrieben, wie man mit einem ATtiny13 preiswert die Funktionen
eines AK Modulbus COMPULAB so weit "re-engineeren" kann, dass H.J
Berndts hübsche Windows-Softwarelösungen CompactDefinition bzw.
TurboCompact auf ihren virtuellen Analoginstrumenten Spannungen
anzeigen und den ATtiny ein PWM-Signal erzeugen lassen.
Damals
ließ sich TurboCompact noch unter Linux betreiben (dank des
Windows-Wrappers "Wine"), aber inzwischen wurde Wine so weit umgebaut,
dass beide Programme schon beim Programmstart mit einer
Schutzverletzung abbrechen.
Unter Linux/Wine läuft nun nur noch
Burkhard Kainkas Demo-Programm MBAD210.exe. Es erfordert jedoch eine
etwas andere Hardware - das AD210 von AK Modulbus - und weist leider
nur Grundfunktionen auf; insbesondere ist es nicht möglich, Messreihen
abzuspeichern.
Ich habe aber inzwischen eine erweiterte Version
in Python programmiert, die in einem weiteren Beitrag beschrieben wird,
hier schon mal ein Screenshot:
Eine Beschreibung und das Datenblatt des AD210 findet man hier: http://www.elexs.de/AD210.html
Aus
Beschreibung und Datenblatt kann man recht gut auf das Innenleben des
AD210 schließen und es mit einem ATtiny13 und BASCOM-Code nachbauen.
Hardware
Der
AD210-Nachbau weist wie das Original einen PWM-Ausgang und zwei
hochohmige Eingänge auf. An den Eingängen liegen zwei Spannungsteiler
9,3:1, der Eingangswiderstand beträgt etwa 1 MOhm.
Mit einem
Teilerverhältnis von 9,3 werden 10,23V zu 1,1V. Verwendet man die
interne 1,1V-Referenz, gibt der AD-Wandler 1023 aus. Das originale
AD210 nutzt Spannungsteiler aus den eher ungebräuchlichen Werten 910
kOhm und 110 kOhm (genaues Teilerverhältnis 9,273), man kann aber auch
1 MOhm und 120kOhm verwenden (genaues Teilerverhältnis dann 9,333).
Betreibt
man den Mikrocontroller mit 3,3 V Betriebsspannung, lässt sich die
Messbereichsumschaltung 10V/30V durch Wahl der ADC-Referenzspannung
vornehmen, indem man zwischen der internen 1,1V-Referenz und AVCC
umschaltet.
Am PWM-Ausgang liegt ein Schutzwiderstand von 1 kOhm.
Die übrige Schaltung ähnelt dem alten Lernpaket Mikrocontroller:
Die
unstabilisierte Betriebsspannung wird aus der seriellen Schnittstelle
gewonnen (aus RTS- und/oder DTR-Signal) und mit einem kleinen 3,3V
Spannungsregler stabilisiert. Man sollte keinen veralteten 78L05,
sondern einen moderneren MOS-Schaltkreis wie den LP2950-3V3 verwenden,
der schon bei einer Differenzspannung von wenigen mV zu regeln beginnt
(und nicht erst bei 2V).
Jedoch kann es Probleme mit dem
aufgrund der Betriebsspannung von 3,3V recht niedrigen Sendepegel auf
der TxD-Leitung geben. Einige USB-Seriell-Wandler funktionieren mit dem
geringen Pegel nicht mehr. Man kann dann versuchen, den
1kOhm-Schutzwiderstand in der TxD-Leitung des ATtiny13 zu verkleinern.
Betriebssicherer ist es jedoch, einen Transistor in Basisschaltung als
Pegelwandler einzufügen.
Sein Emitter wird mit dem Ausgangspegel
des ATtiny13 angesteuert, die Basis liegt auf 3,3 V und der Kollektor
ist über einen Pullup-Widerstand mit der unstabilisierten
Betriebsspannung verbunden, die bei RS232-USB-Seriell-Wandlern etwa 6V
- 9V beträgt. Damit ergibt sich folgender Schaltplan bzw. die
Realisierung auf einer Streifenraster-Platine (Ansicht von oben):
Aufgebaut
habe ich den AD210-Nachbau nicht komplett, sondern nur eine
Tochterplatine mit den Spannungsteilern an meinen LP
Microcontroller-Nachbau "angeflanscht" und den TxD-Widerstand R2 mit
Krokodilklemmen überbrückt:
Software
Das
AD210 wird mit 1-Byte-Befehlen (also nicht mit ASCII-Zeichen)
angesteuert und antwortet - je nach Befehl - mit seiner Kennung bzw.
ein bzw. zwei Bytes, die für ADC-Ausgaben (also 0 ... 255 bzw. 0 ...
1023) stehen. MBAD210.exe nutzt nur die 10bit-Auflösung des ADC. Der
PWM-Ausgang wird gesetzt, indem direkt an den Befehl ein Byte von 0 ...
255 angehängt wird.
Die wesentlichen Befehle und Antworten:
1 Interface-Kennung (100)
56 HiByte, LowByte erster ADC, 10V-Messbereich
57 HiByte, LowByte zweiter ADC, 10V-Messbereich
58 HiByte, LowByte erster ADC, 30V-Messbereich
59 HiByte, LowByte zweiter ADC, 30V-Messbereich
64+Byte PWM-Ausgangssignal 0-100%, geglättet 0 ... 3,3V
Der
Bascom-Nachbau der Software ist kompiliert 700 Byte groß und passt
daher bequem in einen ATtiny13. Die Software setzt den Takt zur
Laufzeit auf 9,6 MHz, man braucht also keine FuseBytes zu flashen,
sondern kann den ATtiny in der Werkseinstellung (1,2 MHz Takt) belassen.
Den PWM-Ausgang musste ich auf den recht niedrigen Takt von ca. 600 Hz
herabsetzen (Vorteiler 1:64), weil bei hohem Takt die ADC-Messwerte zu
"flattern" begannen. Anscheinend erzeugen die relativ hohen Umladeströme
chipintern eine Rückwirkung auf den ADC.
Möchte man das PWM-Signal mit einem Tiefpass glätten, sollte man ihn
hochohmig auslegen (> 10 kOhm), da sonst ebenfalls Rückwirkungen auf den
ADC entstehen.
Schaltet man zwischen 10V und 30V- Messbereich um, weichen die Spannungswerte
etwas voneinander ab. Die interne 1,1V-Referenz der ATtinies ist recht
ungenau - vermutlich ungenauer als die Ausgangsspannung eines 3,3v-Reglers.
' Nachbau des AK Modulbus AD210 in Bascom
$Regfile = "attiny13.dat"
$Crystal = 9600000
$Hwstack = 8
$Swstack = 8
$Framesize = 8
'Baud = 9600
Clkpr = 128
Clkpr = 0
Clkpr = 0
' ungenutzte Digitaleingaenge abschalten
' muss rausgeworfen werden, wenn man den Befehl
' "Case 32 : Put #1 , Pinb" weiter unten nutzen will
Didr0 = &B00111011
Config Adc = Single , Prescaler = Auto
Start ADC
Open "comb.1:38400,8,n,1,INVERTED" For Output As #1
Open "comb.2:38400,8,n,1,INVERTED" For Input As #2
' PWM-Frequenz nur 586 Hz; mehr verschlechtert die ADC-Messungen
Config Timer0 = Pwm , Prescale = 64, Compare A Pwm = Clear Up
Ddrb.0 = 1
Ddrb.1 = 1
Dim Ana As Word
Dim Anahi As Byte
Dim Analo As Byte
Dim Command As Byte
Dim N As Byte
Dim Adcnr As Byte
Do
Get #2 , Command
Select Case Command
' ADMUX.6: Ref - 1 VCC 0 1,1V
' ADMUX.5: ADLAR
' ADMUX.1: 1
' ADMUX.0: 0 ADC2/PB4 1 ADC3/PB3
Case 1 : Put #1 , 100
Case 16 : Get #1 , Analo
Portb = Analo
Case 17 : Get #1 , Analo
Ddrb = Analo
Case 32 : Put #1 , Pinb
Case 48 : Admux = &B01000010 ' Ref=1,1V ADC2
Gosub Achtbit
Case 49 : Admux = &B01000011 ' Ref=1,1V ADC3
Gosub Achtbit
Case 50 : Admux = &B00000010 ' Ref=VCC ADC3
Gosub Achtbit
Case 51 : Admux = &B00000011 ' Ref=VCC ADC3
Gosub Achtbit
Case 56 : Admux = &B01000010 ' Ref=1,1V ADC2
Gosub Zehnbit
Case 57 : Admux = &B01000011 ' Ref=1,1V ADC3
Gosub Zehnbit
Case 58 : Admux = &B00000010 ' Ref=VCC ADC2
Gosub Zehnbit
Case 59 : Admux = &B00000011 ' Ref=VCC ADC3
Gosub Zehnbit
Case 64 : Get #2 , Analo
Pwm0a = Analo
Case 100:
For N = 0 To 61
Gosub Achtbit
Next
Case 101:
For N = 0 To 31
Toggle Admux.0
Gosub Achtbit
Next
End Select
Loop
Achtbit:
If Admux.0 = 0 Then
Adcnr = 2
Else
Adcnr = 3
End If
Ana = Getadc(adcnr)
Shift Ana , Right , 2
Put #1 , Ana
Return
Zehnbit:
If Admux.0 = 0 Then
Adcnr = 2
Else
Adcnr = 3
End If
Ana = Getadc(adcnr)
Anahi = High(ana)
Analo = Low(ana)
Put #1 , Anahi
Put #1 , Analo
Return
End

Download des Quellcodes und des Hexfiles: 0417-ad210-clone.zip