UNI-C Universeller Messwerterfassungs-Controller
UNI-C ist eine All-in-One-Lösung, die praktisch IFP, ADA-IO, AD16-8, DA12-8 und ein kleines FPGA-Modul auf einer Platine vereint.
Firmware für den ATmega644-Controller sowie FPGA-Beispielkonfigurationen (zur Demo den Inhalt des Ordners sdcard auf SD-Karte kopieren) ab sofort verfügbar!
FPGA-Beispielkonfigurationen:
- blink.bit lässt die LED auf der FPGA-Bridge aufblitzen. Gut zur grundsätzlichen Funktionskontrolle.
- ports.bit verwandelt das FPGA in einen Portbaustein mit einstellbarer Datenrichtung für jedes Bit. SPI-Register 2 (SubCh 62) legt die Datenrichtung fest, SPI-Register 3 (SubCh 63) den Ausgangswert. Aktueller Port-Zustand kann auf SubCh 63 auch gelesen werden.
- pwm.bit ist ein fortgeschrittenes Beispiel zur Kommunikation zwischen UNI-C und FPGA-Bridge. Spannung an Eingang ADC0 wird in ein PWM-Signal umgesetzt, das die LED auf der FPGA-Bridge steuert und als gleicher Spannungswert am DAC0 automatisch wieder ausgegeben wird. Die Wandlungsrate beträgt hier rund 1 kHz.
- startup.ini wird beim Einschalten automatisch ausgeführt. Hier ein LabScript, das die pwm.bit-Konfiguration lädt, einige Register einstellt (etwa Helligkeit der LED) und sich dann beendet.
Ergänzungen und Berichtigungen
Im Schaltbild zur FPGA-Bridge ist der serielle Anschluss PL19 (3,3V-TTL-Pegel) nicht eingezeichnet. Der Schaltplan im Schematics-Ordner wurde entsprechend korrigiert. Der Anschluss weist die gleiche Pinbelegung wie der serielle Anschluss auf der Interface-Zusatzplatine auf. Verbindet man beide, ist bei entsprechender Konfiguration eine direkte Kommunikation mit dem FPGA möglich. Ich empfehle hier den kompakten FIFO-UART von Ken Chapman, Xilinx (im kostenlosen PicoBlaze-Paket enthalten).
Unser erster Firmware-Upload war versehentlich für eine Quarzfrequenz von 16 statt 20 MHz kompiliert worden. Die Version für 20 MHz haben wir jetzt nachgeschoben. Die ZIPs lassen sich durch den Suffix _16 und _20 auseinanderhalten - es handelt sich hierbei nicht um eine Versionsnummer! Achtung: Erste Kompilate der 20-MHz-Version wiesen durch zu starke Optimierung einen Fehler im Parser auf. Dieser Fehler ist mit Datum 05.03.2012 behoben.
Durch ein dummes Missgeschick des Layouters (ähem, das war ich!) fehlen auf der UNI-C-Hauptplatine zwei Leiterbahnen zur Stromversorgung der Optokoppler. Eine Korrektur durch zwei Drahtbrücken ist sehr leicht anhand des Fotos möglich. Der Fehler wirkt sich nur bei Verwendung der RS-232-Buchse aus.
Bitte verwenden Sie keine SDHC- oder SDXC-Karten (meist bei Kapazitäten > 2GByte). Es funktionieren alle einfachen SD-, MMC- und Micro-SD-Karten (mit Adapter) bis 2 GByte.
SubChannel-Belegung
Die SubChannel-Belegung orientiert sich an den SubChannels des ADA-IO- und des FPGA-Moduls. Ausnahmen sind hier die FPGA-Register 0 bis 19 auf SubCh 60 bis 79, die Skalierungen/Offsets? ab SubCh 100 und der Frequenzzähler-Eingang auf SubCh 8 (Eingang T1, Port PB1). Er wird über Subch 9 konfiguriert (Modus, Frequenzbereich). Im Unterschied zur Darstellung im Artikel erzeugt der Controller kein PWM-Signal. Dies erledigt ggf. die FPGA-Bridge viel eleganter. Neu ist die bequeme Baudraten-Einstellung direkt über SBD=<baudrate> (getestet bis 57600). Bitte beachten Sie unbedingt die eigene Syntax-Tabelle des UNI-C-Moduls!
FPGA-Register
Die Freigabe-Flags des SPI-Registers 0 in der FPGA-Bridge wurden um acht Write-Enable-Flags erweitert. Der Controller schreibt nun die acht ADC-Werte ADC0 bis ADC7 nur dann in die FPGA-Register 8 bis 15, wenn das zugehörige Bit 0 bis 7 der Write-Enable-Flags gesetzt ist. Dies beschleunigt die Befehlsabarbeitung, wenn die ADC-Werte im FPGA gar nicht (alle) gebraucht werden.
Findet der Controller nach Laden einer FPGA-Konfiguration nicht das "Magic Word" $AA55 in der oberen Hälfte des SPI-Registers 0, wird keines der Register automatisch befüllt oder ausgelesen. Die SPI-Register im FPGA bleiben, so vorhanden, selbstverständlich über die SubChannels 60 bis 79 zugänglich.
Die Darstellung im c't-Sonderheft-Artikel bezüglich der eingeschriebenen und ausgelesenen ADC- und DAC-Werte ist nicht ganz korrekt: Der Controller erwartet für die vier DAC-Kanäle 0 bis 3 keine Raw-, sondern "Festkomma"-Werte im Bereich -10000 ($D8F0, -10V) bis +10000 ($2710, +10V), d.h. der Messwert ist mit 1000 multipliziert abzuliefern. Die Polaritätsumschaltung und die Default/Kanal?-Offsets und -Skalierungen werden auch bei den aus dem FPGA gelesenen Werten berücksichtigt!
Gleiches gilt für die ADC-Werte 0 bis 7, die dem FPGA in den SPI-Registern 8 bis 15 übergeben werden. Hier reicht der Wertebereich mit der Default-Skalierung von 0 ($0000, 0V) bis +10000 ($2710, +10V). Negative Werte sind bei gesetztem Jumper und entsprechender Skalierung möglich.
Hier die vollständige Tabelle der SPI-Register:
| Vom FPGA gelieferte Registerinhalte | ||||||
| SPI-Register/Langwort? | MSB | LSB | Beispiel | Bemerkungen | ||
| 0 - Flags | $AA | $55 | WRena | RDena | $AA550330 | SubCh 60, vom FPGA vorgegeben |
| 1 - Datum | Tag | Monat | Jahr | Jahr | $09112011 | SubCh 61, vom FPGA vorgegeben |
| 2 - Relais | REL3 | REL2 | REL1 | REL0 | $00000204 | SubCh 62, vom FPGA vorzugeben, falls RDena-Bits gesetzt |
| 3 - Ports | Inp3 | Inp2 | Inp1 | Inp0 | $0000FFFF | SubCh 63, frei verwendbar |
| 4 - DAC0 | xx | xx | MSB | LSB | $00000204 | SubCh 64 ff., vom FPGA vorzugeben, falls RDena-Bit 4 gesetzt |
| 5 - DAC1 | xx | xx | MSB | LSB | $00000204 | vom FPGA vorzugeben, falls RDena-Bit 5 gesetzt |
| 6 - DAC2 | xx | xx | MSB | LSB | $00000204 | vom FPGA vorzugeben, falls RDena-Bit 6 gesetzt |
| 7 - DAC3 | xx | xx | MSB | LSB | $00000204 | vom FPGA vorzugeben, falls RDena-Bit 7 gesetzt |
| Vom Controller beschriebene Register | ||||||
| SPI-Register/Integer? | MSB | LSB | Beispiel | Bemerkungen | ||
| 8 - ADC0 | xx | xx | MSB | LSB | $00002376 | SubCh 68 ff., vom Controller geliefert, falls WRena-Bit 0 gesetzt |
| 9 - ADC1 | xx | xx | MSB | LSB | $00000000 | vom Controller geliefert, falls WRena-Bit 1 gesetzt |
| 10 - ADC2 | xx | xx | MSB | LSB | $0000FF24 | vom Controller geliefert, falls WRena-Bit 2 gesetzt |
| 11 - ADC3 | xx | xx | MSB | LSB | $00000000 | vom Controller geliefert, falls WRena-Bit 3 gesetzt |
| 12 - ADC4 | xx | xx | MSB | LSB | $00000000 | vom Controller geliefert, falls WRena-Bit 4 gesetzt |
| 13 - ADC5 | xx | xx | MSB | LSB | $00000000 | vom Controller geliefert, falls WRena-Bit 5 gesetzt |
| 14 - ADC6 | xx | xx | MSB | LSB | $00000000 | vom Controller geliefert, falls WRena-Bit 6 gesetzt |
| 15 - ADC7 | xx | xx | MSB | LSB | $00000000 | vom Controller geliefert, falls WRena-Bit 7 gesetzt |
| RDena Read Enables | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
| Enable-Flag | DAC3 | DAC2 | DAC1 | DAC0 | REL3 | REL2 | REL1 | REL0 |
| WRena Write Enables | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
| Enable-Flag | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADC1 | ADC0 |
Die SPI-Register 16 bis 19 (über SubCh 76 bis 79 erreichbar) werden nicht verwendet und können frei benutzt werden. Gleiches gilt für diejenigen Register, deren Enable-Flagbit auf "0" gesetzt ist.

