Raw EMG signal does not change with muscle contraction on Arduino / STM32 ADC

I am measuring EMG (muscle activity) using surface electrodes and an analog front-end.
On an oscilloscope, I can clearly see the EMG waveform increase in amplitude during muscle contraction.

However, when I read the signal using an Arduino / STM32 ADC, the raw ADC values stay around mid-scale (≈1800–2100 for 12-bit ADC) and do not visibly change with contraction.

please read How to get the best out of this forum


how long is the signal and how many samples can you actually get with your code during that time?

The ADC collects 1024 samples per channel.The actual time covered depends on the sampling rate, which is set by Timer 2 triggering the ADC.
For example, at 10 kHz, 1024 samples cover ~102 ms.
When electrodes are not attached it shows fluctuations around 1200, when attached goes down to 800 then comes back. And it does not follows contractions

can you share the code (using code tags) and the circuit ?

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "arm_math.h"
#include <math.h>
#include "arm_const_structs.h"
#include <stdio.h>
#include <stdint.h>
#include "string.h"
#include "goertzel.h"
#include <stdlib.h>
#include <stdbool.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
// EMG Digital Potentiometer Structure
typedef struct {
    GPIO_TypeDef* mode_port;
    uint16_t mode_pin;
    GPIO_TypeDef* dacsel_port;
    uint16_t dacsel_pin;
    GPIO_TypeDef* ud_port;
    uint16_t ud_pin;
    GPIO_TypeDef* clk_port;
    uint16_t clk_pin;
    uint8_t position;
} EMG_DigitalPot_t;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define EMG_LENGTH 1024
#define NUM_CHANNELS 4
#define Full_Data EMG_LENGTH*NUM_CHANNELS
uint16_t adc_buffer [NUM_CHANNELS * EMG_LENGTH];


#define SIGNAL_LENGTH 1024
#define SIZE_F 10

uint32_t Excitation[SIGNAL_LENGTH] = {2362, 2329, 2442, 2667, 2919, 3090, 3089, 2878, 2493, 2038, 1655, 1475, 1578, 1959, 2533,
		3156, 3672, 3961, 3971, 3730, 3325, 2873, 2475, 2185, 2001, 1876, 1747, 1572, 1346, 1112,
		942, 907, 1043, 1336, 1718, 2092, 2368, 2494, 2478, 2387, 2323, 2381, 2612, 2998, 3454,
		3854, 4074, 4034, 3731, 3242, 2700, 2250, 2007, 2016, 2243, 2588, 2926, 3143, 3177, 3031,
		2761, 2449, 2168, 1957, 1805, 1668, 1494, 1251, 953, 658, 448, 399, 546, 864, 1263,
		1620, 1813, 1769, 1486, 1039, 556, 179, 13, 95, 382, 770, 1131, 1359, 1407, 1300,
		1124, 990, 996, 1188, 1548, 2001, 2443, 2781, 2962, 2986, 2901, 2773, 2657, 2570, 2486,
		2350, 2103, 1720, 1230, 718, 301, 95, 168, 515, 1056, 1650, 2142, 2412, 2410, 2169,
		1796, 1426, 1184, 1140, 1291, 1564, 1854, 2058, 2113, 2017, 1823, 1613, 1462, 1411, 1447,
		1516, 1544, 1474, 1289, 1025, 758, 573, 533, 647, 867, 1103, 1253, 1251, 1089, 829,
		588, 494, 645, 1071, 1717, 2459, 3137, 3610, 3794, 3684, 3356, 2930, 2534, 2262, 2147,
		2164, 2248, 2331, 2369, 2365, 2361, 2415, 2576, 2849, 3192, 3520, 3739, 3780, 3625, 3325,
		2978, 2699, 2581, 2658, 2890, 3178, 3399, 3449, 3283, 2932, 2499, 2119, 1920, 1976, 2282,
		2763, 3293, 3742, 4016, 4086, 3988, 3803, 3622, 3513, 3495, 3540, 3592, 3593, 3517, 3382,
		3244, 3172, 3216, 3380, 3607, 3795, 3827, 3613, 3127, 2421, 1616, 865, 308, 29, 32,
		241, 531, 774, 880, 826, 660, 478, 383, 448, 685, 1047, 1440, 1763, 1942, 1954,
		1834, 1652, 1484, 1381, 1347, 1344, 1309, 1191, 975, 702, 458, 345, 447, 789, 1324,
		1937, 2482, 2823, 2883, 2666, 2258, 1799, 1438, 1283, 1375, 1673, 2078, 2470, 2750, 2870,
		2847, 2744, 2640, 2597, 2632, 2715, 2782, 2767, 2631, 2386, 2090, 1830, 1689, 1706, 1867,
		2097, 2296, 2367, 2261, 1996, 1653, 1350, 1204, 1279, 1567, 1984, 2395, 2656, 2667, 2399,
		1905, 1306, 744, 345, 177, 241, 478, 800, 1125, 1410, 1656, 1901, 2192, 2552, 2967,
		3375, 3690, 3832, 3764, 3506, 3138, 2778, 2536, 2481, 2612, 2857, 3096, 3206, 3102, 2769,
		2269, 1723, 1266, 1007, 986, 1168, 1456, 1724, 1866, 1828, 1622, 1323, 1030, 836, 791,
		889, 1079, 1287, 1453, 1554, 1610, 1676, 1806, 2031, 2329, 2626, 2821, 2818, 2564, 2080,
		1458, 841, 382, 191, 305, 676, 1186, 1689, 2057, 2219, 2180, 2012, 1823, 1712, 1736,
		1889, 2108, 2305, 2398, 2345, 2162, 1911, 1677, 1532, 1508, 1587, 1709, 1803, 1818, 1747,
		1638, 1574, 1644, 1901, 2334, 2867, 3374, 3719, 3804, 3600, 3163, 2618, 2120, 1804, 1747,
		1942, 2307, 2717, 3048, 3212, 3191, 3025, 2796, 2589, 2462, 2421, 2431, 2431, 2372, 2240,
		2067, 1926, 1897, 2040, 2360, 2803, 3266, 3635, 3819, 3790, 3585, 3302, 3059, 2953, 3020,
		3224, 3461, 3600, 3526, 3183, 2592, 1853, 1108, 499, 126, 17, 132, 380, 657, 885,
		1034, 1120, 1194, 1304, 1475, 1684, 1874, 1976, 1939, 1758, 1488, 1227, 1089, 1161, 1467,
		1961, 2531, 3038, 3359, 3431, 3270, 2963, 2643, 2437, 2427, 2621, 2954, 3315, 3586, 3683,
		3586, 3344, 3046, 2796, 2668, 2682, 2804, 2962, 3076, 3094, 3011, 2865, 2719, 2633, 2626,
		2670, 2695, 2611, 2354, 1910, 1338, 754, 299, 98, 212, 619, 1216, 1850, 2363, 2643,
		2653, 2433, 2086, 1731, 1466, 1333, 1310, 1330, 1309, 1186, 949, 637, 326, 96, 0,
		45, 183, 340, 441, 447, 371, 276, 251, 372, 672, 1118, 1616, 2041, 2277, 2262,
		2011, 1613, 1206, 934, 895, 1112, 1526, 2018, 2445, 2691, 2697, 2480, 2115, 1705, 1341,
		1076, 910, 803, 702, 570, 411, 272, 224, 331, 623, 1071, 1590, 2066, 2389, 2498,
		2397, 2162, 1909, 1761, 1797, 2029, 2392, 2771, 3041, 3109, 2952, 2624, 2239, 1933, 1817,
		1942, 2284, 2759, 3249, 3647, 3889, 3968, 3928, 3835, 3748, 3690, 3640, 3550, 3365, 3063,
		2667, 2251, 1920, 1770, 1853, 2155, 2590, 3027, 3330, 3404, 3227, 2860, 2424, 2065, 1898,
		1980, 2284, 2719, 3160, 3495, 3660, 3659, 3553, 3436, 3392, 3464, 3640, 3858, 4034, 4094,
		4007, 3794, 3515, 3249, 3052, 2941, 2878, 2795, 2616, 2300, 1863, 1383, 982, 781, 864,
		1238, 1829, 2496, 3076, 3430, 3483, 3247, 2811, 2307, 1862, 1564, 1432, 1424, 1456, 1447,
		1344, 1149, 909, 697, 575, 570, 658, 775, 842, 799, 632, 384, 142, 0, 30,
		244, 591, 967, 1254, 1361, 1260, 998, 688, 464, 446, 687, 1161, 1771, 2373, 2833,
		3060, 3037, 2821, 2515, 2231, 2055, 2016, 2092, 2224, 2349, 2431, 2474, 2520, 2627, 2834,
		3139, 3485, 3776, 3903, 3790, 3419, 2844, 2181, 1571, 1134, 932, 949, 1099, 1259, 1313,
		1194, 910, 539, 202, 18, 65, 351, 811, 1335, 1803, 2125, 2266, 2253, 2155, 2048,
		1988, 1987, 2012, 2008, 1923, 1744, 1505, 1280, 1159, 1210, 1448, 1820, 2217, 2509, 2584,
		2393, 1967, 1412, 880, 516, 417, 601, 1006, 1513, 1990, 2332, 2497, 2511, 2450, 2403,
		2440, 2579, 2786, 2988, 3106, 3088, 2933, 2689, 2435, 2249, 2178, 2217, 2312, 2381, 2355,
		2206, 1964, 1716, 1573, 1630, 1930, 2437, 3044, 3601, 3962, 4031, 3793, 3317, 2734, 2196,
		1825, 1682, 1752, 1962, 2212, 2412, 2518, 2539, 2526, 2541, 2629, 2793, 2991, 3150, 3200,
		3105, 2880, 2593, 2342, 2216, 2264, 2468, 2749, 2990, 3079, 2947, 2599, 2111, 1608, 1222,
		1047, 1104, 1337, 1631, 1852, 1896, 1721, 1361, 912, 497, 228, 167, 312, 610, 979,
		1344, 1667, 1953, 2238, 2566, 2956, 3382, 3776, 4040, 4090, 3884, 3450, 2880, 2311, 1879,
		1678, 1730, 1973, 2289, 2543, 2627, 2498, 2194, 1811, 1474, 1289, 1307, 1506, 1805, 2092,
		2267, 2274, 2121, 1869, 1606, 1411, 1326, 1341, 1408, 1459, 1445, 1360, 1243, 1167, 1205,
		1401, 1737, 2138, 2488, 2672, 2614, 2312, 1842, 1339, 957, 819, 979, 1403, 1987, 2584,
		3061, 3331, 3382, 3267, 3080, 2916, 2835, 2845, 2904, 2943, 2902, 2757, 2534, 2301, 2139,
		2113, 2241, 2485, 2766, 2990, 3089, 3046, 2905, 2756, 2700, 2807, 3085, 3471, 3841, 4058,
		4008, 3648, 3017, 2231, 1445, 806, 408, 271, 341, 513, 676, 750, 706, 575, 421,
		310, 283, 334, 417, 470, 441, 322, 154, 17, 3, 179, 551, 1063, 1604, 2042,
		2272, 2251, 2011, 1652, 1306, 1093, 1078, 1250, 1527, 1789, 1916, 1838, 1554, 1135, 698,
		364, 222, 298, 554, 906, 1262, 1551, 1748, 1874, 1980, 2113, 2289, 2481, 2627, 2649,
		2495, 2165, 1720, 1278, 970, 908, 1136, 1619, 2249, 2877, 3362, 3611, 3614, 3435, 3191,
		3007, 2972, 3111, 3378, 3679, 3907, 3985, 3889, 3657, 3368, 3112, 2953, 2910, 2947, 2997,
		2994, 2898, 2720, 2516};
int f_freqbins_map[SIZE_F] = {5, 7, 10, 14, 19, 27, 37, 52, 73, 102};


/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
ADC_HandleTypeDef hadc2;
ADC_HandleTypeDef hadc3;
DMA_HandleTypeDef hdma_adc1;
DMA_HandleTypeDef hdma_adc2;
DMA_HandleTypeDef hdma_adc3;

DAC_HandleTypeDef hdac1;
DMA_HandleTypeDef hdma_dac_ch1;

TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim4;

UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */
// EMG Digital Potentiometers - Based on your exact pin mapping
EMG_DigitalPot_t emg_pots[4] = {
    {GPIOB, GPIO_PIN_12, GPIOB, GPIO_PIN_13, GPIOB, GPIO_PIN_14, GPIOB, GPIO_PIN_15, 64},
    {GPIOC, GPIO_PIN_6, GPIOC, GPIO_PIN_7, GPIOC, GPIO_PIN_8, GPIOC, GPIO_PIN_9, 64},
    {GPIOA, GPIO_PIN_8, GPIOA, GPIO_PIN_9, GPIOA, GPIO_PIN_10, GPIOA, GPIO_PIN_11, 64},
    // Fix EMG4:
    {GPIOA, GPIO_PIN_6, GPIOA, GPIO_PIN_7, GPIOC, GPIO_PIN_4, GPIOC, GPIO_PIN_5, 64}
};

uint32_t Emg1Buffer1[EMG_LENGTH] = {0};
uint32_t Emg2Buffer1[EMG_LENGTH] = {0};
uint32_t Emg3Buffer1[EMG_LENGTH] = {0};
uint32_t Emg4Buffer1[EMG_LENGTH] = {0};
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void PeriphCommonClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC3_Init(void);
static void MX_TIM3_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_ADC1_Init(void);
static void MX_ADC2_Init(void);
static void MX_DAC1_Init(void);
static void MX_TIM2_Init(void);
static void MX_TIM4_Init(void);
/* USER CODE BEGIN PFP */
// Function prototypes
void EMG_Init(void);
void EMG_SetPosition(uint8_t channel, uint8_t position);
void EMG_MoveSteps(uint8_t channel, int16_t steps);
void EMG_SetGainLevel(uint8_t channel, uint8_t gain_level);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void serialPrint(UART_HandleTypeDef *uart, uint8_t *message)
{
  HAL_UART_Transmit(uart, (uint8_t *)message, strlen(message), 500);
}

uint16_t AdcBuffer1[SIGNAL_LENGTH] = { 0 };
uint16_t AdcBuffer2[SIGNAL_LENGTH] = { 0 };
float32_t accPhase[SIZE_F];
float32_t accMagnitude[SIZE_F];
float32_t accFactor = 0.99;

 uint8_t DmaCpltFlag_BIS = 0;
 uint8_t DmaCpltFlag_EMG = 0;
char msg[100];
// Simple microsecond delay (adjust for your clock speed)
void delay_us(uint32_t us) {
    volatile uint32_t count = us * 20; // Adjust this multiplier for your system
    while(count--);
}

// Initialize all EMG digital potentiometers
void EMG_Init(void) {
	for(int i = 0; i < 4; i++) { // All 4 channels (EMG1, EMG2, EMG3, EMG4)
        // MODE = 0 (both wipers move together)
        HAL_GPIO_WritePin(emg_pots[i].mode_port, emg_pots[i].mode_pin, GPIO_PIN_RESET);

        // DACSEL = 0 (select first wiper)
        HAL_GPIO_WritePin(emg_pots[i].dacsel_port, emg_pots[i].dacsel_pin, GPIO_PIN_RESET);

        // U/D = 0 (direction down initially)
        HAL_GPIO_WritePin(emg_pots[i].ud_port, emg_pots[i].ud_pin, GPIO_PIN_RESET);

        // CLK = 0 (CRITICAL: Keep LOW to prevent changes since CS is tied to GND)
        HAL_GPIO_WritePin(emg_pots[i].clk_port, emg_pots[i].clk_pin, GPIO_PIN_RESET);

        // Track mid-scale position (AD5222 powers up at position 64)
        emg_pots[i].position = 64;
    }
    HAL_Delay(50);
}

// Send one clock pulse (very carefully since CS is always active)
static void EMG_ClockPulse(uint8_t channel) {
    if(channel >= 4) return;

    __disable_irq(); // Critical section

    // Ensure starting from LOW
    HAL_GPIO_WritePin(emg_pots[channel].clk_port, emg_pots[channel].clk_pin, GPIO_PIN_RESET);
    delay_us(10);

    // Pulse HIGH then LOW (falling edge triggers)
    HAL_GPIO_WritePin(emg_pots[channel].clk_port, emg_pots[channel].clk_pin, GPIO_PIN_SET);
    delay_us(50);
    HAL_GPIO_WritePin(emg_pots[channel].clk_port, emg_pots[channel].clk_pin, GPIO_PIN_RESET);
    delay_us(50);

    __enable_irq();
}

// Move by number of steps (+up, -down)
void EMG_MoveSteps(uint8_t channel, int16_t steps) {
    if(channel >= 4 || steps == 0) return;

    // Calculate new position with bounds checking
    int16_t new_pos = emg_pots[channel].position + steps;
    if(new_pos < 0) {
        steps = -emg_pots[channel].position;
        new_pos = 0;
    }
    if(new_pos > 127) {
        steps = 127 - emg_pots[channel].position;
        new_pos = 127;
    }

    if(steps == 0) return;

    // Set direction
    if(steps > 0) {
        HAL_GPIO_WritePin(emg_pots[channel].ud_port, emg_pots[channel].ud_pin, GPIO_PIN_SET); // UP
    } else {
        HAL_GPIO_WritePin(emg_pots[channel].ud_port, emg_pots[channel].ud_pin, GPIO_PIN_RESET); // DOWN
        steps = -steps; // Make positive for loop
    }

    delay_us(20); // Setup time

    // Send clock pulses
    for(int i = 0; i < steps; i++) {
        EMG_ClockPulse(channel);
    }

    emg_pots[channel].position = new_pos;

    // Ensure ALL clocks stay LOW
    for(int i = 0; i < 4; i++) {
        HAL_GPIO_WritePin(emg_pots[i].clk_port, emg_pots[i].clk_pin, GPIO_PIN_RESET);
    }
}

// Set absolute position (0-127)
void EMG_SetPosition(uint8_t channel, uint8_t position) {
    if(channel >= 4 || position > 127) return;

    int16_t steps = position - emg_pots[channel].position;
    EMG_MoveSteps(channel, steps);
}

// Set predefined gain levels
void EMG_SetGainLevel(uint8_t channel, uint8_t gain_level) {
    uint8_t positions[] = {10, 30, 64, 100}; // Max, High, Medium, Low gain

    if(channel >= 4 || gain_level >= 4) return;

    EMG_SetPosition(channel, positions[gain_level]);
}

// Get current resistance W-to-B in ohms
uint16_t EMG_GetResistance(uint8_t channel) {
    if(channel >= 4) return 0;
    return (emg_pots[channel].position * 78); // Each step ≈ 78Ω for 10kΩ pot
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */
  //#define FFT
//	#define GOERTZEL
	//	#define SIGNAL_OUT
	 //#define EMG_SIGNAL_OUT
	#define EMG
	#define SIGNAL_OUT_SERIALPLOT_STYLE
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* Configure the peripherals common clocks */
  PeriphCommonClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC3_Init();
  MX_TIM3_Init();
  MX_USART2_UART_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_DAC1_Init();
  MX_TIM2_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */
  	EMG_SetGainLevel(0, 1); // EMG1 - medium gain
    EMG_SetGainLevel(1, 1); // EMG2 - medium gain
    EMG_SetGainLevel(2, 1); // EMG3 - medium gain
    EMG_SetGainLevel(3, 1); // EMG4 - medium gain

//	HAL_ADCEx_Calibration_Start(&hadc3, ADC_SINGLE_ENDED);
//    HAL_ADC_Start_DMA(&hadc3, (uint32_t *)adc_buffer, Full_Data);
//    HAL_TIM_Base_Start(&htim3);

	HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, Excitation, SIGNAL_LENGTH,DAC_ALIGN_12B_R);
	HAL_TIM_Base_Start(&htim4);


	// Calibrate ADCs bio
	HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
	HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);

	// Start DMA & ADC 1/2 bio
	HAL_ADC_Start_DMA(&hadc1, (uint32_t*) AdcBuffer1, SIGNAL_LENGTH);
	HAL_ADC_Start_DMA(&hadc2, (uint32_t*) AdcBuffer2, SIGNAL_LENGTH);
	HAL_TIM_Base_Start(&htim2);


////	  	 Start DMA / DAC 3 bio
//	HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, Excitation, SIGNAL_LENGTH,DAC_ALIGN_12B_R);
//	HAL_TIM_Base_Start(&htim4);
//
//
//	// Calibrate ADCs bio
//		HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
//		HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
//
//	// Start DMA & ADC 1/2 bio
//		HAL_ADC_Start_DMA(&hadc1, (uint32_t*) AdcBuffer1, SIGNAL_LENGTH);
//		HAL_ADC_Start_DMA(&hadc2, (uint32_t*) AdcBuffer2, SIGNAL_LENGTH);
//		HAL_TIM_Base_Start(&htim2);


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

//      if (DmaCpltFlag_EMG == 1 && DmaCpltFlag_BIS==1) {
//          DmaCpltFlag_EMG = 0;
//          DmaCpltFlag_BIS = 0;
	   //HAL_TIM_Base_Stop(&htim2);
	    if (DmaCpltFlag_BIS == 1) {
	    	DmaCpltFlag_BIS = 0;
	    	HAL_TIM_Base_Stop(&htim2);


	    	////////////////////////////////////////////////////// Out signal /////////////////////////////////
	    	#ifdef SIGNAL_OUT
	    	      char message[50];
	    	      int cnt = 0;

	    	      serialPrint(&huart2, "Signal writing...\r\n");
	    	      for (cnt = 0; cnt < SIGNAL_LENGTH; cnt++)
	    	      {

	    	#ifdef SIGNAL_OUT_SERIALPLOT_STYLE
	    	        sprintf(message, "%d,%d,%d\r\n",cnt, AdcBuffer1[cnt], AdcBuffer2[cnt]); //, Emg1Buffer1[cnt], Emg2Buffer1[cnt], Emg3Buffer1[cnt], Emg4Buffer1[cnt] /, %u, %u, %u, %u
	    	        HAL_UART_Transmit(&huart2, (uint8_t *)message, strlen(message), 500);

	    	#else
	    	        sprintf(message, "ADC1(%4d)=%4d;\r\n", cnt + 1, AdcBuffer1[cnt]);
	    	        HAL_UART_Transmit(&huart2, (uint8_t *)message, 18, 500);

	    	        sprintf(message, "ADC2(%4d)=%4d;\r\n", cnt + 1, AdcBuffer2[cnt]);
	    	        HAL_UART_Transmit(&huart2, (uint8_t *)message, 18, 500);

	    	#endif

	    	        //

	    	        //	  	  		 	HAL_Delay(10);
	    	      }
	    	      serialPrint(&huart2, "Signal writing done\r\n");
	    	      HAL_TIM_Base_Start(&htim2);
	    	#endif


//	    }
#ifdef GOERTZEL

      uint8_t message[50];

      float32_t Magnitude[SIZE_F];
      float32_t Phase[SIZE_F];
      goertzel_struct g1[SIZE_F];
      goertzel_struct_singlesideres gres1[SIZE_F];
      goertzel_struct g2[SIZE_F];
      goertzel_struct_singlesideres gres2[SIZE_F];

	  for(int k = 0; k< SIZE_F; k++) {
		  goertzel_init2(f_freqbins_map[k], SIGNAL_LENGTH, &g1[k]);
		  goertzel_init2(f_freqbins_map[k], SIGNAL_LENGTH, &g2[k]);

		  for(int i=0; i<SIGNAL_LENGTH; i++) {
			  goertzel(&g1[k], (double)AdcBuffer1[i]);
			    goertzel(&g2[k], (double)AdcBuffer2[i]);

			  //goertzel(&g1[k], (double)AdcBuffer1[i]/ACQ_LENGTH * powf(arm_sin_f32(pi*(float)i/ACQ_LENGTH),2));
			  //goertzel(&g2[k], (double)AdcBuffer2[i]/FFT_LENGTH * powf(arm_sin_f32(pi*(float)i/ACQ_LENGTH),2));
			//  goertzel(&g1[k], (float)AdcBuffer1[i]/ACQ_LENGTH * powf(arm_sin_f32(pi*(float)i/ACQ_LENGTH),2));
			//  goertzel(&g2[k], (float)AdcBuffer2[i]/ACQ_LENGTH * powf(arm_sin_f32(pi*(float)i/ACQ_LENGTH),2));

		  }

		  goertzel_end(&g1[k], &gres1[k], SIGNAL_LENGTH);
		  goertzel_end(&g2[k], &gres2[k], SIGNAL_LENGTH);

		  Magnitude[k] = 1000.0 *gres1[k].M / gres2[k].M;
//		 Phase[k] =  fmod((float)((gres1[k].Phi-gres2[k].Phi)*(180/PI))+180 - 360, 360);  //+90;
	  Phase[k] =  fmod((float)((gres1[k].Phi-gres2[k].Phi)*(180/PI))+360-360, 360);  //+90;



		if (accPhase[k] == 0) accPhase[k] = Phase[k];
		if (accMagnitude[k] == 0) accMagnitude[k] = Magnitude[k];
		accPhase[k] = accPhase[k] * accFactor + Phase[k] * (1-accFactor);
		accMagnitude[k] = accMagnitude[k] * accFactor + Magnitude[k] * (1-accFactor);
	}

		      for (int cnt = 0; cnt < SIZE_F; cnt++) {

		#ifdef SIGNAL_OUT_SERIALPLOT_STYLE
		    	  //Magnitude, Phase, accumulated magnitude, accumulated phase
		        sprintf(message, "%d, %d.%d,%d.%d,%d.%d,%d.%d\r\n", cnt+1, (int)(Magnitude[cnt]),  (int)((fabs(Magnitude[cnt]) - (int)fabs(Magnitude[cnt])) * 1000),
		        		(int)Phase[cnt], (int)((fabs(Phase[cnt]) - (int)fabs(Phase[cnt])) * 1000),
						(int)(accMagnitude[cnt]),  (int)((fabs(accMagnitude[cnt]) - (int)fabs(accMagnitude[cnt])) * 1000),
						(int)accPhase[cnt], (int)((fabs(accPhase[cnt]) - (int)fabs(accPhase[cnt])) * 1000)

		        );
		        HAL_UART_Transmit(&huart2, (uint8_t *)message, strlen(message), 500);

		#else
		        // Magnitude, Phase from UART
		        sprintf(message, "Phas(%02d)=%d.%d;\r\n", cnt + 1, (int)Phase[cnt], (int)((fabs(Phase[cnt]) - (int)fabs(Phase[cnt])) * 1000));
		        HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 500);
		        sprintf(message, "Magn(%02d)=%d.%d;\r\n", cnt + 1, (int)Magnitude[cnt], (int)((fabs(Magnitude[cnt]) - (int)fabs(Magnitude[cnt])) * 1000));
		        HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 500);
		        sprintf(message, "AccPhas(%02d)=%d.%d;\r\n", cnt + 1, (int)accPhase[cnt], (int)((fabs(accPhase[cnt]) - (int)fabs(accPhase[cnt])) * 1000));
			   HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 500);
			   sprintf(message, "AccMagn(%02d)=%d.%d;\r\n", cnt + 1, (int)accMagnitude[cnt], (int)((fabs(accMagnitude[cnt]) - (int)fabs(accMagnitude[cnt])) * 1000));
			   HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 500);
		#endif
		      }



#endif
				////////////////////////////////////////////////////////// FFT ///////////////////////////////////////////////////////
		#ifdef FFT

					      uint8_t message[500];

					      float32_t Magnitude[SIZE_F];
					      float32_t Magnitude1[SIZE_F];
					      float32_t Magnitude2[SIZE_F];
					      float32_t Phase[SIZE_F];
					      float32_t Theta1[SIZE_F];
					      float32_t Theta2[SIZE_F];
					      float32_t in1;
					      float32_t in2;
					      float32_t input1;
						  float32_t input2;
						  int idxtest;


					     float32_t fft_inputbuf[SIGNAL_LENGTH * 2];
					     // int16_t fft_inputbuf[SIGNAL_LENGTH * 2];
					      for (int i = 0; i < SIGNAL_LENGTH; i++)
					      {

					        fft_inputbuf[i * 2] = AdcBuffer1[i];
					        fft_inputbuf[i * 2 + 1] = 0;
					      }
					      arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_inputbuf, 0, 1);
					      /*
					      if(SIGNAL_LENGTH==2048)       arm_cfft_f32(&arm_cfft_sR_f32_len2048, fft_inputbuf, 0, 1);
					      else if(SIGNAL_LENGTH == 4096) arm_cfft_f32(&arm_cfft_sR_f32_len4096, fft_inputbuf, 0, 1);
		*/
					  //     if(ACQ_LENGTH==2048)       arm_cfft_q15(&arm_cfft_sR_q15_len2048, fft_inputbuf, 0, 1);
					    //     else if(ACQ_LENGTH == 4096) arm_cfft_q15(&arm_cfft_sR_q15_len4096, fft_inputbuf, 0, 1);


					      for (int idx = 0; idx < SIZE_F; idx++)
					      			      {

					         in1 = fft_inputbuf[f_freqbins_map[idx] * 2];
					         in2 = fft_inputbuf[f_freqbins_map[idx] * 2 + 1];
					        Theta1[idx] = atan2(in2, in1);

					         input1 = fft_inputbuf[f_freqbins_map[idx] * 2];
					         input2 = fft_inputbuf[f_freqbins_map[idx] * 2 + 1];
					        Magnitude1[idx] = (float)sqrt((input1 * input1) + (input2 * input2));

					      			      }

					      // FFT_ADC2_ START
					      for (int i = 0; i < SIGNAL_LENGTH; i++)
					      {

					        fft_inputbuf[i * 2] = AdcBuffer2[i];
					        fft_inputbuf[i * 2 + 1] = 0;
					      }

					      arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_inputbuf, 0, 1);

					//      if(SIGNAL_LENGTH==2048) arm_cfft_f32(&arm_cfft_sR_f32_len2048, fft_inputbuf, 0, 1);
					   //   else if(SIGNAL_LENGTH == 4096) arm_cfft_f32(&arm_cfft_sR_f32_len4096, fft_inputbuf, 0, 1);

					      //     if(ACQ_LENGTH==2048)       arm_cfft_q15(&arm_cfft_sR_q15_len2048, fft_inputbuf, 0, 1);
					        //     else if(ACQ_LENGTH == 4096) arm_cfft_q15(&arm_cfft_sR_q15_len4096, fft_inputbuf, 0, 1);


					      for (int idx = 0; idx < SIZE_F; idx++)
					      			      {
					        in1 = fft_inputbuf[f_freqbins_map[idx] * 2];
					        in2 = fft_inputbuf[f_freqbins_map[idx] * 2 + 1];
					        Theta2[idx] = atan2(in2, in1);

					        input1 = fft_inputbuf[f_freqbins_map[idx] * 2];
					        input2 = fft_inputbuf[f_freqbins_map[idx] * 2 + 1];

					        Magnitude2[idx] = (float)sqrt((input1 * input1) + (input2 * input2));

					        Phase[idx] = (float)((Theta1[idx] - Theta2[idx]) * (180 / PI)) + 180; //+90;
					        Phase[idx] = fmod(Phase[idx] - 360, 360);
					        Magnitude[idx] = (float)(Magnitude1[idx] / Magnitude2[idx]) * 1000;
					      			      }


					      for (int cnt = 0; cnt < SIZE_F; cnt++) {
					     		#ifdef SIGNAL_OUT_SERIALPLOT_STYLE
					     		    	//Magnitude, Phase, accumulated magnitude, accumulated phase
					     		        sprintf(message, "%d, %d.%d, %d.%d, %d.%d, %d.%d \r\n",
					     		        		cnt+1,
												(int)(Magnitude[cnt]),  (int)((fabs(Magnitude[cnt]) - (int)fabs(Magnitude[cnt])) * 1000),
					     		        		(int)Phase[cnt], (int)((fabs(Phase[cnt]) - (int)fabs(Phase[cnt])) * 1000),
					     						(int)(accMagnitude[cnt]),  (int)((fabs(accMagnitude[cnt]) - (int)fabs(accMagnitude[cnt])) * 1000),
					     						(int)accPhase[cnt], (int)((fabs(accPhase[cnt]) - (int)fabs(accPhase[cnt])) * 1000)
					     		        );

					     		        HAL_UART_Transmit(&huart2, (uint8_t *)message, strlen(message), 500);

					     		#else
					     		        // Magnitude, Phase from UART
					     		        sprintf(message, "Phas(%02d)=%d.%d;\r\n", cnt + 1, (int)Phase[cnt], (int)((fabs(Phase[cnt]) - (int)fabs(Phase[cnt])) * 1000));
					     		        HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 500);
					     		        sprintf(message, "Magn(%02d)=%d.%d;\r\n", cnt + 1, (int)Magnitude[cnt], (int)((fabs(Magnitude[cnt]) - (int)fabs(Magnitude[cnt])) * 1000));
					     		        HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 500);
					     		        sprintf(message, "AccPhas(%02d)=%d.%d;\r\n", cnt + 1, (int)accPhase[cnt], (int)((fabs(accPhase[cnt]) - (int)fabs(accPhase[cnt])) * 1000));
					     			   HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 500);
					     			   sprintf(message, "AccMagn(%02d)=%d.%d;\r\n", cnt + 1, (int)accMagnitude[cnt], (int)((fabs(accMagnitude[cnt]) - (int)fabs(accMagnitude[cnt])) * 1000));
					     			   HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 500);
					     		#endif
					     		      }


					      HAL_TIM_Base_Start(&htim2);
		#endif

					  //    HAL_TIM_Base_Start(&htim2);
	    //}




	          // Handle EMG data

#ifdef EMG
	         // HAL_TIM_Base_Stop(&htim3);
	       //   HAL_TIM_Base_Stop(&htim2);
	          // Parse interleaved ADC data into separate channel buffers
	          for (int i = 0; i < EMG_LENGTH; ++i) {
	              Emg1Buffer1[i] = adc_buffer[i * 4];     // Channel 0
	              Emg2Buffer1[i] = adc_buffer[i * 4 + 1]; // Channel 1
	              Emg3Buffer1[i] = adc_buffer[i * 4 + 2]; // Channel 2
	              Emg4Buffer1[i] = adc_buffer[i * 4 + 3]; // Channel 3
	          }

//	           for(int i = 0; i < EMG_LENGTH; i++) {
//	               sprintf(msg, "%d,%d,%d, %d, %d, %d, %d\r\n", i,
//	                       AdcBuffer1[i], AdcBuffer2[i],
//	                       Emg1Buffer1[i], Emg2Buffer1[i], Emg3Buffer1[i], Emg4Buffer1[i]);
//		               HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 500);
//		           }


	          for (int i = 0; i < EMG_LENGTH; i++) {
	               sprintf(msg, "%d,%d,%d,%d\r\n",
	                       Emg1Buffer1[i],
	                       Emg2Buffer1[i],
	                       Emg3Buffer1[i],
	                       Emg4Buffer1[i]);
	               HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 500);
	           }

	     //      printf("Data transmission complete. Next acquisition starting...\r\n");
	          // HAL_TIM_Base_Start(&htim3);
	          // HAL_TIM_Base_Start(&htim2);
#endif
	          }



	           // Restart timer for next acquisition
	         // HAL_Delay(1);
  }

  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 1;
  RCC_OscInitStruct.PLL.PLLN = 10;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief Peripherals Common Clock Configuration
  * @retval None
  */
void PeriphCommonClock_Config(void)
{
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the peripherals clock
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1;
  PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSI;
  PeriphClkInit.PLLSAI1.PLLSAI1M = 1;
  PeriphClkInit.PLLSAI1.PLLSAI1N = 8;
  PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7;
  PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2;
  PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2;
  PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_ADC1CLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief ADC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_MultiModeTypeDef multimode = {0};
  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc1.Init.DMAContinuousRequests = ENABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure the ADC multi-mode
  */
  multimode.Mode = ADC_MODE_INDEPENDENT;
  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_5;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

/**
  * @brief ADC2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC2_Init(void)
{

  /* USER CODE BEGIN ADC2_Init 0 */

  /* USER CODE END ADC2_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC2_Init 1 */

  /* USER CODE END ADC2_Init 1 */

  /** Common config
  */
  hadc2.Instance = ADC2;
  hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc2.Init.Resolution = ADC_RESOLUTION_12B;
  hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc2.Init.LowPowerAutoWait = DISABLE;
  hadc2.Init.ContinuousConvMode = DISABLE;
  hadc2.Init.NbrOfConversion = 1;
  hadc2.Init.DiscontinuousConvMode = DISABLE;
  hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
  hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc2.Init.DMAContinuousRequests = ENABLE;
  hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc2.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc2) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_6;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC2_Init 2 */

  /* USER CODE END ADC2_Init 2 */

}

/**
  * @brief ADC3 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC3_Init(void)
{

  /* USER CODE BEGIN ADC3_Init 0 */

  /* USER CODE END ADC3_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC3_Init 1 */

  /* USER CODE END ADC3_Init 1 */

  /** Common config
  */
  hadc3.Instance = ADC3;
  hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc3.Init.Resolution = ADC_RESOLUTION_12B;
  hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc3.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc3.Init.LowPowerAutoWait = DISABLE;
  hadc3.Init.ContinuousConvMode = ENABLE;
  hadc3.Init.NbrOfConversion = 4;
  hadc3.Init.DiscontinuousConvMode = DISABLE;
  hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;
  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc3.Init.DMAContinuousRequests = ENABLE;
  hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc3.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc3) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_3;
  sConfig.Rank = ADC_REGULAR_RANK_3;
  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_REGULAR_RANK_4;
  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC3_Init 2 */

  /* USER CODE END ADC3_Init 2 */

}

/**
  * @brief DAC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_DAC1_Init(void)
{

  /* USER CODE BEGIN DAC1_Init 0 */

  /* USER CODE END DAC1_Init 0 */

  DAC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN DAC1_Init 1 */

  /* USER CODE END DAC1_Init 1 */

  /** DAC Initialization
  */
  hdac1.Instance = DAC1;
  if (HAL_DAC_Init(&hdac1) != HAL_OK)
  {
    Error_Handler();
  }

  /** DAC channel OUT1 config
  */
  sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
  sConfig.DAC_Trigger = DAC_TRIGGER_T4_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
  sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
  if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN DAC1_Init 2 */

  /* USER CODE END DAC1_Init 2 */

}

/**
  * @brief TIM2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM2_Init(void)
{

  /* USER CODE BEGIN TIM2_Init 0 */

  /* USER CODE END TIM2_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM2_Init 1 */

  /* USER CODE END TIM2_Init 1 */
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 31;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM2_Init 2 */

  /* USER CODE END TIM2_Init 2 */

}

/**
  * @brief TIM3 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM3_Init(void)
{

  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM3_Init 1 */

  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 3999;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */

  /* USER CODE END TIM3_Init 2 */

}

/**
  * @brief TIM4 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM4_Init(void)
{

  /* USER CODE BEGIN TIM4_Init 0 */

  /* USER CODE END TIM4_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM4_Init 1 */

  /* USER CODE END TIM4_Init 1 */
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 0;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 31;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM4_Init 2 */

  /* USER CODE END TIM4_Init 2 */

}

/**
  * @brief USART2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */

  /* USER CODE END USART2_Init 2 */

}

/**
  * Enable DMA controller clock
  */
static void MX_DMA_Init(void)
{

  /* DMA controller clock enable */
  __HAL_RCC_DMA2_CLK_ENABLE();
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA1_Channel1_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  /* DMA1_Channel2_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
  /* DMA2_Channel4_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
  /* DMA2_Channel5_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA2_Channel5_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA2_Channel5_IRQn);

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  /* USER CODE BEGIN MX_GPIO_Init_1 */

  /* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9
                          |GPIO_PIN_10|GPIO_PIN_11, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);

  /*Configure GPIO pins : PA6 PA7 PA8 PA9
                           PA10 PA11 */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9
                          |GPIO_PIN_10|GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PC4 PC5 PC6 PC7
                           PC8 PC9 */
  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PB12 PB13 PB14 PB15 */
  GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN MX_GPIO_Init_2 */

  /* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */
//void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
//{
//  DmaCpltFlag1 = 1;
//}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
    if(hadc->Instance == ADC1 || hadc->Instance == ADC2) {
        DmaCpltFlag_BIS = 1;
    }
    if(hadc->Instance == ADC1 || hadc->Instance == ADC2) {
        DmaCpltFlag_BIS = 1;
    } else if(hadc->Instance == ADC3) {
        DmaCpltFlag_EMG = 1;
    }
}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

It's a multi-task sensor, but the problem is with displaying EMG

This says to me there is no difference between connected and not connected.

Oscilloscope probes are sensitive, and usually attenuate the input. is the amplifier you are using adequate for reading by the MCU (or even working)?

Did that code ever work? That code has been cut to pieces many times while not following rules.