STM32G4 电流环闭环(二) 霍尔有感运行

目录

一、STM32G4 电流环闭环(二) 霍尔有感运行

2. 霍尔有感运行

  • 文章使用的BLDC在定子侧以互差120°电角度的位置安装三个霍尔元件Ha,Hb,Hc。当转子转动的时候霍尔元件会产生三个相位差120°电角度的高低电平信号。霍尔信号会将一个电周期划分为6个扇区,每个扇区60°电角度,通过单片机的定时器捕获可以获得每个扇区的运行时间t。为了获取准确的转子角度,点击绕组A相接电源正极,BC两相接电源负极,电子磁场与转子磁场共同作用,最终定位到转子零位点,也就是A相绕组的轴线位置。确定零点位置后,根据霍尔的信号顺序,可以得到霍尔信号与转子位置的对应关系,如下表所示:

  1. 首先配置STM32G4的Hall接口;打开STM32CUBEMX;使能TIM4,选择内部时钟,在组合通道中选择XOR ON/ HALL Sensor mode;

  2. 配置定时器参数;16分频后,TIM4的时钟为10M;

  3. 生成代码并打开Keil工程

  4. 在TIM输入捕获回调函数中添加如下代码,积分时间是10k;

  5. 其中HALL角速度计算公式:
    H a l l S p e e d = P I 3 ∗ H a l l T e m p HallSpeed = \frac{PI}{3 * HallTemp} HallSpeed=3∗HallTempPI
    H a l l T h e t a = ∫ 0 H a l l T e m p H a l l S p e e d HallTheta = \int^{HallTemp}_{0}HallSpeed HallTheta=∫0HallTempHallSpeed

  6. 在ADC注入组中断回调函数中输入,HALL传感器得到的速度和角度;在顶部添加的变量和ADC的代码修改如下

c 复制代码
/* USER CODE BEGIN PV */
#define PI					3.14159265358979f
#define PHASE_SHIFT_ANGLE (float)(220.0f/360.0f*2.0f*PI)

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 = 0;	

float load_data[5];
static 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};

uint16_t DAC_temp = 0;

float Vbus,Ia,Ib,Ic;
uint8_t Motor_state = 0;
uint16_t IA_Offset,IB_Offset,IC_Offset;
uint16_t adc1_in1, adc1_in2, adc1_in3, Vpoten, adc_vbus;
uint8_t ADC_offset = 0;
	
FDCAN_RxHeaderTypeDef RxHeader;
FDCAN_TxHeaderTypeDef TxHeader;
uint8_t RxData[8]={NULL};
uint8_t TxData[8] = {NULL};

float HallTemp = 0;
float HallThetaAdd = 0;
float HallTheta = 0;
float HallSpeed = 0;
float HallSpeedLast = 0;
float HallSpeedtest = 0;
float alpha = 0.3;
uint8_t HallReadTemp = 0;
/* USER CODE END PV */




void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
{
	static uint8_t cnt;
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hadc);
	if(hadc == &hadc1)
	{
		if(ADC_offset == 0)
		{
			cnt++;
			adc1_in1 = hadc1.Instance->JDR1;
			adc1_in2 = hadc2.Instance->JDR1;
			adc1_in3 = hadc1.Instance->JDR2;
			IA_Offset += adc1_in1;
			IB_Offset += adc1_in2;
			IC_Offset += adc1_in3;
			if(cnt >= 10)
			{
				ADC_offset = 1;
				IA_Offset = IA_Offset/10;
				IB_Offset = IB_Offset/10;
				IC_Offset = IC_Offset/10;
			}
		}
		else
		{
			HallTheta = HallTheta + HallThetaAdd;
			if(HallTheta<0.0f)
			{
				HallTheta += 2.0f*PI;
			}
			else if(HallTheta>(2.0f*PI))
			{
				HallTheta -= 2.0f*PI;
			}
			rtU.theta = HallTheta;
			rtU.SpeedFd = HallSpeed;
			adc1_in1 = hadc1.Instance->JDR1;
			adc1_in3 = hadc1.Instance->JDR2;
			adc1_in2 = hadc2.Instance->JDR1;
			Ia = (adc1_in1 - IA_Offset)*0.02197265625f;
			Ib = (adc1_in2 - IB_Offset)*0.02197265625f;
			Ic = (adc1_in3 - IC_Offset)*0.02197265625f;
			rtU.ia = Ia;
			rtU.ib = Ib;
			rtU.ic = Ic;
			FOC_Model_step();
			TIM1->CCR1 = rtY.tABC[0];
			TIM1->CCR2 = rtY.tABC[1];
			TIM1->CCR3 = rtY.tABC[2];
			load_data[0] = Ia;
			load_data[1] = HallTemp;
			load_data[2] = HallTheta;
			load_data[3] = rtU.SpeedRef;
			load_data[4] = HallSpeed;
			memcpy(tempData, (uint8_t *)&load_data, sizeof(load_data));
			HAL_UART_Transmit_DMA(&huart3,(uint8_t *)tempData,6*4);
		}
	}

  /* NOTE : This function should not be modified. When the callback is needed,
            function HAL_ADCEx_InjectedConvCpltCallback must be implemented in the user file.
  */
}
  1. 编译代码,连接设备
  2. 打开Keil的debug模式,可以试试修改速度,同时启动vofa上位机观察电流和Hall数据
  • 低速的时候跟踪的不是很好

附学习参考网址

  1. STM32G4 FOC开发实战

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

相关推荐
我的xiaodoujiao13 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 38--Allure 测试报告
python·学习·测试工具·pytest
好奇龙猫19 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
saoys19 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
电子小白12320 小时前
第13期PCB layout工程师初级培训-1-EDA软件的通用设置
笔记·嵌入式硬件·学习·pcb·layout
清风66666620 小时前
基于单片机的多传感器智能云梯逃生控制器设计
单片机·嵌入式硬件·毕业设计·智能家居·课程设计
小何code20 小时前
STM32入门教程,第10课(上),OLED显示屏
stm32·单片机·嵌入式硬件
来自晴朗的明天21 小时前
高速画板-USB模块的PCB设计5-USB2.0/3.0布局布线要求
单片机·嵌入式硬件·硬件工程
唯情于酒21 小时前
Docker学习
学习·docker·容器
clorisqqq1 天前
人工智能现代方法笔记 第1章 绪论(1/2)
人工智能·笔记
charlie1145141911 天前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++