90 lines
2.1 KiB
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);
|
|
}
|
|
}
|