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

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

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

  无刷电机: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库的使用(显示实时数据)

 


__EOF__

本文作者Asaka
本文链接https://www.cnblogs.com/Asaka-QianXiang/p/17134058.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Akasa  阅读(333)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示