自制无感无刷电机驱动板

自制无感无刷电机驱动板


分别测试了基于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开发板资料
链接:https://pan.baidu.com/s/1s5YjzRSDLKQvl86lBVAqKA?pwd=a6cx
提取码:a6cx

***** 解压密码:JXKJ_RALDNW
  • 🔖本论坛的BLDC驱动程序资料:https://blog.csdn.net/snail_dongbin/article/details/82803076
链接:https://pan.baidu.com/s/1uXD7UBV3R_NEV85zf-jmZg?pwd=7esq 
提取码:7esq
  • 🔬使用无感驱动程序,配合自制电机驱动板,在开环测试下没有问题。
  • 📑个人自制无刷电机驱动板原理图
  • PCB其它相关功能还未测试,最终PCB电路还未正式确认,暂时没有开源发布出来。
链接: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电调项目,详见上面的相关链接。

#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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/621240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第六节笔记及作业----Lagent AgentLego 智能体应用搭建

关于 Agent 的相关理论 大语言模型存在一些局限性&#xff0c;比如会出现幻觉问题、有时效性问题以及可靠性问题。智能体的定义是具备感知、决策和行动能力的实体。智能体主要由感知部分、大脑部分和动作部分组成。智能体有多种类型&#xff0c;如 ReAct 类型&#xff08;侧重…

5.10.8 Transformer in Transformer

Transformer iN Transformer (TNT)。具体来说&#xff0c;我们将局部补丁&#xff08;例如&#xff0c;1616&#xff09;视为“视觉句子”&#xff0c;并将它们进一步划分为更小的补丁&#xff08;例如&#xff0c;44&#xff09;作为“视觉单词”。每个单词的注意力将与给定视…

智慧党建小程序源码系统 源码全开源支持二次开发 带完整的安装代码包以及搭建部署教程

源码系统概述 智慧党建小程序源码系统是一款基于微信小程序开发的党建管理工具&#xff0c;它集党员管理、党费收缴、活动组织、信息发布等功能于一体&#xff0c;实现了党建工作的全面数字化。该系统采用先进的云计算和大数据技术&#xff0c;支持多平台、多终端访问&#xff…

J-STAGE (日本电子科学与技术信息集成)数据库介绍及文献下载

J-STAGE (日本电子科学与技术信息集成)是日本学术出版物的平台。它由日本科学技术振兴机构&#xff08;JST&#xff09;开发和管理。该系统不仅包括期刊&#xff0c;还有论文集&#xff0c;研究报告、技术报告等。文献多为英文&#xff0c;少数为日文。目前网站上所发布的内容来…

二.基础篇: 面向对象进阶

1. 基础篇语法篇&#xff1a;一.基础篇&#xff1a;基础语法-CSDN博客 面向对象进阶 本章主要学习内容&#xff1a; static继承包&#xff0c;final&#xff0c;权限修饰符&#xff0c;代码块抽象类接口多态内部类 1. static static翻译过来就是静态的意思static表示静态&am…

家用洗地机哪款最好用?附热门洗地机品牌推荐,看完这篇不踩坑

随着技术的不断发展&#xff0c;现在的洗地机功能已经越来越强大了&#xff0c;它可以高效的扫地、拖地、不用手动清洗滚刷&#xff0c;甚至有些中高端型号还能边洗地边除菌&#xff0c;远程操控自清洁&#xff0c;简直就是家居清洁的小能手&#xff01;那么&#xff0c;家用洗…

‘vue-cli-service‘ is not recognized as an internal or external command解决方案

vue-cli-service is not recognized as an internal or external command, operable program or batch file.解决方案 先进行 &#xff1a; npm install -g vue/cli 命令安装vue cli 是必须的。 如果 npm run build 还是报错 遇到同样的提示&#xff1a; 这时候先安装依赖 np…

深入理解与应用C++ Vector

1. C Vector 简介与基本使用 C 的 vector 是一个序列容器&#xff0c;用于表示可变大小的数组。它结合了数组的高效元素访问和动态大小调整的灵活性。与静态数组相比&#xff0c;vector 的大小可以根据需要自动调整&#xff0c;这是通过在底层使用动态数组来实现的。当新元素被…

返回倒数第K个节点(C语言)———链表经典算法题

题目描述​​​​​​&#xff1a;面试题 02.02. 返回倒数第 k 个节点 - 力扣&#xff08;LeetCode&#xff09;&#xff1a; 答案展示: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/int kthToLast(struct Li…

娱乐营销的新玩法:Kompas.ai如何让内容更加趣味化

在数字化时代&#xff0c;内容营销已成为品牌与消费者沟通的重要桥梁。然而&#xff0c;随着信息的爆炸式增长&#xff0c;用户的注意力越来越分散&#xff0c;传统的营销方式已经难以吸引用户的兴趣。在这种背景下&#xff0c;娱乐营销应运而生&#xff0c;它通过将娱乐元素融…

2023年30米分辨率土地利用遥感监测数据

改革开放以来&#xff0c;中国经济的快速发展对土地利用模式产生了深刻的影响。同时&#xff0c;中国又具有复杂的自然环境背景和广阔的陆地面积&#xff0c;其土地利用变化不仅对国家发展&#xff0c;也对全球环境变化产生了深刻的影响。为了恢复和重建我国土地利用变化的现代…

R语言:GSEA分析

#安装软件包 > if (!requireNamespace("BiocManager", quietly TRUE)) install.packages("BiocManager") > BiocManager::install("limma") > BiocManager::install("org.Hs.eg.db") > BiocManager::install("…

【回溯 栈 代数系统 动态规划】282. 给表达式添加运算符

本文涉及知识点 回溯 栈 代数系统 动态规划 LeetCode 282. 给表达式添加运算符 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target &#xff0c;在 num 的数字之间添加 二元 运算符&#xff08;不是一元&#xff09;、- 或 * &#xff0c;返回 所有 能够得到 ta…

C++深度解析教程笔记8

C深度解析教程笔记8 第17课 - 对象的构造&#xff08;上&#xff09;类定义中成员变量i和j的初始值&#xff1f;实验-成员变量的初始值对象初始化解决方案1实验-手动调用函数初始化对象对象初始化解决方案2&#xff1a;构造函数实验-构造函数小结 第18课 - 对象的构造&#xff…

File类~路径、创建文件对象

路径分为相对路径&#xff08;不带盘符&#xff09;&#xff0c;绝对路径&#xff08;带盘符&#xff09; 路径是可以存在的&#xff0c;也可以是不存在的 创建文件对象的三个方法&#xff1a;

QT设计模式:策略模式

基本概念 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列方法&#xff0c;并使它们可以相互替换。策略模式使得算法可以独立于客户端而变化&#xff0c;使得客户端可以根据需要选择相应的算法。 策略模式通常由以下角色组…

使用非官网购买Chatgpt的api调用

测试代码 from openai import OpenAI client OpenAI(api_key用户密钥) import json import os import timeclass ChatGPT:def __init__(self, user):self.user userself.messages [{"role": "system", "content": "Agent"}]def as…

每周一算法:传递闭包

题目描述 不等式排序 给定 n n n个变量和 m m m个不等式。其中 n n n小于等于 26 26 26&#xff0c;变量分别用前 n n n 的大写英文字母表示。 不等式之间具有传递性&#xff0c;即若 A > B A>B A>B 且 B > C B>C B>C&#xff0c;则 A > C A>C …

linux下的进程通信

进程通信 进程为什么需要通信呢&#xff1f;进程通信的技术背景进程通信本质 进程通信分类管道匿名管道pipe匿名管道原理管道特点 命名管道创建命名管道命名管道原理 System V IPC管道与 System V的区别共享内存函数ftok()shmget() shmat()shmdt()shmctl()删除共享内存System V…

【笔记】EF_PNN获取及运营商名称显示(待完善)

问题背景 当设备无法成功解析EONS(PNN)的值(即SIM卡EF文件内容),则会用次优先级的NITZ去refresh了SPN。(问题代码如下,是通过Phone对象拿到plmn为空) 运营商名称一般显示优先级:Eons > NITZ > XML OPL id 0 对应的是PNN第一条 功能逻辑 (定制)当卡中的spn为空…