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  




Elektronik-Labor   Projekte   AVR