Brushless fan controller

  • Author(s): Bryan Siepert

Implementation Notes


Software and Dependencies:

class adafruit_emc2101.ConversionRate

Options for accelerometer_data_rate and gyro_data_rate

class adafruit_emc2101.EMC2101(i2c_bus)

Basic driver for the EMC2101 Fan Controller.

Parameters:i2c_bus (I2C) – The I2C bus the EMC is connected to.

Quickstart: Importing and using the device

Here is an example of using the EMC2101 class. First you will need to import the libraries to use the sensor

import board
from adafruit_emc2101.emc2101_lut import EMC2101_LUT as EMC2101

Once this is done you can define your board.I2C object and define your sensor object

i2c = board.I2C()  # uses board.SCL and board.SDA
emc = EMC2101(i2c)

Now you have access to the manual_fan_speed attribute to setup the desired fanspeed

emc.manual_fan_speed = 25

If you need control over PWM frequency and the controller’s built in temperature/speed look-up table (LUT), you will need emc2101_lut.EMC2101_LUT which extends this class to add those features, at the cost of increased memory usage.


The rate at which temperature measurements are taken. Must be a ConversionRate


When set, the fan control signal is output as a DC voltage instead of a PWM signal


The temperature measured using the external diode


The current speed in Revolutions per Minute (RPM)


The value that the external temperature will be forced to read when forced_temp_enabled is set. This can be used to test the behavior of the LUT without real temperature changes


When True, the external temperature measurement will always be read as the value in forced_ext_temp


Reset the controller to an initial default configuration


The temperature as measured by the EMC2101’s internal 8-bit temperature sensor


When set to True, the magnitude of the fan output signal is inverted, making 0 the maximum value and 100 the minimum value


Enable or disable the internal look up table used to map a given temperature to a fan speed.

When the LUT is disabled (the default), fan speed can be changed with manual_fan_speed. To actually set this to True and modify the LUT, you need to use the extended version of this driver, emc2101_lut.EMC2101_LUT


The fan speed used while the LUT is being updated and is unavailable. The speed is given as the fan’s PWM duty cycle represented as a float percentage. The value roughly approximates the percentage of the fan’s maximum speed


The drive strength of the fan on spinup in % max RPM


The amount of time the fan will spin at the current set drive strength. Must be a SpinupTime


The maximum /minimum speed expected for the fan

class adafruit_emc2101.SpinupDrive

Options for spinup_drive

class adafruit_emc2101.SpinupTime

Options for spinup_time


Brushless fan controller: extended functionality

  • Author(s): Bryan Siepert, Ryan Pavlik

Implementation Notes


Software and Dependencies:

The class defined here may be used instead of adafruit_emc2101.EMC2101, if your device has enough RAM to support it. This class adds LUT control and PWM frequency control to the base feature set.

class adafruit_emc2101.emc2101_lut.EMC2101_LUT(i2c_bus)

Driver for the EMC2101 Fan Controller, with PWM frequency and LUT control.

See adafruit_emc2101.EMC2101 for the base/common functionality.

Parameters:i2c_bus (I2C) – The I2C bus the EMC is connected to.

Reset the controller to an initial default configuration


The dict-like representation of the LUT, actually of type FanSpeedLUT


Enable or disable the internal look up table used to map a given temperature to a fan speed. When the LUT is disabled fan speed can be changed with manual_fan_speed


The amount of hysteresis in Degrees Celsius of hysteresis applied to temperature readings used for the LUT. As the temperature drops, the controller will switch to a lower LUT entry when the measured value is below the lower entry’s threshold, minus the hysteresis value


Selects the base clock frequency used for the fan PWM output


The Divisor applied to the PWM frequency to set the final frequency

set_pwm_clock(use_preset=False, use_slow=False)
Select the PWM clock source, choosing between two preset clocks or by configuring the clock using pwm_frequency and pwm_frequency_divisor.
  • use_preset (bool) – True: Select between two preset clock sources False: The PWM clock is set by pwm_frequency and pwm_frequency_divisor
  • use_slow (bool) – True: Use the 1.4kHz clock False: Use the 360kHz clock.


class adafruit_emc2101.emc2101_lut.FanSpeedLUT(fan_obj)

A class used to provide a dict-like interface to the EMC2101’s Temperature to Fan speed Look Up Table.

Keys are integer temperatures, values are fan duty cycles between 0 and 100. A max of 8 values may be stored.

To remove a single stored point in the LUT, assign it as None.