Take control of the perfect airflow with our PWM-mode fan speed controller!
A
A
Hardware Overview
How does it work?
Fan 5 Click is based on the TC654, a fan speed controller from Microchip that allows you to control and monitor the speed of two DC brushless fans. The TC654 is based on the FanSense™ technology, which protects your application against fan failure and eliminates the need for 3-wire fans. With the TC654, the fan speed can be controlled by its input voltage or the serial interface, allowing for high flexibility. The input voltage of the TC654 represents temperature, typically provided by a chosen internal or external thermistor (selected using an NTC SEL jumper). The TC654 controls fan speed according to the system temperature by pulse-width modulating the voltage across the fan. This method reduces the fan'sfan's acoustic noise and extends the fan'sfan's working life. An external N-channel MOSFET, one per channel, controls the
fans. Modulating the voltage applied to the gate of the MOSFETs also modulates the voltage applied to the fan. The PWM output can be adjusted between 30% and 100%, based on the TC654's input voltage, or programmed, as mentioned, via the I2C interface to allow fan speed control without needing an external thermistor. The standard I2C 2-Wire interface reads data and configures settings with a maximum frequency of 100kHz. The TC654 also measures and monitors fan revolutions per minute (RPM), representing a measure of its health. As a fan'sfan's bearings wear out, the fan slows down and eventually stops (locked rotor). The TC654 can detect open, shorted, unconnected, and locked rotor fan conditions by monitoring the fan'sfan's RPM level. Apart from the availability of this information on the FLT pin of the mikroBUS™ socket, this condition can also be
visually detected through the red LED marked with FAULT. The fan RPM data and threshold registers are available over the I2C interface, allowing complete system control. In addition to the two terminals for fan connections, there is another terminal, VFAN, for an external 12V power supply for FAN1. FAN2 uses the necessary supply from the 5V mikroBUS™ power rail. This Click board™ can operate with both 3.3V and 5V logic voltage levels selected via the VCC SEL jumper. This way, both 3.3V and 5V MCUs can use the communication lines correctly. However, the Click board™ comes equipped with a library containing easy-to-use functions and an example code that can be used, as a reference, for further development.
Features overview
Development board
PIC18F57Q43 Curiosity Nano evaluation kit is a cutting-edge hardware platform designed to evaluate microcontrollers within the PIC18-Q43 family. Central to its design is the inclusion of the powerful PIC18F57Q43 microcontroller (MCU), offering advanced functionalities and robust performance. Key features of this evaluation kit include a yellow user LED and a responsive
mechanical user switch, providing seamless interaction and testing. The provision for a 32.768kHz crystal footprint ensures precision timing capabilities. With an onboard debugger boasting a green power and status LED, programming and debugging become intuitive and efficient. Further enhancing its utility is the Virtual serial port (CDC) and a debug GPIO channel (DGI
GPIO), offering extensive connectivity options. Powered via USB, this kit boasts an adjustable target voltage feature facilitated by the MIC5353 LDO regulator, ensuring stable operation with an output voltage ranging from 1.8V to 5.1V, with a maximum output current of 500mA, subject to ambient temperature and voltage constraints.
Microcontroller Overview
MCU Card / MCU

Architecture
PIC
MCU Memory (KB)
128
Silicon Vendor
Microchip
Pin count
48
RAM (Bytes)
8196
You complete me!
Accessories
Curiosity Nano Base for Click boards is a versatile hardware extension platform created to streamline the integration between Curiosity Nano kits and extension boards, tailored explicitly for the mikroBUS™-standardized Click boards and Xplained Pro extension boards. This innovative base board (shield) offers seamless connectivity and expansion possibilities, simplifying experimentation and development. Key features include USB power compatibility from the Curiosity Nano kit, alongside an alternative external power input option for enhanced flexibility. The onboard Li-Ion/LiPo charger and management circuit ensure smooth operation for battery-powered applications, simplifying usage and management. Moreover, the base incorporates a fixed 3.3V PSU dedicated to target and mikroBUS™ power rails, alongside a fixed 5.0V boost converter catering to 5V power rails of mikroBUS™ sockets, providing stable power delivery for various connected devices.
Used MCU Pins
mikroBUS™ mapper
Take a closer look
Click board™ Schematic

Step by step
Project assembly
Track your results in real time
Application Output
1. Application Output - In Debug mode, the 'Application Output' window enables real-time data monitoring, offering direct insight into execution results. Ensure proper data display by configuring the environment correctly using the provided tutorial.

2. UART Terminal - Use the UART Terminal to monitor data transmission via a USB to UART converter, allowing direct communication between the Click board™ and your development system. Configure the baud rate and other serial settings according to your project's requirements to ensure proper functionality. For step-by-step setup instructions, refer to the provided tutorial.

3. Plot Output - The Plot feature offers a powerful way to visualize real-time sensor data, enabling trend analysis, debugging, and comparison of multiple data points. To set it up correctly, follow the provided tutorial, which includes a step-by-step example of using the Plot feature to display Click board™ readings. To use the Plot feature in your code, use the function: plot(*insert_graph_name*, variable_name);. This is a general format, and it is up to the user to replace 'insert_graph_name' with the actual graph name and 'variable_name' with the parameter to be displayed.

Software Support
Library Description
This library contains API for Fan 5 Click driver.
Key functions:
fan5_get_rpm1
- Fan 5 get speed of FAN1fan5_set_duty_cycle
- Fan 5 set duty cyclefan5_turn_on_fans
- Fan 5 turn on fans
Open Source
Code example
The complete application code and a ready-to-use project are available through the NECTO Studio Package Manager for direct installation in the NECTO Studio. The application code can also be found on the MIKROE GitHub account.
/*!
* @file main.c
* @brief Fan 5 Click example
*
* # Description
* This example demonstrates the use of FAN 5 click board by controlling and
* regulating the fan motors speed.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initializes the driver, performs the click default configuration, reads
* manufacturer id and sets configuration in correspondence to user-selected mode.
*
* ## Application Task
* If Fan control is selected example will monitor FAN 1 speed and if the speed
* falls below 500 RPM for longer then 2.4 seconds fan output will be disabled.
* In other case, example is showcasing speed control by changing duty cycle and
* monitoring fan speed.
*
* @author Stefan Ilic
*
*/
#include "board.h"
#include "log.h"
#include "fan5.h"
#define FAN_CONTROL_MODE
static fan5_t fan5;
static log_t logger;
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
fan5_cfg_t fan5_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
fan5_cfg_setup( &fan5_cfg );
FAN5_MAP_MIKROBUS( fan5_cfg, MIKROBUS_1 );
if ( I2C_MASTER_ERROR == fan5_init( &fan5, &fan5_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
if ( FAN5_ERROR == fan5_default_cfg ( &fan5 ) )
{
log_error( &logger, " Default configuration." );
for ( ; ; );
}
fan5_turn_on_fans( &fan5 );
uint8_t id = 0;
fan5_get_mfr_id( &fan5, &id );
log_printf( &logger, " Manufacturer ID: 0x%X \r\n", ( uint16_t ) id );
#if defined FAN_CONTROL_MODE
fan5_set_duty_cycle( &fan5, FAN5_100_PER_DUTY );
fan5_set_fan_fault1( &fan5, 500 );
#else
fan5_set_duty_cycle( &fan5, FAN5_30_PER_DUTY );
fan5_set_fan_fault1( &fan5, 0 );
#endif
log_info( &logger, " Application Task " );
}
void application_task ( void )
{
#if defined FAN_CONTROL_MODE
uint16_t speed = 0;
uint8_t flag_data = 0;
fan5_get_rpm1( &fan5, &speed);
log_printf( &logger, " SPEED: %d RPM \r\n", speed );
if ( FAN5_FAULT == fan5_get_fault_state( &fan5 ) )
{
fan5_get_status_flags ( &fan5, &flag_data );
log_printf( &logger, " FLAG: %d \r\n", flag_data );
if ( FAN5_F1F_FLAG & flag_data )
{
log_printf( &logger, " FAN SPEED DROPED !!! \r\n" );
log_printf( &logger, " OUTPUT IS DISABLED \r\n" );
fan5_turn_off_fans( &fan5 );
for( ; ; );
}
}
Delay_ms( 2000 );
#else
uint16_t speed;
uint8_t duty_value;
for ( duty_value = FAN5_30_PER_DUTY; duty_value <= FAN5_100_PER_DUTY; duty_value++ )
{
fan5_set_duty_cycle( &fan5, duty_value );
log_printf( &logger, " Duty value: %d \r\n", ( uint16_t ) duty_value );
Delay_ms( 5000 );
fan5_get_rpm1( &fan5, &speed);
log_printf( &logger, " SPEED: %d RPM \r\n", speed );
Delay_ms( 500 );
}
#endif
}
void main ( void )
{
application_init( );
for ( ; ; )
{
application_task( );
}
}
// ------------------------------------------------------------------------ END