90 lines
1.7 KiB
C
90 lines
1.7 KiB
C
#include "main.h"
|
|
#include "ltc2631.h"
|
|
|
|
void ltc2631_transmit(ltc2631_handle_t *hdac, uint8_t *data)
|
|
{
|
|
HAL_I2C_Master_Transmit(hdac->hi2c, hdac->addr, data, 3, 1);
|
|
}
|
|
|
|
void ltc2631_init(ltc2631_handle_t *hdac, I2C_HandleTypeDef *hi2c, uint8_t addr, ltc2631_res_t res, float ref)
|
|
{
|
|
hdac->hi2c = hi2c;
|
|
hdac->addr = addr;
|
|
hdac->resolution = res;
|
|
hdac->ref_voltage_f = ref;
|
|
hdac->ref_voltage_u = ref * 1000U;
|
|
}
|
|
|
|
void ltc2631_setOutputVoltage_f(ltc2631_handle_t *hdac, float volt)
|
|
{
|
|
uint16_t value = 0;
|
|
uint8_t data[3] = {0};
|
|
|
|
if (volt > hdac->ref_voltage_f)
|
|
{
|
|
volt = hdac->ref_voltage_f;
|
|
}
|
|
|
|
if (volt < 0)
|
|
{
|
|
volt = 0;
|
|
}
|
|
|
|
value = (volt / hdac->ref_voltage_f + 0.005f) * (hdac->resolution - 1);
|
|
|
|
value = value << (16 - hdac->resolution);
|
|
data[0] = LTC_WRTIEUPDATE;
|
|
data[1] = (value >> 8);
|
|
data[2] = value;
|
|
|
|
ltc2631_transmit(hdac, data);
|
|
}
|
|
void ltc2631_setOutputVoltage_u(ltc2631_handle_t *hdac, uint32_t volt_x1000)
|
|
{
|
|
uint16_t value = 0;
|
|
uint8_t data[3] = {0};
|
|
|
|
if (volt_x1000 > hdac->ref_voltage_u)
|
|
{
|
|
volt_x1000 = hdac->ref_voltage_u;
|
|
}
|
|
|
|
if (volt_x1000 < 0)
|
|
{
|
|
volt_x1000 = 0;
|
|
}
|
|
|
|
value = (volt_x1000 * (hdac->resolution - 1)) / hdac->ref_voltage_u;
|
|
|
|
value = value << (16 - hdac->resolution);
|
|
data[0] = LTC_WRTIEUPDATE;
|
|
data[1] = (value >> 8);
|
|
data[2] = value;
|
|
|
|
ltc2631_transmit(hdac, data);
|
|
}
|
|
|
|
void ltc2631_setOutputValue(ltc2631_handle_t *hdac, uint16_t value)
|
|
{
|
|
uint8_t data[3] = {0};
|
|
|
|
if (value >= (1 << hdac->resolution))
|
|
{
|
|
value = (1 << hdac->resolution) - 1;
|
|
}
|
|
|
|
value = value << (16 - hdac->resolution);
|
|
data[0] = LTC_WRTIEUPDATE;
|
|
data[1] = (value >> 8);
|
|
data[2] = value;
|
|
|
|
ltc2631_transmit(hdac, data);
|
|
}
|
|
|
|
void ltc2631_sleep(ltc2631_handle_t *hdac)
|
|
{
|
|
uint8_t data[3] = {0};
|
|
data[0] = LTC_SLEEP;
|
|
|
|
ltc2631_transmit(hdac, data);
|
|
} |