282 lines
6.4 KiB
C
282 lines
6.4 KiB
C
|
|
#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();
|
|||
|
|
|
|||
|
|
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.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.highRange - 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.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.highRange - 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();
|
|||
|
|
}
|
|||
|
|
|