sggt/App/DAC8552/dac8552.c

90 lines
2.1 KiB
C

#include "FreeRTOS.h"
#include "task.h"
#include "dac8552.h"
#include "gpio.h"
#include "spi.h"
dac8552x_object dac8552;
void dac8552_cs(cs_state_type state)
{
if (state == CS_L)
{
DAC8552_SYNC(GPIO_PIN_RESET);
}
else
{
DAC8552_SYNC(GPIO_PIN_SET);
}
}
void dac8552_transmit_data(uint8_t *data, uint16_t len)
{
HAL_SPI_Transmit(&hspi3, data, len, 1000);
}
void dac8552_init(dac8552x_object *dac, dac8552_write write, dac8552_chip_select cs)
{
if ((dac == NULL) || (write == NULL) || (cs == NULL))
{
return;
}
dac->write_data = write;
dac->chip_selcet = cs;
}
void set_dac8552_channel_value(dac8552x_object *dac, dac8552_ld_type ld, dac8552_bs_type bs, dac8552_pd_type pd, uint16_t data)
{
uint32_t input = 0;
uint8_t sdata[3];
input = data;
input = input | (ld << 20);
input = input | (bs << 18);
input = input | (pd << 16);
sdata[0] = (uint8_t)(input >> 16);
sdata[1] = (uint8_t)(input >> 8);
sdata[2] = (uint8_t)input;
dac->chip_selcet(CS_L);
vTaskDelay(10);
dac->write_data(sdata, 3);
dac->chip_selcet(CS_H);
}
void dac8552_operation(float32 *data1, float32 *data2)
{
uint16_t data = 0;
float32 temp = 0.0f;
dac8552_init(&dac8552, dac8552_transmit_data, dac8552_cs);
if (data1 != NULL)
{
// 4~20mA输出
if (*data1 > 25.0f)
*data1 = 25.0f;
else if (*data1 < 0.0f)
*data1 = 0.0f;
temp = (*data1) * 100.0f;
data = (uint16_t)(65535.0f * temp / 2500.0f);
set_dac8552_channel_value(&dac8552, LD_CH_B, SEL_BUF_B, PD_NONE, data);
// set_dac8552_channel_value(&dac8552, LD_CH_A, SEL_BUF_A, PD_NONE, data);
}
if (data2 != NULL)
{
//-2.5~2.5v输出
if (*data2 < -2.5f)
*data2 = -2.5f;
else if (*data2 > 2.5f)
*data2 = 2.5f;
temp = (*data2) * 0.5f + 1.25f;
data = (uint16_t)(65535.0f * temp / 2.5f);
// set_dac8552_channel_value(&dac8552, LD_CH_B, SEL_BUF_B, PD_NONE, data);
set_dac8552_channel_value(&dac8552, LD_CH_A, SEL_BUF_A, PD_NONE, data);
}
}