meas_tasks.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /*
  2. * meas_tasks.c
  3. *
  4. * Created on: Sep 5, 2024
  5. * Author: jakubski
  6. */
  7. #include "meas_tasks.h"
  8. #include "adc_buffers.h"
  9. #include "measurements.h"
  10. #include "node-red-config.h"
  11. #include "cmsis_os.h"
  12. #include "main.h"
  13. #ifdef PV_BOARD
  14. #define VOLTAGES_COUNT 1
  15. #define CURRENTS_COUNT 1
  16. #else
  17. #define VOLTAGES_COUNT 3
  18. #define CURRENTS_COUNT 3
  19. #endif
  20. #define CIRC_BUFF_LEN 10
  21. osThreadId_t adc1MeasTaskHandle = NULL;
  22. osThreadId_t adc2MeasTaskHandle = NULL;
  23. osThreadId_t adc3MeasTaskHandle = NULL;
  24. osMessageQueueId_t adc1MeasDataQueue = NULL;
  25. osMessageQueueId_t adc2MeasDataQueue = NULL;
  26. osMessageQueueId_t adc3MeasDataQueue = NULL;
  27. osMutexId_t vRefmVMutex;
  28. osMutexId_t resMeasurementsMutex;
  29. osMutexId_t sensorsInfoMutex;
  30. osMutexId_t ILxRefMutex;
  31. volatile uint32_t vRefmV = 3000;
  32. RESMeasurements resMeasurements = { 0 };
  33. SesnorsInfo sensorsInfo = { 0 };
  34. uint16_t ILxRef[CURRENTS_COUNT] = { 0 };
  35. void MeasTasksInit (void) {
  36. vRefmVMutex = osMutexNew (NULL);
  37. resMeasurementsMutex = osMutexNew (NULL);
  38. sensorsInfoMutex = osMutexNew (NULL);
  39. ILxRefMutex = osMutexNew (NULL);
  40. adc1MeasDataQueue = osMessageQueueNew (8, sizeof (ADC1_Data), NULL);
  41. adc2MeasDataQueue = osMessageQueueNew (8, sizeof (ADC2_Data), NULL);
  42. adc3MeasDataQueue = osMessageQueueNew (8, sizeof (ADC3_Data), NULL);
  43. osThreadAttr_t osThreadAttradc1MeasTask = { 0 };
  44. osThreadAttr_t osThreadAttradc2MeasTask = { 0 };
  45. osThreadAttr_t osThreadAttradc3MeasTask = { 0 };
  46. osThreadAttradc1MeasTask.stack_size = configMINIMAL_STACK_SIZE * 2;
  47. osThreadAttradc1MeasTask.priority = (osPriority_t)osPriorityRealtime;
  48. osThreadAttradc2MeasTask.stack_size = configMINIMAL_STACK_SIZE * 2;
  49. osThreadAttradc2MeasTask.priority = (osPriority_t)osPriorityRealtime;
  50. osThreadAttradc3MeasTask.stack_size = configMINIMAL_STACK_SIZE * 2;
  51. osThreadAttradc3MeasTask.priority = (osPriority_t)osPriorityNormal;
  52. adc1MeasTaskHandle = osThreadNew (ADC1MeasTask, NULL, &osThreadAttradc1MeasTask);
  53. adc2MeasTaskHandle = osThreadNew (ADC2MeasTask, NULL, &osThreadAttradc2MeasTask);
  54. adc3MeasTaskHandle = osThreadNew (ADC3MeasTask, NULL, &osThreadAttradc3MeasTask);
  55. }
  56. void ADC1MeasTask (void* arg) {
  57. float circBuffer[VOLTAGES_COUNT][CIRC_BUFF_LEN];
  58. float rms[VOLTAGES_COUNT];
  59. ADC1_Data adcData = { 0 };
  60. uint32_t circBuffPos = 0;
  61. float gainCorrection = 1.0;
  62. while (pdTRUE) {
  63. osMessageQueueGet (adc1MeasDataQueue, &adcData, 0, osWaitForever);
  64. #ifdef GAIN_AUTO_CORRECTION
  65. if (osMutexAcquire (vRefmVMutex, osWaitForever) == osOK) {
  66. gainCorrection = (float)vRefmV;
  67. osMutexRelease (vRefmVMutex);
  68. }
  69. gainCorrection = gainCorrection / EXT_VREF_mV;
  70. #endif
  71. for (uint8_t i = 0; i < VOLTAGES_COUNT; i++) {
  72. float val = adcData.adcDataBuffer[i] * deltaADC * U_CHANNEL_CONST * gainCorrection * U_MeasCorrectionData[i].gain + U_MeasCorrectionData[i].offset;
  73. circBuffer[i][circBuffPos] = val;
  74. rms[i] = 0.0;
  75. for (uint8_t c = 0; c < CIRC_BUFF_LEN; c++) {
  76. rms[i] += circBuffer[i][c];
  77. }
  78. rms[i] = rms[i] / CIRC_BUFF_LEN;
  79. if (osMutexAcquire (resMeasurementsMutex, osWaitForever) == osOK) {
  80. if (fabs(resMeasurements.voltagePeak[i]) < fabs(val)) {
  81. resMeasurements.voltagePeak[i] = val;
  82. }
  83. resMeasurements.voltageRMS[i] = rms[i];
  84. resMeasurements.power[i] = resMeasurements.voltageRMS[i] * resMeasurements.currentRMS[i];
  85. osMutexRelease (resMeasurementsMutex);
  86. }
  87. }
  88. ++circBuffPos;
  89. circBuffPos = circBuffPos % CIRC_BUFF_LEN;
  90. if (osMutexAcquire (ILxRefMutex, osWaitForever) == osOK) {
  91. uint8_t refIdx = 0;
  92. for (uint8_t i = (uint8_t)IL1Ref; i <= (uint8_t)IL3Ref; i++) {
  93. ILxRef[refIdx++] = adcData.adcDataBuffer[i];
  94. }
  95. osMutexRelease (ILxRefMutex);
  96. }
  97. }
  98. }
  99. void ADC2MeasTask (void* arg) {
  100. float circBuffer[CURRENTS_COUNT][CIRC_BUFF_LEN];
  101. float rms[CURRENTS_COUNT];
  102. ADC2_Data adcData = { 0 };
  103. uint32_t circBuffPos = 0;
  104. float gainCorrection = 1.0;
  105. while (pdTRUE) {
  106. osMessageQueueGet (adc2MeasDataQueue, &adcData, 0, osWaitForever);
  107. if (osMutexAcquire (vRefmVMutex, osWaitForever) == osOK) {
  108. gainCorrection = (float)vRefmV;
  109. osMutexRelease (vRefmVMutex);
  110. }
  111. gainCorrection = gainCorrection / EXT_VREF_mV;
  112. float ref[CURRENTS_COUNT] = { 0 };
  113. if (osMutexAcquire (ILxRefMutex, osWaitForever) == osOK) {
  114. for (uint8_t i = 0; i < CURRENTS_COUNT; i++) {
  115. ref[i] = (float)ILxRef[i];
  116. }
  117. osMutexRelease (ILxRefMutex);
  118. }
  119. for (uint8_t i = 0; i < CURRENTS_COUNT; i++) {
  120. float adcVal = (float)adcData.adcDataBuffer[i];
  121. float val = (adcVal - ref[i]) * deltaADC * I_CHANNEL_CONST * gainCorrection * I_MeasCorrectionData[i].gain + I_MeasCorrectionData[i].offset;
  122. circBuffer[i][circBuffPos] = val;
  123. rms[i] = 0.0;
  124. for (uint8_t c = 0; c < CIRC_BUFF_LEN; c++) {
  125. rms[i] += circBuffer[i][c];
  126. }
  127. rms[i] = rms[i] / CIRC_BUFF_LEN;
  128. if (osMutexAcquire (resMeasurementsMutex, osWaitForever) == osOK) {
  129. if (resMeasurements.currentPeak[i] < val) {
  130. resMeasurements.currentPeak[i] = val;
  131. }
  132. resMeasurements.currentRMS[i] = rms[i];
  133. osMutexRelease (resMeasurementsMutex);
  134. }
  135. }
  136. ++circBuffPos;
  137. circBuffPos = circBuffPos % CIRC_BUFF_LEN;
  138. }
  139. }
  140. void ADC3MeasTask (void* arg) {
  141. ADC3_Data adcData = { 0 };
  142. while (pdTRUE) {
  143. osMessageQueueGet (adc3MeasDataQueue, &adcData, 0, osWaitForever);
  144. uint32_t vRef = __LL_ADC_CALC_VREFANALOG_VOLTAGE (adcData.adcDataBuffer[VrefInt], LL_ADC_RESOLUTION_16B);
  145. if (osMutexAcquire (vRefmVMutex, osWaitForever) == osOK) {
  146. vRefmV = vRef;
  147. osMutexRelease (vRefmVMutex);
  148. }
  149. }
  150. }