如何正确使用HAL STM32G4内部运放

HAL STM32G4内部运放的使用


  • 📍相关篇《HAL STM32G4 +ADC手动触发采集+各种滤波算法实现》
  • 🎈《HAL STM32G4 +TIM1 3路PWM互补输出+VOFA波形演示》
  • ✨继欧拉电子无刷电机驱动相关视频学习,STM32G4内部运放的使用。主要是为了采集无刷电机,三相MOS管驱动端,下端MOS管的电流采样。

  • 🍁内部运放电路与外部电路连接参考


  • 🌿电流计算公式:
  • R58.R59作用是为了输入的正向端和负向端输入阻抗匹配;R52,R53为分压电阻,作用是将输入正向端电压正向偏置1.65V; R56与R59形成负反馈增益.

  • 三相电路采样电路:
  • 🌿设计参考:ST文件《AN5397: Current Sensing in motion control applications》(第十页):https://www.st.com/content/st_com/zh/search.html#q=AN5397-t=resources-page=1
  • 📝代码完善

    -🌿main程序

    float temp[5];
    uint8_t TempData[24] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x7F}; //vofa+ float数据流显示格式
    int main(void)
    {
        /* USER CODE BEGIN 1 */
        // float temp[5];
        //	uint8_t TempData[12];//16  ADC:12;PWM:16 OPM:24
    
        /* 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();
    
        /* USER CODE BEGIN SysInit */
    
        /* USER CODE END SysInit */
    
        /* Initialize all configured peripherals */
        MX_GPIO_Init();
        MX_DMA_Init();
        MX_USART1_UART_Init();
        MX_ADC1_Init();
        MX_ADC2_Init();
        MX_OPAMP1_Init();
        MX_OPAMP2_Init();
        MX_OPAMP3_Init();
        /* USER CODE BEGIN 2 */
    
        //HAL_UART_Receive_IT(&huart3,(uint8_t *)&aRxBuffer,1);
    
        HAL_OPAMP_Start(&hopamp1);	//使能内部运放功能
        HAL_OPAMP_Start(&hopamp2);
        HAL_OPAMP_Start(&hopamp3);
    
        HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);//ADC自校验
        HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
        /* USER CODE END 2 */
    
        /* Infinite loop */
        /* USER CODE BEGIN WHILE */
        while(1) {
            /* USER CODE END WHILE */
    
            /* USER CODE BEGIN 3 */
            HAL_ADC_Start(&hadc1);
            HAL_ADC_Start(&hadc2);
            HAL_ADCEx_InjectedStart_IT(&hadc1);
            HAL_ADCEx_InjectedStart_IT(&hadc2);
            //Vstep = Vref(3.3) / 4095=8.056mV
            temp[0] = HAL_ADC_GetValue(&hadc1) * 8.056f; //ADC1.AIN11->PB12
            temp[1] = HAL_ADC_GetValue(&hadc2) * 8.056f; //ADC2.AIN1->PA0
            memcpy(TempData, (uint8_t*)temp, sizeof(temp));
            HAL_UART_Transmit_DMA(&huart1, (uint8_t *)TempData, 24);
            HAL_Delay(50);
    
            //	temp[0]=HAL_ADC_GetValue(&hadc1);
            //	temp[1]=HAL_ADC_GetValue(&hadc2)*0.02094726f;
    
        }
        /* USER CODE END 3 */
    }
    
  • 🌿ADC中断回调
  • void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
    {
        UNUSED(hadc);
        if(hadc == &hadc1) {
            temp[2] = hadc1.Instance->JDR1;
            temp[2] = (temp[2] - 0x7ef) * 0.193359375f;//0x7ef:1.65偏置电压对应的模拟值
            temp[3] = hadc1.Instance->JDR2;
            temp[3] = (temp[3] - 0x7f5) * 0.193359375f;
        }
        if(hadc == &hadc2) {
            temp[4] = hadc2.Instance->JDR1;
            temp[4] = (temp[4] - 0x7e8) * 0.193359375f;
        }
    
    }
    

    📚程序资料

  • 🔖原理图资料,但是不是视频中的原理图。
  • 链接: https://pan.baidu.com/s/1MaD5y-A9-BfKF9wfpH-Zcw?pwd=n63f 
    提取码: n63f
    
  • 🔖仅供个人学习参考。
  • 链接:https://pan.baidu.com/s/1dSGNdU5NFTHDcuc57QFzkA?pwd=0xel 
    提取码:0xel
    

    作者:perseverance52

    物联沃分享整理
    物联沃-IOTWORD物联网 » 如何正确使用HAL STM32G4内部运放

    发表回复