FOC——无刷电机的简单驱动

这篇具有很好参考价值的文章主要介绍了FOC——无刷电机的简单驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


   写这个是为了记录学习过程,为了方便日后快速理解所以话比较通俗,当然也会有些许理解错误,欢迎各位大佬指正,小弟在此感激不尽

一、什么是无刷电机?

1、长什么样?

  无刷无刷,跟有刷电机的区别就是有无电刷(电刷的作用是导电换向),在有刷电机中电刷会随着使用时间的增加逐渐磨损,所以寿命受限。
  下图里面是一种无刷电机,无刷电机分两种:外转子、内转子。图中这种如果我没理解错,应该叫外转子无刷电机?应该是的(60%确定吧)。
FOC——无刷电机的简单驱动

2、怎么工作?

  无刷电机与有刷电机不同,有刷电机是两根线(也就是一个直流电源)加合适的电压就可以转起来,而无刷电机是有三根线(A、B、C相)按照一定的规律才可以转起来
  下图可表示无刷电机的简易驱动动画(在同一时间内有两根线通的,我觉着理解为三个有刷电机的驱动,一次只用两根线,用完了再换线),如果你手速够快,手动调整通电顺序,电机也可以转起来,但是你应该做不到速度那么快,所以尝尝采用MOS管控制电路的切换
FOC——无刷电机的简单驱动
你需要知道怎么用右手螺旋定则判断磁场方向
  根据右手螺旋定则(手心握着那个定子,四指是电流方向,大拇指方向为产生的磁场方向),判断在不同通电时刻下通电相(A、B、C)产生的磁场方向。
FOC——无刷电机的简单驱动
FOC——无刷电机的简单驱动


  无刷电机中,三相星形联结的二导通方式最为常用,这里用该模型做简单分析:
FOC——无刷电机的简单驱动
  当对A、B分别施加正负电压,根据上文提到的右手螺旋定则可推断出定子产生的磁极方向如下图的右边部分所示:
FOC——无刷电机的简单驱动
  想象一下,在上面这个图中右边产生的这个磁场中,在中心点处随便放一块磁体(有N、S极),这个磁体最终的姿态应该是什么样的? 对,就是跟右边这个一样。 因为要保证这个磁场内的磁感应线方向是统一的,所以要一样。 那么如果这个随便放的磁铁是无刷电机的转子,那么这个转子就会转到这个位置,电机也就转了起来(理论上转了一丢丢)


  接着,给A、C分别施加正负电压,分析产生的新磁场,看下图:
FOC——无刷电机的简单驱动
  同理可得,转子会转到上图右边那样的位置。


  继续,给B、C分别施加正负电压,分析产生的新磁场,看下图:
FOC——无刷电机的简单驱动
  同理可得,转子会转到上图右边那样的位置。

  依次推,可以得到6种通电状态下转子的位置角度,每个状态依次相差60度,6个过程完成了无刷电机的依次完整转动。
FOC——无刷电机的简单驱动

二、试着让它转起来

1、STM32CubeMX配置

  (1)新建工程:这一块老规矩,穷,所以用stm32F103C8T6这块板子了。
  (2)配置相关功能
SYS设置
FOC——无刷电机的简单驱动


RCC设置
FOC——无刷电机的简单驱动


时钟树设置
  关于时钟树这一块不清楚可看STM32基础知识(三)-- 系统时钟RCC详解这个文章。
FOC——无刷电机的简单驱动


定时器TIM1设置
  因为要生成PWM信号,所以用定时器方便一点。此处用的TIM1属于高级定时器,由APB2负责。
FOC——无刷电机的简单驱动
FOC——无刷电机的简单驱动
FOC——无刷电机的简单驱动
FOC——无刷电机的简单驱动
FOC——无刷电机的简单驱动
  占空比在程序中进行设置,此处不设置占空比


工程输出设置
FOC——无刷电机的简单驱动
FOC——无刷电机的简单驱动
之后点击右上角的 GENERATE CODE 生成工程文件。

2、keil/Clion代码编写

  在生成的工程文件下 MDK-ARM 文件夹中点击后缀名为“.uvprojx”的文件打开工程。打开工程后先编译(保证工程代码正确)。如果出现下图情况
FOC——无刷电机的简单驱动
  按照下图更改设置即可(好像是因为高级版本多了个啥,还是用老版本好一点感觉)。
FOC——无刷电机的简单驱动
  编译通过,0 Error,0 Warning。
FOC——无刷电机的简单驱动
在main.c函数中增添代码,main.c代码如下:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/***********************************************************************************************/
//按照CubeMX中设置:APB2为72MHz,Prescaler预分频系数为36-1,Counter Period(AutoReload Register)为100-1
//可计算PWM(定时器)周期为72MHz/((36-1)+1)/((100-1)+1)=20KHz,也就是PWM(定时器)周期为0.00005s=50us

//设置PWM占空比为duty%    
#define duty 10			//高电平在一个PWM中占空比为10%,换算为时间是0.000005s=5us的高电平时间

//设置(上桥臂)PWM占空比为0
#define A0 __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0)
#define B0 __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0)
#define C0 __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,0)
//设置(下桥臂)PWM占空比为10
#define A1 __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,duty)
#define B1 __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,duty)
#define C1 __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,duty)
/***********************************************************************************************/

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

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

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

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

  /* 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_TIM1_Init();
  /* USER CODE BEGIN 2 */
	
/***********************************************************************************************/
//开启PWM输出,输出6路PWM信号
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
	
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
/***********************************************************************************************/

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
/***********************************************************************************************/
		A1;B0;C0;			//打开A上、B下、C下		关闭A下、B上、C上
		HAL_Delay(10);
		A0;B1;C0;			//打开A下、B上、C下		关闭A上、B下、C上
		HAL_Delay(10);
		A0;B0;C1;			//打开A下、B下、C上		关闭A上、B上、C下
		HAL_Delay(10);
/***********************************************************************************************/
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

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

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  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_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

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

/* USER CODE BEGIN 4 */

/* 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 */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

3、结果分析

  手上没有示波器,只有一个之前做的逻辑分析仪,接上stm32f103c8t6对应的6个引脚,对其进行逻辑分析,可以看出个大概。
  我这里用到的是PA8、PA9、PA10、PAB13、PB14、PB15:
FOC——无刷电机的简单驱动
FOC——无刷电机的简单驱动

  分析仪与stm32f103c8t6引脚对应关系如下:

D0——PA8
D1——PB13
D2——PA9
D3——PB14
D4——PA10
D5——PB15

按照

//按照CubeMX中设置:APB2为72MHz,Prescaler预分频系数为36-1,Counter Period(AutoReload Register)为100-1
//可计算PWM(定时器)周期为72MHz/((36-1)+1)/((100-1)+1)=20KHz,也就是PWM(定时器)周期为0.00005s=50us

//设置PWM占空比为duty%    
#define duty 10			//高电平在一个PWM中占空比为10%,换算为时间是0.000005s=5us的高电平时间

以及while中的

/***********************************************************************************************/
		A1;B0;C0;			//打开A上、B下、C下		关闭A下、B上、C上
		HAL_Delay(10);
		A0;B1;C0;			//打开A下、B上、C下		关闭A上、B下、C上
		HAL_Delay(10);
		A0;B0;C1;			//打开A下、B下、C上		关闭A上、B上、C下
		HAL_Delay(10);
/***********************************************************************************************/

中的设置,理论上一个PWM的周期为50us,PWM中高电平信号时间为50us*10%=5us。

  查看逻辑分析仪中的时间:
FOC——无刷电机的简单驱动
FOC——无刷电机的简单驱动
  对照着逻辑分析仪查看不同端口的输出电平状态:
初始时刻

/ A B C
上桥臂 1(PA8) 0(PA9) 0(PA10)
下桥臂 0(PB13) 1(PB14) 1(PB15)

FOC——无刷电机的简单驱动

延迟10ms

/ A B C
上桥臂 0(PA8) 1(PA9) 0(PA10)
下桥臂 1(PB13) 0 (PB14) 1(PB15)

FOC——无刷电机的简单驱动

延迟10ms

/ A B C
上桥臂 0(PA8) 0(PA9) 1(PA10)
下桥臂 1(PB13) 1(PB14) 0(PB15)

FOC——无刷电机的简单驱动

参考的资料

1.有刷电机与无刷电机的区别,就是这么简单明了
2.一文看懂有刷电机与无刷电机的工作原理及区别
3.【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术文章来源地址https://www.toymoban.com/news/detail-495796.html

到了这里,关于FOC——无刷电机的简单驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 直流无刷电机FOC控制算法 理论到实践 —— 实践

    关于直流无刷电机FOC控制算法的理论章节,本人已经在前两章进行过详细说明,大家可以自行进行阅读,请务必了解过理论之后再来学习如何具体进行实现。 直流无刷电机FOC控制算法 理论到实践 —— 理论(一) 直流无刷电机FOC控制算法 理论到实践 —— 理论(二) 本章节

    2023年04月11日
    浏览(52)
  • 直流无刷电机FOC控制算法 理论到实践 —— 理论(一)

    说明:图片素材来源于网络 1.1 FOC由来 什么是FOC? FOC英文全程为 field-oriented control ,即 磁场定向控制 ,也称之为 矢量控制 ,主要应用于直流无刷电机的控制,通过此控制算法可以实现对直流无刷电机的精确控制。 那么怎样才能称之为精确控制,FOC和普通的六步换相控制有

    2024年02月02日
    浏览(49)
  • 直流无刷电机FOC控制算法 理论到实践 —— 理论(二)

    上一章节:FOC直流无刷电机控制算法 理论到实践 —— 理论(一) 下一章节:直流无刷电机FOC控制算法 理论到实践 —— 实践 说明:部分图片素材来源于网络 续上一章: FOC直流无刷电机控制算法 理论到实践 —— 理论(一)(点击跳转) 下一章: 直流无刷电机FOC控制算法 理

    2024年02月07日
    浏览(46)
  • STM32实现FOC直流无刷BLDC电机-外围电路

    永磁同步电机和无刷直流电机(BLCD)具有更高效、运行更安静、扭矩波动小、响应速度快、更可靠等优点,正用于越来越多的应用,替代直流有刷电机。尽管结构不同,但所有三相永磁电机(BLDC、PMSM或PMAC)都是由脉冲宽度调制(PWM)的三相桥(三个半桥)驱动,以便采用频

    2024年01月16日
    浏览(53)
  • stm32 滑膜观测器+PLL 锁相环 FOC 无感无刷电机控制

            上一期为大家介绍了滑膜观测器正反切的应用案例,收到不少小伙伴的反馈是否有PLL的案例,大概看了一下网上的资料,讲理论的很多,能转化成源码的几乎没有。前半年工作和家里的事情都比较多,一拖再拖,终于在6月将源码调试好了,在这里跟大家分享一下调试

    2024年02月10日
    浏览(52)
  • 【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(3)-FOC控制原理矢量控制

    无刷电机是矢量控制,是交流电机调速的核心,也是Foc控制的核心 以下内容学习自【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术 以电流闭环控制为例,也就是让电机始终产生一个恒定的力矩(也就是恒定的电流,因为力矩和电流成正比) 可以看到控制器的输入是最左边

    2024年02月02日
    浏览(85)
  • 直流无刷电机驱动的PWM频率

    针对ESCON伺服驱动器: https://support.maxongroup.com/hc/en-us/articles/360020442720-ESCON-PWM-input-frequency-PWM-output-frequency- Impact of the PWM input frequency? Please be aware that the PWM input frequency in use also determines how fast updated set values can be identified and processed because one period has to measured before the PWM duty cy

    2023年04月08日
    浏览(33)
  • 【电机应用控制】——直流无刷电机&驱动原理&有感闭环控制&无感闭环控制

    ​ 目录 前言 一、概述 二、驱动原理 ​编辑 三、(有感)速度闭环控制 四、无感控制(无位置传感器) 四、(无感)速度闭环控制 总结 声明:学习笔记来自正点原子B站教程,仅供学习交流!! 简介:         直流无刷电机(BLDC)是指无电刷和换向器的电机,又称无

    2024年02月16日
    浏览(41)
  • 直流无刷电机及Matlab/Simulink驱动仿真

    系列文章将更新直流无刷电机的工作原理、仿真控制以及应用STM32开发板与驱动板完成对直流无刷电机的实际控制。 直流无刷电机(Brushless Direct Current Motor,BLDC)没有了直流有刷电机的电刷及换向器等结构,线圈绕组不参与旋转而是作为定子,永磁体作为转子,通过控制线圈

    2024年02月05日
    浏览(86)
  • 无刷电机控制基础(2)——有感和无感驱动、调速

    上一篇文章我们讲了一些无刷电机的基础知识,包括无刷电机的内部结构,驱动原理等,我们知道了只需要按照转子的当前位置,来按顺序给定子线圈通电,就能让电机转动起来。 但是,上一篇中我们跳过了一个关键步骤,就是如何检测转子的位置。本篇我们就讲讲常用的位

    2024年01月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包