首页 > 其他分享 >NJUPT自控第一次积分赛的小总结(二)基于simpleFOC的无刷电机控制

NJUPT自控第一次积分赛的小总结(二)基于simpleFOC的无刷电机控制

时间:2023-02-19 00:11:20浏览次数:62  
标签:编码器 电机 simpleFOC 无刷电机 motor velocity NJUPT

新人一枚,写的比较水,欢迎大佬指正!

   先说一下我用的物料与开发环境吧:

  无刷电机:makerbase的2804电机(带AS5600磁编码器)

  电机驱动板:simpleFOCmini(学校推荐的

  电池:12V锂电池

  主控:ESP32开发板

  TFT-LCD屏:ST7789驱动,SPI通信的就行(我的是240 X 240大小)

  开发环境:VS Code+platformIO插件,Arduino框架

  关于无刷电机,网上资料都非常多,我也就不多嗦了(其实我自己也不是很懂),大家上网翻找资料即可,我就简略说下我的理解。

  我买的无刷电机是带编码器的,意味着不需要自己做一个编码器。我放张我比赛用的电机照片(不带编码器),可以发现单电机是只有三相pwm输入口的,这就意味着你只能对其进行开环控制,无法实时监测电机转速与位置,因此就需要引入编码器来实现对电机的闭环控制。编码器分增量式与绝对式两种,可以参考这篇博客的解释。我这里用的是比较简单的增量式,就简要说说增量式是怎么个工作原理吧。

 

 

 

 

  首先呢,我们可以想象出电机旋转的场面,就是不停在转对吧,而们如果需要用肉眼观测电机转动的情况,就要在电机上做一个显眼的标记,比如贴个白色胶带啥的,编码器也是这样。我们在电机某个地方坐做上标记,这个标记经过编码器的"某些地方"就会输出电平信号,用来告诉我们电机转到这了。而怎么定义编码器的"某些地方"呢?我们可以想象一个圆盘,上面被一些黑色长条等分(就像一个时钟),电机的上的"标记"每经过编码器的黑色长条,编码器就会输出电平信号,因此我们就能知道电机此刻是在哪了。而如果我们要知道电机的转速的话,就等价于去求电机在某一时间段经过多少个黑色长条,因此我们只需要在程序里开个定时器记录时间就行了(有些库,比如simpleFOC是直接封装好了,直接调用api函数就能求速度)。下面放下我用的AS5600磁编码器的图片。该编码器有两种输出信号的模式,一种是iic,一种是pwm,我用的是iic,至于pwm我也不是很清楚()。因此,如果我们要知道电机的转动情况的话,需要与这个编码器建立iic通信,才能在程序中查看电机的实时参数。

 

 

  废话不多说,直接上代码:

 //变量定义   float target = 0;   MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C); //编码器为AS5600,用iic通信   BLDCMotor motor = BLDCMotor(7);//电机极对数为7   BLDCDriver3PWM driver = BLDCDriver3PWM(33,25,26,27);//控制电机转动的三相pwm输出口分别为33,25,26,其中27是Enable口

//初始化: target = 20 //电机目标转速为20 Wire.setPins(21,22); //将GPIO21、GPIO22分别设置为SDA、SCL口 Wire.begin(); sensor.init(&Wire); motor.linkSensor(&sensor); driver.voltage_power_supply = 12; //12V供电 driver.init(); motor.linkDriver(&driver); motor.foc_modulation = FOCModulationType::SpaceVectorPWM; //FOC调制类型为SVPWM motor.controller = MotionControlType::velocity;;break;//控制类型为速度控制 //PID参数 motor.PID_velocity.P = 0.2; motor.PID_velocity.I = 1.5; motor.PID_velocity.D = 0.005; motor.P_angle.P = 5.5; motor.P_angle.I = 0.0275; motor.P_angle.D = 0.0005; motor.voltage_limit = 6; motor.LPF_velocity.Tf = 0.06; //对速度低通滤波 motor.velocity_limit = 40; //速度上限 motor.voltage_sensor_align = 1; motor.init(); motor.initFOC(); //while(1)中的内容: motor.loopFOC(); motor.move(target);

 

其中一些个性化设置还是需要根据自己实际情况设置。

  对于如何学习simpleFOC库的使用,读者可以参考simpleFOC的官网:SimpleFOCproject | Home,这里有详细的教程。

  至此,我们就完成了基本的无刷电机控制,后面会说说LCD液晶屏的与lvgl库的使用(显示实时数据)

 

标签:编码器,电机,simpleFOC,无刷电机,motor,velocity,NJUPT
From: https://www.cnblogs.com/Asaka-QianXiang/p/17134058.html

相关文章

  • bldc无刷电机注意要上拉
    bldc实验实验使用的电机位:57直流无刷电机生产单位:北京时代超群型号:57BL55S06-230TF9主要参数:60W3000转24V 电机淘宝链接:https://item.taobao.com/item.htm?spm=a1......
  • NJUPT自控第一次积分赛的小总结(一)题目感受
    快开学了事情真的好多啊-_-忙完积分赛就赶紧要去复习期末了。。。线代还是依托答辩啥都不懂先看题目吧,RT,我们队(我)选择的是第一题(仅仅是因为很简单罢啦)   ......
  • a_good_idea: NJUPT-CTF
    下载文件发现是一个png图片  然用r查看属性没有任何东西,就想利用010editor打开看看,发现在末尾FFD9之后有一堆负载文件 然后就像利用binwalk和foremost试一试,......
  • simpleFOC控制无刷电机理论及实践
    目录​​前言和基础知识​​​​simplefoc​​​​无刷电机​​​​例程​​​​例程1:驱动电机固定在某一角度​​​​例程2:驱动电机在两个角度位置之间切换​​​​例程3:驱......
  • 无刷电机力矩控制模拟棘轮
    无刷电机可以通过控制力矩来实现设人机交互中的触觉反馈。下面使用灯哥开源FOC双路无刷电机控制器、ESP32开发板、无刷电机、AS5600磁编码器套件和ArduinoSimpleFOClibrar......
  • 直流无刷电机(BLDC)基础知识---TMC4671-LA
    提到直流无刷电机,那不得不提的就是有刷电机了。有刷电机有一个比较令人讨厌的缺点:那就是“吵”。因为电刷和换向环需要时刻不停地摩擦,才能给电枢供电。所以,如果你想要一......
  • esp32使用simpleFoc来接入编码器计算角度与速度
    SimpleFOC是国外无刷电机爱好者,创立的一个开源无刷电机FOC控制项目。   第1章首页(simplefoc.cn)用这个库接编码器非常简单   这是文档  编码器设置(sim......
  • 直流无刷电机和有刷电机哪个更具有优势
      直流无刷电机的特点:1、可替代直流电机调速、变频器+变频电机调速、异步电机+减速机调速;2、直流无刷电机具有传统直流电机的优点,同时又取消了碳刷、滑环结构;3、......