PE4302・ArduinoNano・SSD1306 |
可変アッテネータ
PE4302数値制御アッテネータ(1MHz〜4GHz)をArduinoNanoで制御、表示はOLED128x32を使いエンコーダで減衰値を選択しています。海外ネットのプログラムを参考にしました。
SG 10MHzを測定
ATT -0.0dB Meter -06.0dBm
ATT -10.0dB Meter -15.9dBm
回路図
プログラム
#include <Encoder.h>
#include <Arduino.h>
#include "OLED_SSD1306.h" // https://github.com/askn37/OLED_SSD1306#start-of-content
OLED_M091P oled;
Encoder enc(2,3);
int attsw = 4;
int att=0;
// Assignments:
float LCDdata = 0; // 0 to 31.5 Data for LCD
int AttenData = 0; // 0 to 63 data for the attenuator
int changerate =4;
long lastPos = 0;
void printToLCD(float)
{
oled.setCursor (0, 2);
oled.println("ATT");
oled.setCursor(0, 3);
if (LCDdata < 10.0) oled.print(" ");
oled.print("- ");
oled.print(LCDdata, 1);
oled.print(" dB");
}
void setup()
{
pinMode(attsw, INPUT_PULLUP);
oled.begin();
oled.mirror(); //左右表示反転
oled.flip(); //上下表示反転
oled.setCursor (0, 2);
oled.println("PE4302");
oled.setCursor(0, 3);
oled.println("ATT");
delay (2000);
oled.clear();
}
void loop()
{
// 0.5dB steps, so six bits are needed.)
// D8 to 13 go to attenuator V1 to V6
if (digitalRead(attsw) == LOW) {
AttenData= 63 ;
}
DDRB = B00111111;
PORTB = AttenData;
long newPos = enc.read() /changerate;
if (newPos != lastPos) // then encoder has moved
{
if (newPos < lastPos)
{ if (AttenData > 0) AttenData--;
}
else
{ if (AttenData < 63) AttenData++;
}
lastPos = newPos;
}
// AttenData (0 to 63) is divided by two
// to get the 0 to 31.5 for the LCD.
LCDdata = AttenData / 2.0;
// Attendata is an int. the decimal 2.0 forces
// a floating point calculation.
// Now add 2dB offset to allow for the insertion loss
// of about 1.2dB, which I have padded up to 2dB.
LCDdata = LCDdata + 0.0;
//and display it.
printToLCD(AttenData);
delay (100); //For the display again
}
0 件のコメント:
コメントを投稿