// -------------------------------------- // i2c basic com with PCA9555 // // Le 20 Juin 2018 by Mej // ///////////////////////////////////////////////////////////////////////////////////////////////////////// //Pin for monitoring loop int Trig1 = A0; // Wire and functions #include void set_I2C_register(byte ADDRESS, byte REGISTER, byte VALUE) { Wire.beginTransmission(ADDRESS); Wire.write(REGISTER); Wire.write(VALUE); Wire.endTransmission(); } byte get_I2C_register(byte ADDRESS, byte REGISTER) { Wire.beginTransmission(ADDRESS); Wire.write(REGISTER); Wire.endTransmission(); Wire.requestFrom(ADDRESS, 1); //read 1 byte byte x = Wire.read(); return x; } //timing monitoring variables unsigned long t_0 = millis(); // gives time since startup in ms. Overflow after 50 days. unsigned long t = millis(); unsigned long loop_cnt = 0; //loop count const int D = 2500; //delay between loops in ms ///////////////////////////////////////////////////////////////////////////////////////////////////////// //## MAX31790 ("4pin fan" controler - 6 channel) address //Address const byte MAX31790 = B0100000; // 0x20 byte data, data0, data1; void setup() { Serial.begin(115200); delay(1000); while (!Serial); // wait for serial monitor to be monitoring ^^ //Set and scan I²C bus Wire.begin(); Serial.println("\nI2C Scanning..."); byte error, address; int nDevices =0; for(address = 16; address < 100; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. // Copy/Pasted/Tweeked from https://playground.arduino.cc/Main/I2cScanner delay(1); Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); //Reset MAX31790 (POR) set_I2C_register(MAX31790, 0x00, B01010000); //reset delay(100); //set_I2C_register(MAX31790, 0x00, B00110000); //no I²Ctime-out //PWM Frequency set_I2C_register(MAX31790, 0x01, B10111011); //25kHz delay(1); //Configuration data = B00001000; //PWM mode - 'Spin-up' OFF - control ON - Tach count- PWM yeah set_I2C_register(MAX31790, 0x02, data); delay(1); set_I2C_register(MAX31790, 0x03, data); delay(1); set_I2C_register(MAX31790, 0x04, data); delay(1); set_I2C_register(MAX31790, 0x05, data); delay(1); set_I2C_register(MAX31790, 0x06, data); delay(1); set_I2C_register(MAX31790, 0x07, data); delay(1); // //PWM // data0 = B00000000; // PWM=0 // data1 = B0000000; // set_I2C_register(MAX31790, 0x30, data0); //Channel 1 // set_I2C_register(MAX31790, 0x31, data1); // set_I2C_register(MAX31790, 0x32, data0); //Channel 2 // set_I2C_register(MAX31790, 0x33, data1); // set_I2C_register(MAX31790, 0x34, data0); //Channel 3 // set_I2C_register(MAX31790, 0x35, data1); // set_I2C_register(MAX31790, 0x36, data0); //Channel 5 // set_I2C_register(MAX31790, 0x37, data1); // set_I2C_register(MAX31790, 0x38, data0); //Channel 5 // set_I2C_register(MAX31790, 0x39, data1); // set_I2C_register(MAX31790, 0x3A, data0); //Channel 6 // set_I2C_register(MAX31790, 0x3B, data1); //Pin for monitoring loop pinMode(Trig1, OUTPUT); digitalWrite(Trig1, LOW); } void loop() { loop_cnt = loop_cnt+1; t_0 = millis(); digitalWrite(Trig1, HIGH); // Update PWM target (9bit) //byte pwm0 = (loop_cnt*8)%256; //0 to 255 in 5 steps of 51 byte pwm0 = B00000000; if (loop_cnt%2==0){ pwm0 = B11001000;} //200 else{ pwm0 = B1100100;} //100 byte pwm1 = B00000000; //LSB is ignored //Writte PWM target in registers set_I2C_register(MAX31790, 0x40, pwm0); //Channel 1 set_I2C_register(MAX31790, 0x41, pwm1); set_I2C_register(MAX31790, 0x42, pwm0); //Channel 2 set_I2C_register(MAX31790, 0x43, pwm1); set_I2C_register(MAX31790, 0x44, data0); //Channel 3 set_I2C_register(MAX31790, 0x45, data1); set_I2C_register(MAX31790, 0x46, data0); //Channel 5 set_I2C_register(MAX31790, 0x47, data1); set_I2C_register(MAX31790, 0x48, data0); //Channel 5 set_I2C_register(MAX31790, 0x49, data1); set_I2C_register(MAX31790, 0x4A, data0); //Channel 6 set_I2C_register(MAX31790, 0x4B, data1); //Read smth data0 = get_I2C_register(MAX31790, 0x18); //Tach1 count data1 = get_I2C_register(MAX31790, 0x19); int tach1 = data0*8+data1/32; data = get_I2C_register(MAX31790, 0x30); //Writte read User reg set_I2C_register(MAX31790, 0x15, B10011001); delay(1); byte check = get_I2C_register(MAX31790, 0x15); //////////////////////////////////////////////////// print Serial.print(" PWM_target="); Serial.print(pwm0,DEC); Serial.print(" "); Serial.print(data,DEC); Serial.print(" "); Serial.print(" Tach1="); Serial.print(tach1,DEC); Serial.print(" "); Serial.print(" "); Serial.print(" Check="); Serial.print(check,BIN); Serial.print(" "); t = millis(); Serial.print("t[s]= "); Serial.print(t/1000.0, 3); Serial.print("\t t_loop[ms]= "); Serial.println(t-t_0, DEC); digitalWrite(Trig1, LOW); delay(D); }