STM32G4 电机外设篇(二) VOFA + ADC + OPAMP

目录

  • [一、STM32G4 电机外设篇(二) VOFA + ADC + OPAMP](#一、STM32G4 电机外设篇(二) VOFA + ADC + OPAMP)
      • [1 VOFA](#1 VOFA)
        • [1.1 VOFA上位机显示波形](#1.1 VOFA上位机显示波形)
      • [2 ADC](#2 ADC)
        • [2.1 用ADC规则组对板载电压和电位器进行采样](#2.1 用ADC规则组对板载电压和电位器进行采样)
      • [3 OPAMP(运放)](#3 OPAMP(运放))
        • [3.1 结合STM32内部运放和ADC来完成对三相电流的采样](#3.1 结合STM32内部运放和ADC来完成对三相电流的采样)
        • [3.2 运放电路分析](#3.2 运放电路分析)
    • 附学习参考网址

一、STM32G4 电机外设篇(二) VOFA + ADC + OPAMP

1 VOFA

1.1 VOFA上位机显示波形
  • 通讯协议
    1. JustFoat 只上传浮点数,0000807f结尾
      因为用DMA传输数据,更快
    2. FireWater 只用printf实现,比较慢
  • 这里选用第一种方式来实现
  • 打开之前文章生成的Keil
    在/* USER CODE BEGIN PV */中添加如下代码
c 复制代码
extern DMA_HandleTypeDef hdma_usart3_tx;
uint8_t DataB1[32] = "LED1 Toggle\r\n";
uint8_t DataB2[32] = "LED2 Toggle\r\n";
uint8_t DataB3[32] = "LED1 and LED2 open\r\n";

#define RXBUFFERSIZE 256
char RxBuffer[RXBUFFERSIZE];
uint8_t aRxBuffer;
uint8_t Uart1_Rx_Cnt;

float temp[1];
static uint8_t tempData[8] = {0, 0, 0, 0, 0, 0, 0x80, 0x7F};

在 /* USER CODE BEGIN WHILE */中添加如下代码

c 复制代码
while(1)
{
	temp[0] += 0.01f;
	if(temp[0] > 6.28f)
	{
		temp[0] = 0;
	}
	// printf("%f\r\n",temp[0]);
	memcpy(tempData, (uint8_t *)&temp, sizeof(temp));
	HAL_UART_Transmit_DMA(&huart3, (uint8_t *)tempData, 8);
	HAL_Delay(1);
}
  • 按照之前的文章进行接线,然后编译下载程序
  • 打开vofa+,按照图片操作连接串口,点击控件按钮,拖入左侧表格控件,右键添加Y轴数据,滚轮调整图标,就可以获得如图所示波形
  • 可以用这个软件的一些其它控件来调整电机的Kp Ki,做出一个电机的控制窗口

2 ADC

2.1 用ADC规则组对板载电压和电位器进行采样
  • ADC是整个电机控制中非常重要的外设,涉及到母线电压(VBUS)和三相电流的采样,这两者直接作用于电机控制的FOC环路,直接影响电机的运行稳定

  • ADC的分类

    1. SAR ADC
    2. sigma delta ADC
    • 前者是逐次逼近的方法测值的,更快;后者是多次叠加的方法测量的,更加精准
  • ADC有单端输入和差分输入模式,差分输入模式在sigma delta ADC使用的更多,此处选择单端输入

  • 配置ADC1和ADC2时钟四分屏,12bit精度和右对齐

  • ADC1和ADC2使能规则组转换

  • 点击生成代码,打开Keil工程
    在/* USER CODE BEGIN 2 */中添加如下代码

c 复制代码
 /* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer, 1);
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);//自校验,减少采样误差
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);
 /* USER CODE END 2 */
  • 在/* USER CODE BEGIN PV */中修改
c 复制代码
float temp[2];
static uint8_t tempData[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x7F};
/* USER CODE END PV */
  • 在/* USER CODE BEGIN WHILE */中修改
c 复制代码
while(1)
{
	HAL_ADC_Start(&hadc1);
	HAL_ADC_Start(&hadc2);
	temp[0] = HAL_ADC_GetValue(&hadc1);
	temp[1] = HAL_ADC_GetValue(&hadc2) * 0.02094726f; //根据分压电阻计算
	memcpy(tempData, (uint8_t *)&temp, sizeof(temp));
	HAL_UART_Transmit_DMA(&huart3, (uint8_t *)tempData, 12);
	HAL_Delay(1);
   }
   /* USER CODE END WHILE */
  • VBUS在采样的时候一般要增加低通滤波器,电机在旋转的时候,母线电容一直处于充放电状态,大负载启动的时候,会有瞬时的母线电压补到母线电容中会导致波动,后面的实验会增加这个滤波器
  • 编译下载程序
  • 打开vofa上位机,复位开发板,连接上位机,实际效果如图所示

3 OPAMP(运放)

3.1 结合STM32内部运放和ADC来完成对三相电流的采样
  • 打开之前的stm32cubemx项目

  • 使能三个运放

    1. standalone模式,增益是外置的(选这个)
    2. follower 跟随模式
    3. PGA 可编程增益模式,增益可以用软件更改
  • 使能两个ADC中断

  • ADC配置,使能采样通道,使能注入组

  • 点击生成代码,打开Keil软件

  • 使能运放,在112行左右插入代码

c 复制代码
  /* USER CODE BEGIN 2 */
  HAL_OPAMP_Start(&hopamp1);
  HAL_OPAMP_Start(&hopamp2);
  HAL_OPAMP_Start(&hopamp3);
  • 在 /* USER CODE BEGIN WHILE */的while循环中插入如下代码
c 复制代码
HAL_ADCEx_InjectedStart_IT(&hadc1);
HAL_ADCEx_InjectedStart_IT(&hadc2);//使能规则组转换,并产生注入组中断
  • 在USER CODE 4中添加如下代码
c 复制代码
//注入中断处理程序
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
{
	/*Prevent unused argument(s)compilation warning */
	UNUSED (hadc);
	
	if(hadc == &hadc1)
	{
		temp[2] = hadc1.Instance->JDR1;
		temp[2] = (temp[2]-0x7ef)*0.193359375f;
		temp[3] = hadc1.Instance->JDR2;
		temp[3] = (temp[3]-0x7ef)*0.193359375f;
	}
	if(hadc == &hadc2)
	{
		temp[4] = hadc1.Instance->JDR1;
		temp[4] = (temp[4]-0x7ef)*0.193359375f;
	}
}
3.2 运放电路分析
  • R58,R59 作用是为了输入的正向端和负向端输入阻抗匹配
  • R52,R53 为分压电阻,作用是将输入正向端电压正向偏置1.65V
  • R56与 R59 形成负反馈增益,运放整体增益计算如下
  • 虚断:OP1_VINP 输入电压为 Vin;
  • 虚短:
    V i n R 59 = V o u t R 59 + R 56 \frac{Vin}{R59} = \frac{Vout}{R59 + R56} R59Vin=R59+R56Vout
    增益 G a i n = V o u t V i n = 1 + R 56 R 59 增益Gain = \frac{Vout}{Vin} = 1 + \frac{R56}{R59} 增益Gain=VinVout=1+R59R56

  • 修改Temp数组为5大小,修改DMA传输24bit
  • 编译下载程序,实验结果如下

附学习参考网址

  1. STM32G4 FOC开发实战
  2. SAR ADC和sigma delta ADC的区别-CSDN博客
  3. 【运放2】如何理解运放的虚短虚断,他们有啥用?_哔哩哔哩_bilibili

欢迎大家有问题评论交流 (* ^ ω ^)

  • 如果板子有时候没反应就把电源都拔了重新接线上电,说不定就好了QAQ
相关推荐
蓝斯4971 天前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
熙芯XiChip1 天前
硬实时与软实时RTOS核心区别
嵌入式硬件
伟大的前程1 天前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工1 天前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip1 天前
CAN与CANopen的本质区别
单片机
lilihewo1 天前
Altium Designer 封装库的创建(分享pcb 3D封装库)
嵌入式硬件·51单片机
神罚天下ET1 天前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
碧海银沙音频科技研究院2 天前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
Zevalin爱灰灰2 天前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥2 天前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5