Files
RadioPhotonic_PCB_software/Src/laser_hw.c
2026-07-03 18:05:11 +03:00

262 lines
9.3 KiB
C

#include "laser_hw.h"
#include "app_state.h" /* hadc1, hadc3 — нужны для Get_ADC */
/* --- Set_LTEC, MPhD_T, Get_ADC, OUT_trigger из main.c --- */
void OUT_trigger(uint8_t out_n)
{
switch (out_n)
{
case 0:
HAL_GPIO_WritePin(OUT_0_GPIO_Port, OUT_0_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_0_GPIO_Port, OUT_0_Pin, GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(OUT_1_GPIO_Port, OUT_1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_1_GPIO_Port, OUT_1_Pin, GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_WritePin(OUT_2_GPIO_Port, OUT_2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_2_GPIO_Port, OUT_2_Pin, GPIO_PIN_RESET);
break;
case 3:
HAL_GPIO_WritePin(OUT_3_GPIO_Port, OUT_3_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_3_GPIO_Port, OUT_3_Pin, GPIO_PIN_RESET);
break;
case 4:
HAL_GPIO_WritePin(OUT_4_GPIO_Port, OUT_4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_4_GPIO_Port, OUT_4_Pin, GPIO_PIN_RESET);
break;
case 5:
HAL_GPIO_WritePin(OUT_5_GPIO_Port, OUT_5_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_5_GPIO_Port, OUT_5_Pin, GPIO_PIN_RESET);
break;
case 6:
HAL_GPIO_WritePin(OUT_6_GPIO_Port, OUT_6_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_6_GPIO_Port, OUT_6_Pin, GPIO_PIN_RESET);
break;
case 7:
HAL_GPIO_WritePin(OUT_7_GPIO_Port, OUT_7_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_7_GPIO_Port, OUT_7_Pin, GPIO_PIN_RESET);
break;
case 8:
HAL_GPIO_WritePin(OUT_8_GPIO_Port, OUT_8_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_8_GPIO_Port, OUT_8_Pin, GPIO_PIN_RESET);
break;
case 9:
HAL_GPIO_WritePin(OUT_9_GPIO_Port, OUT_9_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT_9_GPIO_Port, OUT_9_Pin, GPIO_PIN_RESET);
break;
}
}
void Set_LTEC(uint8_t num, uint16_t DATA)
{
uint32_t tmp32;
switch (num)
{
case 1:
HAL_GPIO_WritePin(DAC_LD1_CS_GPIO_Port, DAC_LD1_CS_Pin, GPIO_PIN_RESET);//Start operation with LDAC1
//tmp32=0;
//while(tmp32<500){tmp32++;}
tmp32 = 0;
while((!LL_SPI_IsActiveFlag_TXE(SPI2))&&(tmp32<=500)) {tmp32++;}//When trans. last data cycle will be end.
LL_SPI_TransmitData16(SPI2, DATA);//Transmit word to Laser1 DAC
tmp32 = 0;
while((!LL_SPI_IsActiveFlag_RXNE(SPI2))&&(tmp32<=500)) {tmp32++;}//When trans. last data cycle will be end.
(void) SPI2->DR;
break;
case 2:
//HAL_GPIO_TogglePin(OUT_11_GPIO_Port, OUT_11_Pin); //for debug purposes
HAL_GPIO_WritePin(DAC_LD2_CS_GPIO_Port, DAC_LD2_CS_Pin, GPIO_PIN_RESET);//Start operation with LDAC2
//tmp32=0;
//while(tmp32<500){tmp32++;}
tmp32 = 0;
while((!LL_SPI_IsActiveFlag_TXE(SPI6))&&(tmp32<=500)) {tmp32++;}//When trans. last data cycle will be end.
LL_SPI_TransmitData16(SPI6, DATA);//Transmit word to Laser1 DAC
tmp32 = 0;
while((!LL_SPI_IsActiveFlag_RXNE(SPI6))&&(tmp32<=500)) {tmp32++;}//When trans. last data cycle will be end.
(void) SPI6->DR;
break;
case 3:
HAL_GPIO_WritePin(DAC_TEC1_CS_GPIO_Port, DAC_TEC1_CS_Pin, GPIO_PIN_RESET);//Start operation with TECDAC1
//tmp32=0;
//while(tmp32<500){tmp32++;}
tmp32 = 0;
while((!LL_SPI_IsActiveFlag_TXE(SPI2))&&(tmp32<=500)) {tmp32++;}//When trans. last data cycle will be end.
LL_SPI_TransmitData16(SPI2, DATA);//Transmit word to Laser1 DAC
tmp32 = 0;
while((!LL_SPI_IsActiveFlag_RXNE(SPI2))&&(tmp32<=500)) {tmp32++;}//When trans. last data cycle will be end.
(void) SPI2->DR;
break;
case 4:
HAL_GPIO_WritePin(DAC_TEC2_CS_GPIO_Port, DAC_TEC2_CS_Pin, GPIO_PIN_RESET);//Start operation with TECDAC2
//tmp32=0;
//while(tmp32<500){tmp32++;}
tmp32 = 0;
while((!LL_SPI_IsActiveFlag_TXE(SPI6))&&(tmp32<=500)) {tmp32++;}//When trans. last data cycle will be end.
LL_SPI_TransmitData16(SPI6, DATA);//Transmit word to Laser1 DAC
tmp32 = 0;
while((!LL_SPI_IsActiveFlag_RXNE(SPI6))&&(tmp32<=500)) {tmp32++;}//When trans. last data cycle will be end.
(void) SPI6->DR;
break;
}
HAL_GPIO_WritePin(DAC_LD1_CS_GPIO_Port, DAC_LD1_CS_Pin, GPIO_PIN_SET);//End operation with LDAC1
HAL_GPIO_WritePin(DAC_LD2_CS_GPIO_Port, DAC_LD2_CS_Pin, GPIO_PIN_SET);//End operation with LDAC2
HAL_GPIO_WritePin(DAC_TEC1_CS_GPIO_Port, DAC_TEC1_CS_Pin, GPIO_PIN_SET);//End operation with TEC1
HAL_GPIO_WritePin(DAC_TEC2_CS_GPIO_Port, DAC_TEC2_CS_Pin, GPIO_PIN_SET);//End operation with TEC2
}
uint16_t MPhD_T(uint8_t num)
{
uint16_t P;
uint32_t tmp32;
HAL_GPIO_WritePin(SPI4_CNV_GPIO_Port, SPI4_CNV_Pin, GPIO_PIN_RESET);//Prepare conversion
HAL_GPIO_WritePin(SPI5_CNV_GPIO_Port, SPI5_CNV_Pin, GPIO_PIN_RESET);//Prepare conversion
tmp32=0;
while(tmp32<500){tmp32++;}
HAL_GPIO_WritePin(SPI4_CNV_GPIO_Port, SPI4_CNV_Pin, GPIO_PIN_SET);//Stop acqusition & start conversion
HAL_GPIO_WritePin(SPI5_CNV_GPIO_Port, SPI5_CNV_Pin, GPIO_PIN_SET);//Stop acqusition & start conversion
tmp32=0;
while(tmp32<500){tmp32++;}
if (num==1)//MPD1
{
HAL_GPIO_WritePin(ADC_ThrLD1_CS_GPIO_Port, ADC_ThrLD1_CS_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(ADC_MPD1_CS_GPIO_Port, ADC_MPD1_CS_Pin, GPIO_PIN_RESET);
tmp32=0;
while(tmp32<500){tmp32++;}
//LL_SPI_TransmitData16(SPI4, 0xFFFF);//We must to clock the CLK output for collect RX data. We can do that only by transmitting data...
LL_SPI_Enable(SPI4);//Enable SPI for MPhD1 ADC
tmp32 = 0;
while(((!LL_SPI_IsActiveFlag_RXNE(SPI4))&&(tmp32<=1000))) {tmp32++;}//When rec. last data cycle will be end.
LL_SPI_Disable(SPI4);//Enable SPI for MPhD1 ADC
while(tmp32<500){tmp32++;}
//HAL_SPI_Receive(&hspi4, &P[0], 1, 100);
HAL_GPIO_WritePin(ADC_MPD1_CS_GPIO_Port, ADC_MPD1_CS_Pin, GPIO_PIN_SET);
P = LL_SPI_ReceiveData16(SPI4);
}
else if (num==2)//MPD2
{
HAL_GPIO_WritePin(ADC_ThrLD2_CS_GPIO_Port, ADC_ThrLD2_CS_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(ADC_MPD2_CS_GPIO_Port, ADC_MPD2_CS_Pin, GPIO_PIN_RESET);
tmp32=0;
while(tmp32<500){tmp32++;}
//LL_SPI_TransmitData16(SPI5, 0xFFFF);//We must to clock the CLK output for collect RX data. We can do that only by transmitting data...
LL_SPI_Enable(SPI5);//Enable SPI for MPhD2 ADC
tmp32 = 0;
while(((!LL_SPI_IsActiveFlag_RXNE(SPI5))&&(tmp32<=1000))) {tmp32++;}//When rec. last data cycle will be end.
LL_SPI_Disable(SPI5);//Enable SPI for MPhD2 ADC
while(tmp32<500){tmp32++;}
//HAL_SPI_Receive(&hspi4, &P[0], 1, 100);
HAL_GPIO_WritePin(ADC_MPD2_CS_GPIO_Port, ADC_MPD2_CS_Pin, GPIO_PIN_SET);
P = LL_SPI_ReceiveData16(SPI5);
}
else if (num==3)//ThrLD1
{
HAL_GPIO_WritePin(ADC_MPD1_CS_GPIO_Port, ADC_MPD1_CS_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(ADC_ThrLD1_CS_GPIO_Port, ADC_ThrLD1_CS_Pin, GPIO_PIN_RESET);
tmp32=0;
while(tmp32<500){tmp32++;}
//LL_SPI_TransmitData16(SPI4, 0xFFFF);//We must to clock the CLK output for collect RX data. We can do that only by transmitting data...
LL_SPI_Enable(SPI4);//Enable SPI for ThrLD1 ADC
tmp32 = 0;
while(((!LL_SPI_IsActiveFlag_RXNE(SPI4))&&(tmp32<=1000))) {tmp32++;}//When rec. last data cycle will be end.
LL_SPI_Disable(SPI4);//Enable SPI for ThrLD1 ADC
while(tmp32<500){tmp32++;}
//HAL_SPI_Receive(&hspi4, &P[0], 1, 100);
HAL_GPIO_WritePin(ADC_ThrLD1_CS_GPIO_Port, ADC_ThrLD1_CS_Pin, GPIO_PIN_SET);
P = LL_SPI_ReceiveData16(SPI4);
}
else if (num==4)//ThrLD2
{
HAL_GPIO_WritePin(ADC_MPD2_CS_GPIO_Port, ADC_MPD2_CS_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(ADC_ThrLD2_CS_GPIO_Port, ADC_ThrLD2_CS_Pin, GPIO_PIN_RESET);
tmp32=0;
while(tmp32<500){tmp32++;}
//LL_SPI_TransmitData16(SPI5, 0xFFFF);//We must to clock the CLK output for collect RX data. We can do that only by transmitting data...
LL_SPI_Enable(SPI5);//Enable SPI for ThrLD2 ADC
tmp32 = 0;
while(((!LL_SPI_IsActiveFlag_RXNE(SPI5))&&(tmp32<=1000))) {tmp32++;}//When rec. last data cycle will be end.
LL_SPI_Disable(SPI5);//Enable SPI for ThrLD2 ADC
while(tmp32<500){tmp32++;}
//HAL_SPI_Receive(&hspi4, &P[0], 1, 100);
HAL_GPIO_WritePin(ADC_ThrLD2_CS_GPIO_Port, ADC_ThrLD2_CS_Pin, GPIO_PIN_SET);
P = LL_SPI_ReceiveData16(SPI5);
}
/*float I_LD, Ith, I0m, T0m, Inorm, Tnorm1, Tnorm2, P, T_C, A, Pnorm;
Inorm = (float) (65535) / (float) (100);
Tnorm1 = (float) (65535) / (float) (50);
Tnorm2 = 4;
Pnorm = (float)(65535) / (float)(20);
I0m = 8.1568;//@4 C - lowest temperature of system
T0m = 48.6282;
T_C = (float) (T_LD) / Tnorm1 + Tnorm2;
Ith = I0m * expf(T_C/T0m);
I_LD = (float) (C_LD) / Inorm;
if (I_LD > Ith)
{
A = (float) (2.24276128270098e-07) * T_C * T_C * T_C - (float) (4.73392579025590e-05) * T_C * T_C + (float) (0.00157250618257057) * T_C + (float) (0.228565407377466);
P = A * (I_LD - Ith) * Pnorm;
}
else
{
P = 0;
} */
return P;
}
/*static uint16_t Temp_LD(uint16_t T_LD_before, uint16_t T_LD, uint32_t Timer_before, uint32_t Timer)
{
uint16_t Result;
// uint8_t randf;
randf = 0;
for (uint8_t i = 0; i < 32; i++)
{
randf = ((Timer>>i)&0x0001)^randf;
}
Result = ((float)(T_LD - T_LD_before))*((float)(1-expf(((float)(Timer_before)-(float)(Timer))/((float)(100))))) + T_LD_before + (float)(randf);
return (uint16_t)(Result);
}*/
uint16_t Get_ADC(uint8_t num)
{
uint16_t OUT;
switch (num)
{
case 0:
HAL_ADC_Start(&hadc1); // Power on
break;
case 1:
HAL_ADC_PollForConversion(&hadc1, 100); // Waiting for conversion
OUT = HAL_ADC_GetValue(&hadc1); // Get value adc
break;
case 2:
HAL_ADC_Stop(&hadc1); // Power off
break;
case 3:
HAL_ADC_Start(&hadc3); // Power on
break;
case 4:
HAL_ADC_PollForConversion(&hadc3, 100); // Waiting for conversion
OUT = HAL_ADC_GetValue(&hadc3); // Get value adc
break;
case 5:
HAL_ADC_Stop(&hadc3); // Power off
break;
}
return OUT;
}