基于stm32F103HAL库+cubemx+freertos无感无刷电机BLDC控制程序开发

最近在做一个舵机控制项目,控制对象为大功率无感无刷电机,网上搜遍了资源,貌似这方面的资源真得十分匮乏。大部分资源都是有关带霍尔传感器或者光电编码器的。可能是因为无感无刷电机的应用场景比较窄的原因。
把野火的《电机应用开发实战指南—基于STM32》读了一遍,有点小失望。老实说刘火良老师写的内容值得一个大大的赞,但是有关无感无刷电机的控制方法涉及甚少。又把网友奉为圣经的《无感无刷直流电机之电调设计全攻略》读了几遍(怒本人愚钝,读一遍确实如坠云里雾里)。这篇文章确实不错,把无感无刷直流电机电调设计的方方面面讲的通透。基于这篇文章的思想,我们项目组开发了一款无感无刷电调。闲话少叙,请看正文。
一、cubemx系统配置
1、配置sys,将Debug框选择“Serial Wire”,系统时基选择“TIM7”,如图1所示。

2、时钟配置。先设置RCC模式,将HSE和LSE都设置为“Cristal/Ceramic Resonator”。

3、配置ClockConfiguration,如图3.

3、驱动电路采用经典的“全桥六臂电路”,上半桥臂采用pwm控制,用于电机调速,配置TIM1的CH1、CH2、CH3的PWM输出,如图4、图5所示。


4、下半桥臂三个引脚配置为推挽输出,如图6

5、配置用于反向电动势零点检测的EXTI中断引脚,如图7.

6、点击生成代码,系统自动生成的代码略过不提。
二、无感无刷电调核心代码

**
1、正如《无感无刷直流电机之电调设计全攻略》一文中所讲的那样,无感无刷直流电机控制最核心的两点,一是起动控制,二是过零点检测。文中对德国MK项目代码的启动流程、启动算法进行了透彻分析。这里我就不再班门弄斧了。感兴趣的朋友可以看原文。我这里直接改造成了hal库版本:

 unsigned char Anwerfen(unsigned char pwm)
{// DISABLE_SENSE_INT;HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);DrivePWMValue=pwm;      while(1){Starter_startertimer-= Starter_startertimer/15+1;if(Starter_startertimer < 25) return 1; Starte_Zero++;Starte_Zero %= 6;zero_alter();vTaskDelay(pdMS_TO_TICKS(Stater_statertimer));}
}
  注意MK项目起动控制比较高明的地方一是采用指数曲线加速,二是完全关闭外部中断,采用定时器换向。

2、zero_alter()即为换向程序:

 void Zero_alter(void)
{ switch(State_Zero){case 5:    TIM1->CCR1=0;              //AB->ACTIM1->CCR3 = DrivePWMValue;                     TIM1->CCR2=0;HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14 | GPIO_PIN_15,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); break;case 1:TIM1->CCR2=0;              //AC->BCTIM1->CCR2 =  DrivePWMValue;                   TIM1->CCR3=0;HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15 | GPIO_PIN_14,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); break;case 3:TIM1->CCR1=0;               //BC->BATIM1->CCR2 =  DrivePWMValue;                      TIM1->CCR3=0;HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13 | GPIO_PIN_14,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);     break;case 2:TIM1->CCR2=0;              //BA->CATIM1->CCR1 =  DrivePWMValue;                   TIM1->CCR3=0;HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14 | GPIO_PIN_13,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);   break;case 6:TIM1->CCR2=0;//CA->CBTIM1->CCR1 =  DrivePWMValue;                   TIM1->CCR3=0;HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13 | GPIO_PIN_15,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);          break;case 4:TIM1->CCR2=0; //CB->ABTIM1->CCR3 =  DrivePWMValue;                   TIM1->CCR1=0;HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13 | GPIO_PIN_15,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);   break;default:break;}
}

程序按照《攻略》一文中的图24的换向原理,编写了程序,结合图片查看更清晰。
3、外部中断控制程序:

State_Zero=(GPIOA->IDR&0x0038)>>3;Zero_alter();counter_DiretionConvert++;if(__HAL_GPIO_EXTI_GET_IT(EXTI_LINE_4)!=RESET)__HAL_GPIO_EXTI_CLEAR_IT(EXTI_LINE_4);

4、主程序
freertos中的任务控制程序代码:

void StartTaskStarterControlTask(void *argument)
{/* USER CODE BEGIN StartTaskStarterControlTask *//* Infinite loop */for(;;){switch(StartCommand){case eCMD_START_READY:DrivePWMValue = 0;HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1|TIM_CHANNEL_2|TIM_CHANNEL_3);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13 | GPIO_PIN_14| GPIO_PIN_15,GPIO_PIN_RESET);HAL_NVIC_DisableIRQ(EXTI3_IRQn);HAL_NVIC_DisableIRQ(EXTI4_IRQn);HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);statertriggerflag=true;staterruntigflag=true;break;case eCMD_START_START:Anwerfen(50);State_Zero++;DrivePWMValue = 5;Stater_statertimer=300;StartCommand=eCMD_START_RUN;break;case eCMD_START_RUN:if(staterruntigflag==true){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_NVIC_EnableIRQ(EXTI3_IRQn);HAL_NVIC_EnableIRQ(EXTI4_IRQn);HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);staterruntigflag=false;}//打开PWM,电机启动             DrivePWMValue =200;break;case eCMD_START_STOP:DrivePWMValue = 0;HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1|TIM_CHANNEL_2|TIM_CHANNEL_3);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13 | GPIO_PIN_14| GPIO_PIN_15,GPIO_PIN_RESET);HAL_NVIC_DisableIRQ(EXTI3_IRQn);HAL_NVIC_DisableIRQ(EXTI4_IRQn);
HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);statertriggerflag=true;staterruntigflag=true;break;default:return;  }   vTaskDelay(20);}/* USER CODE END StartTaskStarterControlTask */
}

注意此处程序运用了状态切换,将无刷电机的状态定义为4种:eCMD_START_READY、eCMD_START_START、eCMD_START_RUN、eCMD_START_STOP,其中的核心代码段位eCMD_START_START、eCMD_START_RUN,参照了攻略的思想,尤其是起动中的pwm值调整。
5、另外,本文对《攻略》中的宏定义也进行了整理,此处一并贴出:

#define  STEUER_A_H {TIM1->CCR1=0;TIM1->CCR3=DrivePWMValue;TIM1->CCR2=0;}
#define  STEUER_B_H {TIM1->CCR1=0;TIM1->CCR2 = DrivePWMValue; TIM1->CCR3=0;}
#define  STEUER_C_H {TIM1->CCR2=0; TIM1->CCR1 = DrivePWMValue; TIM1->CCR3=0;}#define  STEUER_A_L {HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13 | GPIO_PIN_14,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET); }
#define  STEUER_B_L {HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13 | GPIO_PIN_15,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET); }
#define  STEUER_C_L {HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14 | GPIO_PIN_15,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); }#define SENSE_A {HAL_NVIC_EnableIRQ(EXTI3_IRQn);HAL_NVIC_DisableIRQ(EXTI4_IRQn);HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);}
#define SENSE_B {HAL_NVIC_EnableIRQ(EXTI4_IRQn);HAL_NVIC_DisableIRQ(EXTI3_IRQn);HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);}
#define SENSE_C {HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);HAL_NVIC_DisableIRQ(EXTI3_IRQn);HAL_NVIC_DisableIRQ(EXTI4_IRQn);}

三、写在后面的话
由于电机的磁极对数、电阻、电感参数不一,应用场景和负载也不尽相同,本文的参数不一定适合您的项目,需要结合项目实际,细心的调整,去探索无感无刷直流电机控制的深邃与神秘。

基于stm32F103HAL库+cubemx+freertos无感无刷电机BLDC控制程序开发相关推荐

  1. stm32无感无刷电机——电位器转速控制

    前言 在上一讲我们讲了无感无刷电机控制的算法,其中我们通过按键的方式来控制启停和速度控制.在这一讲我们将为大家讲解如何使用电位器来控制无感无刷电机转速的变化. 在这一讲中我们主要涉及以下几个功能,按键 ...

  2. diy无感无刷电机霍尔安装_新型无感无刷电机驱动的制作方法

    本实用新型涉及,具体为新型无感无刷电机驱动. 背景技术: 无刷直流电机由电动机主体和驱动器组成,是一种典型的机电一体化产品.无刷电机是指无电刷和换向器(或集电环)的电机,又称无换向器电机.早在十九纪诞 ...

  3. 基于ESO的永磁同步电机无感FOC 采用线性扩张状态观测器(LESO)估计电机反电势,利用锁相环从反电势中提取位置和转速信息

    基于ESO的永磁同步电机无感FOC 1.采用线性扩张状态观测器(LESO)估计电机反电势,利用锁相环从反电势中提取位置和转速信息,从而实现无位置传感器控制: 2.提供算法对应的参考文献和仿真模型. 购 ...

  4. 可充电三合一无感无刷电机筋膜枪MCU方案/PCBA方案设计

    概述 泛海微可充电三合一无感无刷电机筋膜枪MCU方案/PCBA方案设计无刷电机筋膜枪也称深层肌筋膜冲击仪,它是一种软组织康复工具,利用其内部特制的高速电机来带动"枪头",产生高频的 ...

  5. diy无感无刷电机霍尔安装_无刷电机之无感方案控制难点解析

    无刷无感控制在实际应用中极为广泛,人们对它的研究也尤为以久,它的控制难点主要有两点:第一,电机的启动:第二,转子位置的检测. 对于高压无感方案来讲,除了软件上的难点之外,硬件设计也不容忽视,如硬件设计 ...

  6. diy无感无刷电机霍尔安装_51 MCU,BLDC有感无感全开源,轻松实践直流无刷电机控制(程序+电路详解)...

    上封帖子介绍了51单片机,JMT18F003PLUS,提供了芯片例程和资料,链接如下: JMT18F003PLUS单片机芯片手册,例程等资料下载 http://www.51hei.com/bbs/dp ...

  7. 灵动微基于 MM32SPIN040C 为主控的无感方波水泵应用方案

    水泵是一种运输液体或增压液体的机器.将原动机的机械能或其他外部动能量传递给液体,提高液体动能,主要用于运输含水.油.酸碱液.乳化液.悬乳液和液体金属的液体. 介绍一款适用于水泵的32位单片机--MM3 ...

  8. 灵动微电子MM32SPIN0280无感方波BLDC电动工具硬件参考设计

    灵动微电子M32SPIN0280是灵动微电机新推出的针对电机控制市场的专用MCU,MM32SPIN0280系列MCU适用于各类电机应用场景,其典型应用包括风机.水泵.电动自行车.服务器风机.吊扇.电动 ...

  9. diy无感无刷电机霍尔安装_从工作原理来了解意大利Brusatori无刷电机

    2020年12月16日 15:39   来源: 东莞索菲特自动化设备有限公司    >>进入该公司展台 意大利Brusatori无刷电机工作原理介绍如下: 无刷直流电动机是采用半导体开关器 ...

最新文章

  1. “你行你上”:有本事跟OpenAI Five打一把DOTA?| 极客头条
  2. R语言ggplot2可视化:通过水平半小提琴图和抖动数据点可视化雨云图(Rain Cloud plots)、自定义雨云图中数据点的颜色(数据点的颜色和半小提琴图一致)
  3. spring实现模板文件下载
  4. java锁实现_Java锁实现
  5. C点滴成海------Dev C++怎么修改成简体中文
  6. UE4手册中文翻译速查表
  7. jy61 树莓派_用Linux树莓派来读取JY61的串口数据
  8. java jdomxml 换行_jdom处理的XML Document 和String 之间的相互转化
  9. 狄利克雷过程(Dirichlet Process)
  10. Docker的核心概念镜像Images, 容器Containers, 数据卷Volumes
  11. dreamweaver网页设计作业制作 学生个人网页单页 WEB静态网页作业模板 大学生个人主页博客网页代码 dw个人网页作业成品
  12. 放大镜css图标,CSS放大镜的制作
  13. Frechlet Inception Distance(FID)快速入门、使用、代码
  14. 第四范式战疫侦察三部曲:追踪、筛查、推演 提升疫情防控能力
  15. Arch yaourt 安装
  16. 对N行N列二维数组的每一行排序,偶数行(0当作偶数)由小到大排序,奇数行由大到小排序
  17. java归并排序详解
  18. 引用腾讯视频 php代码,调用腾讯视频播放器APi代码
  19. 信息安全行业从业者----鱼龙混杂也藏龙卧虎
  20. weex 使用指南和坑

热门文章

  1. 漫画网站服务器,漫画网站服务器配置
  2. 看过的觉得好的TED演讲(Update@21/04/18)
  3. 三国志13pk版登录武将输入中文名方法与更改图像详解
  4. 《流浪地球2》票房突破18亿
  5. 开奖计算---五星直选复式
  6. 2020-Android-大厂面试(五)插件化、模块化,不同层级的Android开发者的不同行为
  7. (循环练习)海军礼炮问题
  8. 开学季值得买的蓝牙耳机有哪些?适合学生党买的平价蓝牙耳机
  9. TS流压縮音频的自动增益控制方法
  10. IM后台开发六之群聊接口实现