Das Dämpfungsglied mit dem PE4302 Chip soll seriell einstellbar sein und vom PC aus angesprochen werden können.
Dazu nehme ich die Schaltung vom vorherigen Beitrag und erweitere die Arduino Software für die serielle Steuerung.
Diese seriellen Kommandos können im Seriellen Monitor des Arduino Programms eingegeben werden und werden dann zum Arduino geschickt, der entsprechende Aktionen auslöst.
Die Kommandos sind:
s : set attentuator. Examples: s1.5 | s0 | s 22.5 | s 31 | s 0.0
g : get actual attentuator value
d : device class
w : who
v : version
1 : min. frequency
2 : max. frequency
3 : min. attentuation
4 : max. attentuation
5 : attentuator step width
Diese Auflistung ist auch über das h (help) Kommando aufrufbar. Dann wird die Liste der Kommandos ausgegeben.
Hier die Arduino Software:
// PE4302 Digital Step Attentuator
// 1MHz bis 4GHz Dämpfungsglied 0-31,5dB
//
// seriell vom PC aus einstellbar
//
// Matthias Busse 10.2017 Version 2.0
int DATA=5;
int CLOCK=6;
int LE=7;
float att=0.0; // Dämpfung und Startwert
void setup() {
Serial.begin(38400);
pinMode(DATA, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(LE, OUTPUT);
setAttenuator(att);
}
void loop() {
int ser, len;
char buf[10];
float attinput;
if (Serial.available() > 0) {
ser = Serial.read();
if(ser == 'h') {
Serial.println("Help");
Serial.println(" s: set attentuator. Examples: s1.5 | s0 | s 22.5 | s 31 | s 0.0 ");
Serial.println(" g: get actual attentuator value");
Serial.println(" d: device class");
Serial.println(" w: who");
Serial.println(" v: version");
Serial.println(" 1: min. frequency");
Serial.println(" 2: max. frequency");
Serial.println(" 3: min. attentuation");
Serial.println(" 4: max. attentuation");
Serial.println(" 5: attentuator step width");
}
if(ser == 'd') Serial.println("Attentuator"); // device ?
if(ser == 'w') Serial.println("PE4302"); // who ?
if(ser == 'v') Serial.println("1.0"); // version ?
if(ser == '1') Serial.println("1000000"); // 1MHz fmin
if(ser == '2') Serial.println("4000000000"); // 4GHz fmax
if(ser == '3') Serial.println("0.0"); // 0 dB att. min
if(ser == '4') Serial.println("31.5"); // 31.5dB att. max
if(ser == '5') Serial.println("0.5"); // att. step
if(ser == 'g') Serial.println(att); // get attentuation
if(ser == 's') { // set attentuation s1.5 | s0 | s 22.5 | s 31 | s 0.0
Serial.setTimeout(15);
len = Serial.readBytes(buf,10);
if((len>2) && (len<8)) { // s und was dahinter ?
attinput = atof (buf);
attinput = (round(attinput * 2.0)) /2.0; // auf .0 und .5 runden
if((attinput >= 0.0) && (attinput <= 31.51)) {
att=attinput;
setAttenuator(att);
}
}
}
Serial.setTimeout(500);
}
}
void setAttenuator(float attent){
// MSB (C16) ... LSB (C0.5) werden an den PA4302 seriell übergeben
// max. 25kHz oder alle 0,05 ms aufrufen.
//
// Matthias Busse 10.2017 Version 1.0
int i; // das Datenbit
int attent2 = (int) attent*2.0;
if ((attent2 < 0) || (attent2 > 63)) // Wert im Bereich ?
return;
digitalWrite(LE, LOW); // Daten in das Latch eingeben
digitalWrite(CLOCK,LOW);
for (int b = 6; b > 0; b--) { // die 6 Bits
i=((attent2 << 1) >> b) & 0x01;
digitalWrite(DATA, i); // ein Bit schreiben
digitalWrite(CLOCK, HIGH); // und Bit übernehmen
digitalWrite(CLOCK, LOW);
}
digitalWrite(LE, HIGH); // Serielle Daten an den Chip übergeben
digitalWrite(LE, LOW); // Auf neue Daten warten.
}
Verwendet wurden:
Arduino Uno
Arduino Software 1.8.0
Drei Spannungsteiler 5V > 3V aus 2,2k und 3,3kOhm
PE4302 Platine fertig aufgebaut
Aufbau wie in diesem Beitrag.
von Matthias Busse

Pingback: PE4302 Attentuator einstellen vom PC & Rotary Encoder, Ausgabe auf LCD Display | Shelvin – Elektronik ausprobiert und erläutert
Hallo,
vielen Dank für dieses Beispiel.
Beim Testen ist uns aufgefallen, dass es einen kleinen Bug im Code gibt. In Zeile 73 wird der int-Cast zuerst ausgeführt und danach wird multipliziert. Dadurch wird eine 0.5 immer verschluckt.
Korrekt wäre also:
int attent2 = (int) (attent*2.0);
Viele Grüße
Manuel