自制无感无刷电机驱动板

自制无感无刷电机驱动板


分别测试了基于C251的STC32G单片机、Arduino AVR的ATmega328PB、以及ARM的ST32F103单片机。

  • 🧲测试转动效果
  • ✒目前市面上开源的有关无刷电机的项目数不胜数,其控制原理都大同小异,在没有领透其技术要领情况下,关键是找到一个合适自己的,资料齐全的,有针对性的学习。
  • ✨学习资料阅读推荐《无感无刷直流电机之电调设计全攻略

  • 🎉现成的无感无刷驱动测试资料来源:

  • 📓STC三相无刷电机驱动-STC32G-无HALL资料地址 : https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7472&extra=page%3D1

  • 📍ATmega328PB移植可以参考 ATmega8 MK 电调开源程序 V0.42 版:https://svn.mikrokopter.de/websvn/listing.php?repname=BL-Ctrl&path=%2Ftags%2FV0.42%2F&#a4bfcc0886576e3118d94460220fa558a

  • ATmega328PB相关移植参考文章:https://www.amobbs.com/thread-4652868-1-1.html
  • 👉 如果自制驱动板,推荐还是和控制芯片集成到一起,因为需要连接的线比较多,连接不稳定容易出问题。
  • 📍ST32F103无感无刷驱动资料来源参考
  • 🔖匠心科技BLDC开发板资料
c 复制代码
链接:https://pan.baidu.com/s/1s5YjzRSDLKQvl86lBVAqKA?pwd=a6cx
提取码:a6cx

***** 解压密码:JXKJ_RALDNW
  • 🔖本论坛的BLDC驱动程序资料:https://blog.csdn.net/snail_dongbin/article/details/82803076
c 复制代码
链接:https://pan.baidu.com/s/1uXD7UBV3R_NEV85zf-jmZg?pwd=7esq 
提取码:7esq
  • 🔬使用无感驱动程序,配合自制电机驱动板,在开环测试下没有问题。
  • 📑个人自制无刷电机驱动板原理图
  • PCB其它相关功能还未测试,最终PCB电路还未正式确认,暂时没有开源发布出来。
c 复制代码
链接:https://pan.baidu.com/s/1jxZzWpBFSaQAJqjUw6hTgQ?pwd=o5q7 
提取码:o5q7
  • 🍁初稿原理图
  • 🌿由于驱动板没有集成MCU,在使用时,需要根据个人使用的单片机,进行相关代码的移植。
🌼驱动程序说明
  • 📍基于STC32G单片机的驱动程序:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1822&highlight=bldc&page=1&extra=#pid11784
  • 使用STC32G驱动程序,在开环低速测试没有问题,在开启PID功能调试模式不行,PID参数没有调整好。
  • 🌿Arduino 328PB开环测试程序

🥕仅供测试使用,这是让无感无刷电机强制转起来。主要用于验证基本驱动电路是否正常。如果需要使用328P驱动可以参考:德国MK项目BLDC电调项目,详见上面的相关链接。

c 复制代码
#include "Arduino.h"

int AA1=3;
int AA2=5;
int BB1=11;
int BB2=10;
int CC1=9;
int CC2=6;

int enable=2; //This is not used for now, The ESC is always enabled
int emfA=A0;
int emfB=A1;
int emfC=A2;

int fase=1;
int deltaA=0;
int emA=0;
int sum=0;

int IN=A3;
unsigned int Delay=3600;

int it=0;
int it2=1;

static int delta= 0;
static int Lastdelta= -1;

unsigned long previousMicros = 0;

void setup() {
	Serial.begin(9600);
	pinMode(AA1,OUTPUT);
	pinMode(AA2,OUTPUT);
	pinMode(BB1,OUTPUT);
	pinMode(BB2,OUTPUT);
	pinMode(CC1,OUTPUT);
	pinMode(CC2,OUTPUT);

	pinMode(enable,OUTPUT);

	pinMode(IN,INPUT);
	pinMode(emfA,INPUT);
	pinMode(emfB,INPUT);
	pinMode(emfC,INPUT);

  //digitalWrite(enable,HIGH);
  //previousMillis = micros();

}

void loop() {


	int emA = analogRead(emfA);
	int emB = analogRead(emfB);
	int emC = analogRead(emfC);
	int sum = (emA+emB+emC)/3;

	unsigned long currentMicros = micros();
	if(currentMicros - previousMicros >= Delay){

		previousMicros += Delay;

		//Phase1 C-B
		switch(fase){
		case 1:
		  digitalWrite(AA1,LOW);
		  digitalWrite(AA2,LOW);
		  digitalWrite(BB1,LOW);
		  digitalWrite(CC2,LOW);
		  digitalWrite(BB2,HIGH);
		  digitalWrite(CC1,HIGH);
		  delta = emA-sum;

		  break;


		//Phase2 A-B
		case 2:
		  digitalWrite(AA2,LOW);
		  digitalWrite(BB1,LOW);
		  digitalWrite(CC1,LOW);
		  digitalWrite(CC2,LOW);
		  digitalWrite(AA1,HIGH);
		  digitalWrite(BB2,HIGH);
		  delta = emC-sum;
		  break;

		//Phase3 A-C
		case 3:
		  digitalWrite(AA2,LOW);
		  digitalWrite(BB1,LOW);
		  digitalWrite(BB2,LOW);
		  digitalWrite(CC1,LOW);
		  digitalWrite(CC2,HIGH);
		  digitalWrite(AA1,HIGH);
		  delta = emB-sum;
		break;

		//Phase4 B-C
		case 4:
		  digitalWrite(AA1,LOW);
		  digitalWrite(AA2,LOW);
		  digitalWrite(BB2,LOW);
		  digitalWrite(CC1,LOW);
		  digitalWrite(BB1,HIGH);
		  digitalWrite(CC2,HIGH);
		  delta = emA-sum;
		  break;

		//Phase5 B-A
		case 5:
		  digitalWrite(AA1,LOW);
		  digitalWrite(BB2,LOW);
		  digitalWrite(CC1,LOW);
		  digitalWrite(CC2,LOW);
		  digitalWrite(AA2,HIGH);
		  digitalWrite(BB1,HIGH);
		  delta = emC-sum;
		  break;

		//Phase6 C-A
		case 6:
		  digitalWrite(AA1,LOW);
		  digitalWrite(BB1,LOW);
		  digitalWrite(BB2,LOW);
		  digitalWrite(CC2,LOW);
		  digitalWrite(CC1,HIGH);
		  digitalWrite(AA2,HIGH);
		  delta = emB-sum;
		  break;
		}

		if (Lastdelta < 0)
		{
		  if (delta > 0)
		  {
			  Lastdelta=delta; //save the last delta
			  fase= fase + 1;
			  if (fase > 6) {
				  fase = 1;
			  }
		  }
		}//Zero cross from - to +

		if (Lastdelta > 0)
		{
		  if (delta < 0)
		  {
			Lastdelta=delta;
			fase= fase + 1;
			if (fase > 6) {
			  fase = 1;
			  }
		  }
		}//Zero cross from + to -

  }//Case ends

  int t =analogRead(IN); //From the potentiometer
//  Delay=map(t,0,1024,1,1000); //we obtain the delay speed using the potentiometer
  //we map the values from 1 to 1000 microseconds
  Serial.println(t);


} //loop ends
  • 🌿使用匠心科技BLDC相关资料中的stm32f103,无感无刷驱动程序,完全适配的上个人自制的驱动板,并且可以很平稳的驱动转起.来。具体资料详见上面链接。里面的驱动部分关键实现也是参考了德国MK电调项目相关内容。

🔰其他相关内容学习参考

  • 🌿对应无感无刷电机驱动,换相检测电路检测部分计算,可以进一步阅读:https://blog.csdn.net/qq_41100189/article/details/119832506

  • 🔖后续有新内容在补充更新。