The software program is important to control the watering system to water the plants in different pots with different water quantity.
#include <SPI.h>
const int EN = 8; // Set pin 8 to control Enable pin of TLE94112
const int CSN = 10; // Set pin 10 (CSN1) to control CSN of TLE94112 (default)
// Addresses of the control registers
const byte HB_ACT_1_CTRL = B0000011; // Activation/deactivation of HB1-4
const byte HB_ACT_2_CTRL = B1000011; // Activation/deactivation of HB5-8
const byte HB_ACT_3_CTRL = B0100011; // Activation/deactivation of HB9-12
const byte HB_MODE_1_CTRL = B1100011; // Control mode (PWM enable, PWM channel) of HB1-4
const byte HB_MODE_2_CTRL = B0010011; // Control mode (PWM enable, PWM channel) of HB5-8
const byte HB_MODE_3_CTRL = B1010011; // Control mode (PWM enable, PWM channel) of HB9-12
const byte PWM_CH_FREQ_CTRL = B0110011; // PWM clock frequency and frequency modulation of the oscillator
const byte PWM1_DC_CTRL = B1110011; // Duty cycle of PWM Channel 1
const byte PWM2_DC_CTRL = B0001011; // Duty cycle of PWM Channel 2
const byte PWM3_DC_CTRL = B1001011; // Duty cycle of PWM Channel 3
const byte FW_OL_CTRL = B0101011; // LED mode for HS1/2 and active free-wheeling of HB1-6
const byte FW_CTRL = B1101011; // Active free-wheeling of HB7-12
const byte CONFIG_CTRL = B1100111; // Device ID
// Address of the status registers
const byte SYS_DIAG_1 = B00011011; // Global Status Register
const byte SYS_DIAG_2 = B01011011; // Overcurrent HB1-4
const byte SYS_DIAG_3 = B00111011; // Overcurrent HB5-8
const byte SYS_DIAG_4 = B01111011; // Overcurrent HB9-12
const byte SYS_DIAG_5 = B00000111; // Open load HB1-4
const byte SYS_DIAG_6 = B01000111; // Open load HB5-8
const byte SYS_DIAG_7 = B00100111; // Open load HB9-12
const byte WRITE = 0b10000000; // Mask for write commands to control registers
const byte CLEAR = 0b10000000; // Mask for clear commands to status registers
void setup() {
// Setup fo the parameters for SPI communication, set CSN and EN pins as outputs and set EN to High
Serial.begin(9600); // sets the baud rate for communication with the computer to 9600 bauds
SPI.begin(); // Initializes the SPI bus
SPI.setBitOrder(LSBFIRST); // Least significant bit is sent first
SPI.setClockDivider(SPI_CLOCK_DIV16); // SPI clock frequency set to 1 MHz
SPI.setDataMode(SPI_MODE1); // Set SPI clock polarity and clock phase; CPOL = 0, CPHA = 1
pinMode(CSN, OUTPUT); // sets CSN as output
pinMode(EN, OUTPUT); // sets EN as output
digitalWrite(EN, HIGH); // TLE94112 set in active mode (ENABLE pin = high)
}
void loop()
{
activateMotor1_PWM();
activateMotor2_PWM();
activateMotor3_PWM();
activateMotor4_PWM();
}
void activateMotor1_PWM()
{
writeRegister(HB_MODE_1_CTRL,0b1); // Map HB1 to PWM channel 1
writeRegister(PWM_CH_FREQ_CTRL,0b10); // Set Frequency of PWM channel 1 to 100 Hz
writeRegister(PWM1_DC_CTRL,0b11100110); // Set duty cycle of PWM channel to 90 %
writeRegister(HB_ACT_1_CTRL,0b0110); // Activate HS1/LS2
delay(20000); // Wait 20000 ms
writeRegister(PWM1_DC_CTRL,0b00110011); // Set duty cycle of PWM channel to 20 %
delay(1000); // Wait 2000 ms
writeRegister(HB_ACT_1_CTRL,0b0101); // Activate LS1/LS2
delay(300); // Wait 300 ms
writeRegister(HB_MODE_1_CTRL,0b0); // HB1 is not mapped to PWM channel 1
}
void activateMotor2_PWM()
{
writeRegister(HB_MODE_1_CTRL,0b1); // Map HB1 to PWM channel 1
writeRegister(PWM_CH_FREQ_CTRL,0b10); // Set Frequency of PWM channel 1 to 100 Hz
writeRegister(PWM1_DC_CTRL,0b11100110); // Set duty cycle of PWM channel to 90 %
writeRegister(HB_ACT_1_CTRL,0b0110); // Activate HS1/LS2
delay(20000); // Wait 20000 ms
writeRegister(PWM1_DC_CTRL,0b00110011); // Set duty cycle of PWM channel to 20 %
delay(1000); // Wait 2000 ms
writeRegister(HB_ACT_1_CTRL,0b0101); // Activate LS1/LS2
delay(300); // Wait 300 ms
writeRegister(HB_MODE_1_CTRL,0b0); // HB1 is not mapped to PWM channel 1
}
void activateMotor3_PWM()
{
writeRegister(HB_MODE_3_CTRL,0b1); // Map HB1 to PWM channel 3
writeRegister(PWM_CH_FREQ_CTRL,0b10); // Set Frequency of PWM channel 1 to 100 Hz
writeRegister(PWM1_DC_CTRL,0b11100110); // Set duty cycle of PWM channel to 90 %
writeRegister(HB_ACT_3_CTRL,0b0110); // Activate HS1/LS2
delay(20000); // Wait 20000 ms
writeRegister(PWM1_DC_CTRL,0b00110011); // Set duty cycle of PWM channel to 20 %
delay(1000); // Wait 2000 ms
writeRegister(HB_ACT_3_CTRL,0b0101); // Activate LS1/LS2
delay(300); // Wait 300 ms
writeRegister(HB_MODE_3_CTRL,0b0); // HB1 is not mapped to PWM channel 3
}
void activateMotor4_PWM()
{
writeRegister(HB_MODE_3_CTRL,0b1); // Map HB1 to PWM channel 3
writeRegister(PWM_CH_FREQ_CTRL,0b10); // Set Frequency of PWM channel 1 to 100 Hz
writeRegister(PWM1_DC_CTRL,0b11100110); // Set duty cycle of PWM channel to 90 %
writeRegister(HB_ACT_3_CTRL,0b0110); // Activate HS1/LS2
delay(20000); // Wait 20000 ms
writeRegister(PWM1_DC_CTRL,0b00110011); // Set duty cycle of PWM channel to 20 %
delay(1000); // Wait 2000 ms
writeRegister(HB_ACT_3_CTRL,0b0101); // Activate LS1/LS2
delay(300); // Wait 300 ms
writeRegister(HB_MODE_3_CTRL,0b0); // HB1 is not mapped to PWM channel 3
}
int writeRegister(byte address, byte data)
{
/* This function sends SPI commands to the address "address" with the data "data"
* The data sent by the TLE94112EL to the Arduino Uno (SDO) and the data sent by the Arduino Uno to the TLE94112EL (SDI) are reported in the
* Serial Monitor (CTRL + SHIFT + M)
*/
address = address | WRITE ;
digitalWrite(CSN, LOW); // take the CSN pin low to select the chip:
byte byte0 = SPI.transfer(address); // send address byte to the TLE94112 and store the received byte to byte 0
byte byte1 = SPI.transfer(data); // send data byte to the TLE94112 and store the received byte to byte 1
digitalWrite(CSN, HIGH); // take the CSN pin high to terminate the SPI frame
Serial.println(); // insert a carriage return to the serial monitor
Serial.print("SDI:\t");
printByte(address); // write address to the serial monitor
printByte(data); // write data to the serial monitor
Serial.print("SDO:\t");
printByte(byte0); // write byte0 (Global Satus Register of the TLE94112EL) to the serial monitor
printByte(byte1); // write byte1 (Data Byte sent by the TLE9412EL) to the serial monitor
int result = ( ((int)byte0 << 8) | (int)byte1 ); // concatenates byte0 and byte1 in result
return (result);
}
int readRegister(byte address) // This function reads a register and returns the data sent by the TLE94112EL. Data sent and received by the TLE94112EL are displayed on the serial monitor
{
digitalWrite(CSN, LOW); // take the CSN pin low to select the chip:
byte byte0 = SPI.transfer(address); // send Low Byte
byte byte1 = SPI.transfer(0); // send High Byte
digitalWrite(CSN, HIGH); // take the CSN pin high to de-select the chip:
Serial.println();
Serial.print("SDI:\t");
printByte(address); // write address to the serial monitor
printByte(0); // write data to the serial monitor
Serial.print("SDO:\t");
printByte(byte0); // write byte0 (Global Satus Register of the TLE94112EL) to the serial monitor
printByte(byte1); // write byte1 (Data Byte sent by the TLE9412EL) to the serial monitor
int result = ( ((int)byte0 << 8) | (int)byte1 ); // concatenates byte0 and byte1 in result
return (result);
}
int clearRegister(int address) // This function clears a register and returns the data sent by the TLE94112EL. Data sent and received by the TLE94112EL are displayed on the serial monitor
{
address = address | CLEAR ;
digitalWrite(CSN, LOW); // take the CSN pin low to select the chip:
byte byte0 = SPI.transfer(address);
byte byte1 = SPI.transfer(0);
digitalWrite(CSN, HIGH); // take the CSN pin high to de-select the chip:
Serial.println();
Serial.print("SDI:\t");
printByte(address); // write address to the serial monitor
printByte(0); // write data to the serial monitor
Serial.print("SDO:\t");
printByte(byte0); // write byte0 (Global Satus Register of the TLE94112EL) to the serial monitor
printByte(byte1); // write byte1 (Data Byte sent by the TLE9412EL) to the serial monitor
int result = ( ((int)byte0 << 0) | (int)byte1 ); // concatenates byte0 and byte1 in result
return (result);
}
void printByte(byte printByte) // This function writes to the serial monitor the value of the byte printByte in binary form
{
for (int i = 7; i >= 0; i--)
{
Serial.print(bitRead(printByte, i));
}
Serial.print("\t");
}