This is an old revision of the document!
The LTC2672 is a family of five-channel, 12-/16-bit current source, digital-to-analog converters (DACs) that provide five high compliance, current source outputs with guaranteed 0.6 V dropout at 200 mA. There are eight current ranges that are programmable per channel with full-scale outputs of up to 300 mA. The channels can be paralleled to allow either ultrafine adjustments of large currents or combined outputs of up to 1.5 A. A dedicated supply pin is provided for each output channel. Each channel can be operated from 2.1 V to VCC, and internal switches allow any output to be pulled to the optional negative supply. The LTC2672 includes a precision integrated 1.25 V reference (10 ppm/°C maximum), with the option to use an external reference. The serial peripheral interface (SPI)-compatible, 3‑wire serial interface operates on logic levels as low as 1.71 V and at clock rates as high as 50 MHz.
The goal of ADI Microcontroller No-OS is to be able to provide reference projects for lower end processors, which can't run Linux, or aren't running a specific operating system, to help those customers using microcontrollers with ADI parts. ADI No-OS offers generic drivers which can be used as a base for any microcontroller platform and also example projects which are using these drivers on various microcontroller platforms.
For more information about ADI No-OS and supported microcontroller platforms see: no-OS
The source code for LTC2672 driver can be found here:
The driver also uses the ADI util library, so make sure you also add the necessary files in your project. The source code for the util library can be found here:
In order to be able to use this driver you will have to provide the specific implementation for the communication APIs and the specific types they use. If the SPI communication is chosen, there are three functions which are called by the ADXL355 driver and have to be implemented:
And there are two data types that have to be defined:
An example of a header file containing the prototypes of the functions which have to be implemented, along with some generic data types they are using can be found below:
Source code documentation for the driver is automatically generated using the Doxygen tool and it is available below:
In order to use the device, you will have to provide the support for the communication protocol (SPI) as mentioned above. The first API to be called is ltc2672_init. Make sure that it returns 0, indicating successful driver initialization.
Each channel's output span can be configured individually by using the ltc2672_set_span_channel API or same across all channels through the ltc2672_set_span_all_channels API.
The LTC2672 contains a multiplexer pin output which allows an external controller or Analog-to-Digital Converter (ADC) to monitor certain chip measurements. To enable this functionality, use the ltc2672_monitor_mux API and specify the property from the valid list of properties in the header implementation.
The output current from any one channel can be measured by configuring the multiplexer via the ltc2672_monitor_mux API command. Once configured, the voltage at the multiplexer output pin can be measured, and the current from the selected channel can be estimated by using the equation:
I_OUTx = I_FS(mA) * V_MUX / V_REF
Where V_REF is the measurement from the VREF pin (~1.25V) and I_FS(mA) is the output span setting in mA.
The current isn't directly measured but instead estimated from the DAC settings of the specified channel. This means that the measurement using the above equation is only valid when the output is properly terminated (not open / dropping out) and the output span is configured to a valid value (refer to header implementation).
Similar with the output current, the die temperature of the LTC2672 can also be measured through the ltc2672_monitor_mux function. The voltage at the multiplexer output pin varies directly with the temperature with a temperature coefficient of -3.7mV / °C. The die temperature can be estimated through the following relationship:
T = T0 + (V0 − V_MUX) / (3.7 mV/°C).
Where T0 = 25°C (initial temperature) and V0 = 1.4 V (initial voltage).
For calibration or more accurate measurements, the actual initial temperature and voltage can be measured and replaced on the equation above.
Once the channel output spans have been set, the current output for each can now be set. Current can be set individually per channel using the ltc2672_set_current_channel API or similarly across all channels, given that they have the same output span, using the ltc2672_set_current_all_channels.
Each output channel of the LTC2672 can output a maximum of 300mA. In instances where current greater than 300mA is needed, multiple channels can be tied together to produce the desired level. Channels tied together must operate in the same span category which can be done via ltc2672_set_span_all_channels.
Once the desired channels have been set to have similar output span, the target current can then be set by configuring the same channels via ltc2672_set_current_channel. For example, channels 0 and 1 can be combined to produce 350mA of current by configuring one channel to have 300mA output while the other at 50mA (assuming they're operating in the same span i.e., 300mA span).
Single or multiple channels can be powered down by using the ltc2672_power_down_channel or ltc2672_power_down_all_channels respectively to save power. Other than the channel power down, there's also an option to power down the entire chip, shutting down all other blocks such as the internal reference, using the ltc2672_chip_power_down API.
For instances that require the DAC outputs to toggle between two levels, the LTC2672 offers a toggle function which allows two current values to be stored in a channel's DAC register A and B. Once the two current levels and desired channel/s have been identified or toggle operation, they can then be setup using the ltc2672_setup_toggle and ltc2672_enable_channel API functions.
Once setup, perform the toggle by repeatedly using the ltc2672_global_toggle API as needed. The output levels can be verified by connecting an ammeter on the output of the desired channel and measuring the current levels during state changes.
The first 8 bits of a SPI transaction response serve as fault indicators. Whenever a fault is detected, the corresponding Fault Register bit is set and is outputted on the next SPI transaction. If a SPI transaction fixes any of the existing faults, the cleared fault register bit is reflected on the next SPI transaction response. The faults that are detected include open circuit detection for any of the output channels, overtemperature detection (> 175°C) with thermal protection, and invalid SPI transaction length (valid lengths are 24, 32 and multiple of 32 bits).
Using the ltc2672_config_command allows disabling of any of the active fault detection mechanisms of the part. The open circuit detection and thermal protection mechanism can be disabled via this command. The external reference operation is also configurable via this command. For the valid corresponding mask or values, refer to the device data sheet.
int ret; struct ltc2672_dev *ltc_dac; struct max_spi_init_param spi_extra = { .numSlaves = 1, .polarity = SPI_SS_POL_LOW, }; struct ltc2672_init_param init_params_dac = { .spi_init.device_id = 1, // tested using id = 2 (VDDIOH) .spi_init.max_speed_hz = 2000000, .spi_init.chip_select = 0, .spi_init.mode = NO_OS_SPI_MODE_0, // Mode 0 for LTC2672 .spi_init.bit_order = NO_OS_SPI_BIT_ORDER_MSB_FIRST, .spi_init.platform_ops = &max_spi_ops, .spi_init.extra = &spi_extra, .active_device = LTC2672_12, }; ret = ltc2672_init(<c_dac, &init_params_dac); if (ret) return ret; bool toggle_flag = false; float current_set = (float)3.125 / (float)1; uint32_t command; /* Set all channels for 6.25mA output span */ ret = ltc2672_set_span_all_channels(ltc_dac, LTC2672_100VREF); if (ret) return ret; /* Set current of all channels to 3.125mA */ ret = ltc2672_set_current_all_channels(ltc_dac, current_set); if (ret) return ret; /* Monitor the Voltage Reference Level via Multiplexer Output */ ret = ltc2672_monitor_mux(ltc_dac, LTC2672_MUX_VREF); if (ret) return ret; /* Power Down All channels and Voltage Reference */ ret = ltc2672_chip_power_down(ltc_dac); if (ret) return ret; /* Setup Channel 3 to toggle bet. 1.5mA and 1.9mA */ ret = ltc2672_setup_toggle_channel(ltc_dac, LTC2672_DAC3, 1.5, 1.9); if (ret) return ret; /* Enable CH3 for toggling */ ret = ltc2672_enable_toggle_channel(ltc_dac, 8); if (ret) return ret; /* Repeated Toggle of CH3 DAC output */ for(int i = 0; i < 4; i++){ toggle_flag ^= true; ret = ltc2672_global_toggle(ltc_dac, toggle_flag); if (ret) return ret; }