#include <SPI.h>
#define onikiv 16
#define yirmialtiv 20
#define otuzikiv 21
#define led 25
#define basamakBtn 10
#define yukariBtn 11
#define asagiBtn 12
float basamak = 0;
float yukari = 0;
float asagi = 0;
int bayrak = 0;
float voltaj = 0;
float akim = 0;
const int dacChipSelectPin = 17;
void setDac(int value, int channel) {
byte dacRegister = 0b00110000; // Varsayılan DAC kayıtlarını ayarlar B00110000, 1. bit DAC'yi seçer, A=0 B=1, 2. Bit giriş Tamponunu atlar, 3. bit çıkış kazancını 1x'e ayarlar, 4. bit aktif düşük kapatmayı kontrol eder. LSB burada önemsizdir.
int dacSecondaryByteMask = 0b0000000011111111; // 12 bitlik değer olan B00000000111111111'in son 8 bitini izole eder.
byte dacPrimaryByte = (value >> 8) | dacRegister; //Değer maksimum 12 Bit değerdir, Birincil Bayta giriş için değerden ilk 4 MSB'yi almak için 8 bayt sağa kaydırılır, ardından da Register ile BORed
byte dacSecondaryByte = value & dacSecondaryByteMask; // 8 LSB'yi izole etmek ve onu tek bir bayta indirmek için 12 bit değerini karşılaştırır.
// Ayarlanacak DAC'yi belirlemek için birincil Baytta MSB'yi ayarlar, DAC A=0, DAC B=1
switch (channel) {
case 0:
dacPrimaryByte &= ~(1 << 7);
break;
case 1:
dacPrimaryByte |= (1 << 7);
}
noInterrupts(); // DAC'ye veri göndermeye hazırlanmak için kesintileri devre dışı bırakın
digitalWrite(dacChipSelectPin, LOW); // DAC'yi seçmek için Chip Select pinini alçaltın:
SPI.transfer(dacPrimaryByte); // Birincil Baytı gönder:
SPI.transfer(dacSecondaryByte); // İkincil Baytı gönder
digitalWrite(dacChipSelectPin, HIGH); // DAC'nin seçimini kaldırmak için Chip Select pinini yükseğe alın:
interrupts(); // Kesintileri etkinleştir
}
void setup() {
// DAC KODLARI /////////////
pinMode(dacChipSelectPin, OUTPUT);
// set the ChipSelectPins high initially:
digitalWrite(dacChipSelectPin, HIGH);
// initialise SPI:
setDac(0, 0); //Amper
setDac(0, 1); //Volt
pinMode(onikiv, OUTPUT);
pinMode(yirmialtiv, OUTPUT);
pinMode(otuzikiv, OUTPUT);
pinMode(led, OUTPUT);
pinMode(basamakBtn, INPUT);
pinMode(yukariBtn, INPUT);
pinMode(asagiBtn, INPUT);
digitalWrite(onikiv, LOW);
digitalWrite(yirmialtiv, LOW);
digitalWrite(otuzikiv, LOW);
digitalWrite(led, LOW);
}
void loop() {
if (digitalRead(basamakBtn) == 1) {
if (bayrak <= 2) {
bayrak++;
} else if (bayrak > 3) {
bayrak = 0;
}
delay(300);
}
if (voltaj >= 30) {
voltaj = 0;
akim = 0;
}
if (digitalRead(yukariBtn) == 1) {
if (bayrak == 1) {
voltaj++;
akim++;
voltaj = voltaj * 136;
setDac(voltaj, 1); // Volt
akim = akim * 136;
setDac(akim, 0); //Amper
} else if (bayrak == 2) {
voltaj = voltaj + 10;
akim = akim + 10;
voltaj = voltaj * 136;
setDac(voltaj, 1); // Volt
akim = akim * 136;
setDac(akim, 0); //Amper
}
}
if (digitalRead(asagiBtn) == 1) {
if (bayrak == 1) {
voltaj--;
akim--;
voltaj = voltaj * 136;
setDac(voltaj, 1); // Volt
akim = akim * 136;
setDac(akim, 0); //Amper
} else if (bayrak == 2) {
voltaj = voltaj - 10;
akim = akim - 10;
voltaj = voltaj * 136;
setDac(voltaj, 1); // Volt
akim = akim * 136;
setDac(akim, 0); //Amper
}
}
digitalWrite(yirmialtiv, LOW);
digitalWrite(otuzikiv, LOW);
delay(20);
digitalWrite(onikiv, HIGH);
digitalWrite(led, HIGH);
}