// modbus slave 23cm PA control rgk 2017 // bedoeld voor een arduino nano board #include #include /* SimpleModbusSlaveV10 supports function 3, 6 & 16. The modbus_update() method updates the holdingRegs register array and checks communication. */ #define LED_ERR 4 //pin voor error led op front #define SLAVE_ID 2 //Modbus slave adres voor 23cm eindtrap #define TX_RX 2 //Tx/Rx omschakelpin #define mains 3 //netrelais #define bias 5 //standby/run #define blower 6 //blower on #define coax 7 //coax relais stuursignaal #define MCP 0x4d //I2c adres van de MCP9800 temperatuursensor #define pwr_ctrl 11 //pwm pin die de rf attenuator aanstuurt #define PCAL 5325 //forward power meting calibratie factor // Using the enum instruction allows for an easy method for adding and // removing registers. Doing it this way saves you #defining the size // of your slaves register array each time you want to add more registers // and at a glimpse informs you of your slaves register layout. //////////////// registers of your slave /////////////////// enum { // just add or remove registers and your good to go... // The first register starts at address 0 DIG, U_DR, I_DR, U_PA, I_PA, FWD, REV, TEMP, HOLDING_REGS_SIZE // leave this one // total number of registers for function 3 and 16 share the same register array // i.e. the same address space }; unsigned int holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 16 register array unsigned char DIGITAL; unsigned char DIGITAL_OLD; unsigned int temp;// ruwe data en 2-complements notatie! unsigned int forward; unsigned int reverse; byte PWM; //////////////////////////////////////////////////////////// void setup() { Wire.begin(); modbus_configure(&Serial, 38400, SERIAL_8N2, SLAVE_ID, TX_RX, HOLDING_REGS_SIZE, holdingRegs); pinMode(mains,OUTPUT); //230Volt relais pinMode(LED_ERR,OUTPUT); //errorledje pinMode(bias,OUTPUT); //bias driver & pa pinMode(blower,OUTPUT); //blower pinMode(coax,OUTPUT); //coax relais PWM=1; //opstartwaarde pwm regeling RF attenuator analogWrite(pwr_ctrl,PWM); } void loop() { // modbus_update() is the only method used in loop(). It returns the total error // count since the slave started. You don't have to use it but it's useful // for fault finding by the modbus master. unsigned char error; error = modbus_update(); temp = meetTemp(); // lees i2c temp sensor uit forward = meetDirCoupler(0); reverse = meetDirCoupler(1); DIGITAL = lowByte(holdingRegs[DIG]);// lsb is stuurregister voor relais & blower & bias if(DIGITAL!=DIGITAL_OLD){ digitalWrite(mains,(bitRead(DIGITAL,0))); digitalWrite(bias,(bitRead(DIGITAL,1))); digitalWrite(blower,(bitRead(DIGITAL,2))); digitalWrite(coax,(bitRead(DIGITAL,3))); DIGITAL_OLD=DIGITAL; } PWM=highByte(holdingRegs[DIG]);//msb is stuurregister voor de power regeling(pwm sturing) analogWrite(pwr_ctrl,PWM); holdingRegs[U_DR]=analogRead(A0);// analoge ingang A0 hangt aan meetpunt U_driver holdingRegs[I_DR]=analogRead(A1);// enz,enz holdingRegs[U_PA]=analogRead(A2); holdingRegs[I_PA]=analogRead(A3); holdingRegs[REV]=reverse; // meetwaarde richtkoppelaar reverse power holdingRegs[FWD]=forward; // meetwaarde richtkoppelaar forward power holdingRegs[TEMP]=temp; // uitlezing temperatuursensor if(error>10)digitalWrite(LED_ERR,HIGH);// dit moet nog anders, werkt niet zo goed. else digitalWrite(LED_ERR,LOW); } // einde hoofd loop // i2c temperatuursensor uitlezen int meetTemp(void){ Wire.beginTransmission(MCP); Wire.write(00); Wire.requestFrom(MCP,2); char hi = Wire.read(); char lo = Wire.read(); int tmp = word(hi,lo); return tmp; } // richtkoppelaar uitlezen int meetDirCoupler(char dir){ if(dir){ float swr; int fwd; int rev; float x; float y; fwd = analogRead(A7); rev = analogRead(A6)/4; //correctie 4x gain in reflected pwr meting if(fwd<50)return 99; // te weinig power voor zinvolle swr meting x=fwd+rev; y=fwd-rev; swr = x/y; swr *=100; //zorg dat bij conversie naar int er nog wat overblijft van achter de komma swr=int(swr); // conversie float naar int (nodig??) return swr; } else{ unsigned long txpwr; txpwr=analogRead(A7); // uitlezen richtkoppelaar txpwr *=txpwr; // power is spanning in kwadraat txpwr /=PCAL; // omrekening met calibratiefactor richtkoppelaar txpwr = int(txpwr); // conversie long naar integer (nodig??) return txpwr; } }