MS-DTU/MS-DTU-V1/User/gpio_dac7311.c

290 lines
6.8 KiB
C
Raw Normal View History

2025-04-03 14:18:58 +08:00
#include "includes.h"
// DAC7311<31><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>0~4095<39><35>Ӧ0~2.5v<EFBFBD><EFBFBD>ת<EFBFBD>ɳ<EFBFBD>0~25mA
// <20>ӳٴ<D3B3>Լ10us
void DAC7311_delay()
{
uint32_t loop = 250;
while(loop--)
__NOP();
}
// ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
#define DAC7311_CHANNEL_1_LATCH_LOW() \
{ \
LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_8); \
DAC7311_delay(); \
}
#define DAC7311_CHANNEL_1_LATCH_HIGH() \
{ \
LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_8); \
DAC7311_delay(); \
}
#define DAC7311_CHANNEL_2_LATCH_LOW() \
{ \
LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_7); \
DAC7311_delay(); \
}
#define DAC7311_CHANNEL_2_LATCH_HIGH() \
{ \
LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_7); \
DAC7311_delay(); \
}
#define DAC7311_CHANNEL_3_LATCH_LOW() \
{ \
LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_9); \
DAC7311_delay(); \
}
#define DAC7311_CHANNEL_3_LATCH_HIGH() \
{ \
LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_9); \
DAC7311_delay(); \
}
#define DAC7311_CLK_LOW() \
{ \
LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_6); \
DAC7311_delay(); \
}
#define DAC7311_CLK_HIGH() \
{ \
LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_6); \
DAC7311_delay(); \
}
#define DAC7311_DATA_1() \
{ \
LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_15); \
DAC7311_delay(); \
}
#define DAC7311_DATA_0() \
{ \
LL_GPIO_ResetOutputPin(GPIOD, LL_GPIO_PIN_15); \
DAC7311_delay(); \
}
// д 1 bit
void DAC7311_Bit(uint32_t b1)
{
DAC7311_CLK_HIGH();
if(b1)
{
DAC7311_DATA_1();
}
else
{
DAC7311_DATA_0();
}
DAC7311_CLK_LOW();
}
// д<><D0B4><EFBFBD><EFBFBD>bits
void DAC7311_Bits(uint32_t bytes, uint8_t num)
{
uint32_t mask = (1ul << (num - 1));
while(num--)
{
DAC7311_Bit(bytes & mask);
bytes <<= 1;
}
}
void DAC7311_Write(uint8_t channel, uint32_t data)
{
if(channel == 0)
{
DAC7311_CHANNEL_1_LATCH_LOW();
}
else if(channel == 1)
{
DAC7311_CHANNEL_2_LATCH_LOW();
}
else
{
DAC7311_CHANNEL_3_LATCH_LOW();
}
DAC7311_Bits(data, 16);
if(channel == 0)
{
DAC7311_CHANNEL_1_LATCH_HIGH();
}
else if(channel == 1)
{
DAC7311_CHANNEL_2_LATCH_HIGH();
}
else
{
DAC7311_CHANNEL_3_LATCH_HIGH();
}
DAC7311_CLK_HIGH();
}
// <20><>ʼ<EFBFBD><CABC>
void DAC7311_Init()
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
/**/
LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_9);
/**/
LL_GPIO_ResetOutputPin(GPIOD, LL_GPIO_PIN_15);
/**/
LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_6);
/**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void DAC7311_Open()
{
// ˢ<>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DAC7311_Refresh();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>Һλ<D2BA>ٷֱ<D9B7>ת<EFBFBD><D7AA>Ϊ4~20mA<6D><41><EFBFBD><EFBFBD>
void DAC7311_Out(uint8_t channel, float percent)
{
uint32_t dac = (percent * 0.16 + 4) / 25 * 4095 + 0.5;
DAC7311_Write(channel, dac << 2);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3.5mA
void DAC7311_OutAlarm(uint8_t channel)
{
uint32_t dac = 3.5 / 25 * 4095 + 0.5;
DAC7311_Write(channel, dac << 2);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0mA
void DAC7311_OutZero(uint8_t channel)
{
uint32_t dac = 0;
DAC7311_Write(channel, dac << 2);
}
// ˢ<>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DAC7311_Refresh()
{
uint8_t on = IS_VCC_MA_ON();
// <20><>RFģ<46><C4A3>ʱ<EFBFBD><CAB1>4~20mA<6D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>õ<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ƿڣ<C6BF><DAA3><EFBFBD>ģ<EFBFBD><C4A3>λ<EFBFBD>ó<EFBFBD>ͻ<EFBFBD><CDBB>
if(RF_initStatus)
return;
VCC_MA_ON();
#if 0
DAC7311_OutAlarm(0); // 3.5mA
DAC7311_Out(1, 0); // 4mA
DAC7311_Out(2, 100); // 20mA
#else
if(dcBuff.sampleData.staDPress.notConnect)
DAC7311_OutZero(0);
else if(dcBuff.sampleData.staDPress.underFlow || dcBuff.sampleData.staDPress.overFlow)
DAC7311_OutAlarm(0);
else if(dcBuff.configDisplay.op_HARDWARE_VER_MAJOR == 229 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|| dcBuff.configDisplay.op_USE_CAPACITY_SENSOR // <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
|| dcBuff.configDisplay.op_420MA_OUT_PCT // 4~20mA<6D><41><EFBFBD><EFBFBD>Һλ<D2BA>ٷֱ<D9B7>
|| dcBuff.configSensor.levelOutMMWC > 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һλ<D2BA><CEBB>mmWC<57><43><EFBFBD><EFBFBD>Һλ<D2BA>ٷֱ<D9B7>
{
DAC7311_Out(0, dcBuff.sampleData.volumePct * 0.01); // volumePct<63>Ŵ<EFBFBD><C5B4><EFBFBD>100<30><30><EFBFBD><EFBFBD>
}
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ͻ<EFBFBD>
{
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DAC7311_Out(0, (dcBuff.sampleData.diff - dcBuff.configSensor.sensorDPress.lowRange) * 100.0
/ (dcBuff.configSensor.sensorDPress.highRangeX10 *
(dcBuff.configSensor.sensorDPress.ishighRangeX10 ? 0.1 : 1) - dcBuff.configSensor.sensorDPress.lowRange));
}
if(!dcBuff.configDisplay.op_2ND_420MA_OUT_LEVEL)
{
if(dcBuff.sampleData.staPress.notConnect)
DAC7311_OutZero(1);
else if(dcBuff.sampleData.staPress.underFlow || dcBuff.sampleData.staPress.overFlow)
DAC7311_OutAlarm(1);
else if(dcBuff.sampleData.staPress.full)
DAC7311_Out(1, 100);
else
{
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DAC7311_Out(1, (dcBuff.sampleData.pressure - dcBuff.configSensor.sensorPress.lowRange) * 100.0
/ (dcBuff.configSensor.sensorPress.highRange - dcBuff.configSensor.sensorPress.lowRange));
}
}
else
{
if(dcBuff.sampleData.staDPress.notConnect)
DAC7311_OutZero(1);
else if(dcBuff.sampleData.staDPress.underFlow || dcBuff.sampleData.staDPress.overFlow)
DAC7311_OutAlarm(1);
else if(dcBuff.configDisplay.op_HARDWARE_VER_MAJOR == 229 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|| dcBuff.configDisplay.op_USE_CAPACITY_SENSOR // <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
|| dcBuff.configDisplay.op_420MA_OUT_PCT // 4~20mA<6D><41><EFBFBD><EFBFBD>Һλ<D2BA>ٷֱ<D9B7>
|| dcBuff.configSensor.levelOutMMWC > 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һλ<D2BA><CEBB>mmWC<57><43><EFBFBD><EFBFBD>Һλ<D2BA>ٷֱ<D9B7>
{
DAC7311_Out(1, dcBuff.sampleData.volumePct * 0.01); // volumePct<63>Ŵ<EFBFBD><C5B4><EFBFBD>100<30><30><EFBFBD><EFBFBD>
}
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ͻ<EFBFBD>
{
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DAC7311_Out(1, (dcBuff.sampleData.diff - dcBuff.configSensor.sensorDPress.lowRange) * 100.0
/ (dcBuff.configSensor.sensorDPress.highRangeX10 *
(dcBuff.configSensor.sensorDPress.ishighRangeX10 ? 0.1 : 1) - dcBuff.configSensor.sensorDPress.lowRange));
}
}
if(dcBuff.sampleData.staExtTempr[0].notConnect)
DAC7311_OutZero(2);
else if(dcBuff.sampleData.staExtTempr[0].underFlow || dcBuff.sampleData.staExtTempr[0].overFlow)
DAC7311_OutAlarm(2);
else if(dcBuff.sampleData.staExtTempr[0].full)
DAC7311_Out(2, 100);
else if(dcBuff.configDisplay.op_USE_PT100_SENSOR)
{
// PT100<30>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: -200~80
DAC7311_Out(2, (dcBuff.sampleData.extTempr[0] - (-200)) * 100.0
/ (80 - (-200)));
}
else
{
// 4~20mA<6D>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DAC7311_Out(2, (dcBuff.sampleData.extTempr[0] - dcBuff.configSensor.sensorMTempr[0].lowRange) * 100.0
/ (dcBuff.configSensor.sensorMTempr[0].highRange - dcBuff.configSensor.sensorMTempr[0].lowRange));
}
#endif
if(!on)
VCC_MA_OFF();
}