本文较长,内容较多,几乎把前几节Arduino UNO的例程重新演示一遍,为缩小篇幅,各示例演示步骤写的稍微粗略,大家可先熟悉前几节的关于simpleFOC的操作后再看本节。新手可分多次学习,循序渐进。
==================================
本文于2021.9.2更新,
增加对新设计的电路板的支持,修改各个演示程序的IO口,使得本节示例可以同时在bluepill和SimpleMotor上运行。
==================================
以前淘宝上十二三块钱一个,非常便宜,至于为什么叫Bluepill,谁给起的这个名字就不清楚了。
Arduino IDE编译STM32有好几种程序下载模式,本篇以串口下载为例。
如下图,Boot1始终接低电平0,Boot0接0时为正常工作模式,接1时为串口下载模式。
如下图,本人测试时发现虽然Boot0接高电平,但不能进入串口下载模式,检查后发现是电阻阻值不匹配,R3R4应该是串联在Boot0和Boot1引脚的限流电阻,阻值过大,导致上拉无效不能进入串口下载模式,可更换为1K-10K范围的电阻。
Arduino IDE兼容STM32有多种方法可以实现,以下为本人最熟悉的一种,
https://github.com/rogerclarkmelbourne ,下载Arduino_STM32,这个是支持STM32开发板的硬件文件。
下载后解压,修改文件名为“Arduino_STM32”放到Arduino IDE的安装文件下,
关闭Arduino IDE后重新打开,会发现开发板增加许多类型,选择STM32F103C系列,
注意上面这两步的配置,本节之后的所有程序都会在这两个配置下演示。
以上安装好了示例和库文件,下面安装编译器。点击 工具—>开发板—>开发板管理器,
什么是SAM?SAM是Arduino上使用的微控制器的体系结构,为使用SAM体系结构微控制器的Arduino板提供支持的软件包称为“Arduino SAM板”。由下图可以看出SAM应该是支持Cortex-M3的软件包。
等待安装完毕,STM32的编译器和库文件就全部安装好了。
◆3.1.1、硬件清单
序号 | 名称 | 数量 |
---|---|---|
1 | Bluepill | 1 |
2 | USB转串口 | 1 |
3 | 5V电源 | 1 |
也可以直接从USB转TTL取电5V,不过这样有时会不稳定,所以最好用手机充电器外部供电。
3.1.2、硬件连接
或者
◆3.2.1、选择STM32配置
◆3.2.2、打开示例
◆3.2.3、修改代码
◆3.2.4、连接最小系统板,boot0的跳线帽接高电平1,然后按下复位键,STM32进入串口下载模式,
◆3.2.5、验证上传
◆3.2.6、程序上传有时会提示上传成功,但实际并没有成功,上传时留意必须有进度显示才会上传成功。
◆3.2.7上传成功后,把boot0的跳线帽恢复到低电平0,然后按下复位键。观察LED是否每隔一秒亮灭一次,
◆4.1.1、硬件清单
序号 | 名称 | 数量 |
---|---|---|
1 | Bluepill | 1 |
2 | USB转串口 | 1 |
3 | 5V电源 | 1 |
4 | 带磁编码器的云台电机 | 1 |
如下图所示:
带编码器电机购买链接:淘宝购买
◆4.1.2、硬件连接
本例程演示I2C_1读取AS5600角度,
编码器VCC接3.3V,
或者
◆4.2.1、打开示例
◆4.2.2、先确定 “工具—>开发板”为“Generic STM32F103C8T series”;
直接编译会报错,提示SDA和SCL没有定义,打开提示错误的文件"MagneticSensorI2C.h"(提示中包含这个文件的路径),简单修改如下:
修改后可永久保留,再编译Arduino UNO好像不受影响。
◆4.2.3、再编译上传;复位重启;转动电机观察角度输出。此时串口显示为电机累计转动角度(单位rad)和瞬时速度。
◆5.1.1、硬件清单
序号 | 名称 | 数量 |
---|---|---|
1 | Bluepill | 1 |
2 | USB转串口 | 1 |
3 | 5V电源 | 1 |
4 | 带磁编码器的云台电机 | 2 |
如下图所示:
◆5.1.2、硬件连接
本例程演示两个硬件I2C的操作,I2C_1和I2C_2分别读取AS5600角度,
编码器VCC接3.3V,
或者
◆5.2.1、打开示例
◆5.2.2、修改程序
直接用官方示例,下载运行后串口没有输出,并且板载LED一直闪烁,应该是程序跑飞了。官方程序不能直接用,也可能是创作者的版本和我的不一样。
◆5.2.3、编译上传;复位重启;分别转动两个电机观察角度输出。此时串口显示为两个电机的累计转动角度(单位rad)。
注意:主程序中有200ms延时,所以转动电机的时候速度不能太快,否则会导致角度累加错误。
本人在调试Bluepill的过程中主要遇到两个问题:
◆ 第一是I2C_2读写AS5600角度的问题,查找资料后很简单的就解决了,上面《双I2C读取编码器》;
◆ 第二是按照官方示例驱动电机时,电机会产生啸叫声并且控制精度非常低。查找原因发现PWM引脚输出频率只有550Hz,测试了几个示例都是同样的现象。通过对代码运行追踪,找到问题并修改底层驱动代码。
本节实验涉及修改底层代码PWM输出。
◆6.1.1、硬件清单
序号 | 名称 | 数量 |
---|---|---|
1 | Bluepill | 1 |
2 | SimpleFOCShield V2.0.3 | 1 |
3 | USB转串口 | 1 |
4 | 带磁编码器的云台电机 | 1 |
5 | 5V电源 | 1 |
6 | 12V电源 | 1 |
如下图所示:
SimpleFOCShield V2.0.3购买链接:某宝购买
带编码器电机购买链接:某宝购买
◆6.1.2、硬件连接
或者
◆6.2.1、修改底层代码
直接在示例上修改为Bluepill应用,电机运行效果非常差,示波器查看PWM,频率只有550Hz(72M/2/65536);用示例bluepill_position_control,也是同样的问题;连专门针对bluepill的示例都有问题,我怀疑是文件版本不对,仔细看了创造者的文档,没有发现关于bluepill的特别说明。总之当前的问题应该在PWM操作上。
⑴、在Arudino IDE中安装simpleFOC的标准库以后,库文件和示例默认安装在“文档”文件夹,
⑵、跟踪PWM的初始化函数“driver.init(); ”程序并没有按照预期的调用“stm32_mcu.cpp”中的子程序,而是调用了”generic_mcu.cpp”中的子程序,可以看到_configure3PWM函数中什么都没有做,
路径:此电脑\文档\Arduino\libraries\Simple_FOC\src\drivers\hardware_specific
图片中所用软件为 sublime,查看代码非常方便,推荐大家使用
⑶、在“generic_mcu.cpp”修改这两个地方,
pinMode(PA0, PWM);
pinMode(PA1, PWM);
pinMode(PA2, PWM);
Timer2.pause();
Timer2.setPrescaleFactor(8); // 72/8=9MHz
Timer2.setCompare(TIMER_CH1, 0);
Timer2.setCompare(TIMER_CH2, 0);
Timer2.setCompare(TIMER_CH3, 0);
Timer2.setOverflow(359); //9M/360=25kHz
Timer2.refresh();
Timer2.resume();
pwmWrite(pinA, 360.0*dc_a);
pwmWrite(pinB, 360.0*dc_b);
pwmWrite(pinC, 360.0*dc_c);
⑷、保存后关闭,底层代码修改完毕。
⑸、电机控制应该是PWM中央对齐模式,但是找到最最底层也没有这个设置,所以暂且这样用着,
◆6.2.2、打开示例
◆6.2.3、修改代码
◆6.2.4、编译上传,设置电机速度,观察电机运转
◆6.3.1、打开示例
◆6.3.2、修改代码
◆6.3.3、编译上传,设置电机角度,观察电机运转。
电机初始化以后会突然转动一下,大概半圈或者一圈,这个是为了角度归零,这个问题会在《移植》中解决。
◆7.1.1、硬件清单
序号 | 名称 | 数量 |
---|---|---|
1 | Bluepill | 1 |
2 | SimpleFOCShield V2.0.3 | 2 |
3 | USB转串口 | 1 |
4 | 带磁编码器云台电机 | 2 |
5 | 5V电源 | 1 |
6 | 12V电源 | 1 |
如下图所示:
SimpleFOCShield V2.0.3购买链接:淘宝购买
带编码器电机购买链接:淘宝购买
◆7.1.2、硬件连接
操作之前建议先看下《SimpleFOC(五)—— 双电机控制》这篇文章,
(1)、两个驱动板堆叠连接,背面跳线,M1接9、5、6、8,M2接3、10、11、7。
(3)、Bluepill接线
(4)、接线
两个编码器AS5600接3.3V,Bluepill和驱动板之间要共地,
或者
void _configure3PWM(long pwm_frequency,const int pinA, const int pinB, const int pinC) {
pinMode(PA0, PWM);
pinMode(PA1, PWM);
pinMode(PA2, PWM);
Timer2.pause();
Timer2.setPrescaleFactor(8); // 72/8=9MHz
Timer2.setCompare(TIMER_CH1, 0);
Timer2.setCompare(TIMER_CH2, 0);
Timer2.setCompare(TIMER_CH3, 0);
Timer2.setOverflow(359); //9M/360=25kHz
Timer2.refresh();
Timer2.resume();
pinMode(PA6, PWM);
pinMode(PA7, PWM);
pinMode(PB0, PWM);
Timer3.pause();
Timer3.setPrescaleFactor(8); // 72/8=9MHz
Timer3.setCompare(TIMER_CH1, 0);
Timer3.setCompare(TIMER_CH2, 0);
Timer3.setCompare(TIMER_CH3, 0);
Timer3.setOverflow(359); //9M/360=25kHz
Timer3.refresh();
Timer3.resume();
return;
}
◆7.2.2、打开示例
◆7.2.3、修改代码
◆7.2.4、编译上传,串口设置指令,观察电机运转。
指令“A”表示电机1,指令“B”表示电机2,比如设置电机1速度为10rad/s:A10,设置电机2速度为20rad/s:B20。
双电机控制演示视频(bluepill):https://www.bilibili.com/video/BV1Wy4y1g7Ly/
双电机控制演示视频(SimpleMotor):https://www.bilibili.com/video/BV1Mh411s7oY/
◆8.1.1、硬件清单
序号 | 名称 | 数量 |
---|---|---|
1 | Bluepill | 1 |
2 | USB转串口 | 1 |
3 | 5V电源 | 1 |
4 | 带AS5047P的云台电机 | 1 |
如下图所示:
◆8.1.2、AS5047P介绍
- 14bit精度
- ABI接口输出最高1000ppr
- 最高支持28Krpm转速
◆8.2.1、打开示例
◆8.2.2、修改程序
◆8.2.3、编译上传;复位重启;转动电机观察角度输出。
此时串口显示为电机累计转动角度(单位rad)和瞬时速度。
实际测试,AS5047P读出角度波动比较大,性能与价格非常不匹配,在当前芯片紧缺的背景下,这很有可能是A货,用这款芯片一定要保证货源
◆9.1.1、硬件清单
序号 | 名称 | 数量 |
---|---|---|
1 | Bluepill | 1 |
2 | PowerShield V0.2 | 1 |
3 | USB转串口 | 1 |
4 | AS5047P电机 | 1 |
5 | 5V电源 | 1 |
6 | 24V电源 | 1 |
如下图所示:
带编码器电机购买链接:淘宝购买
◆9.1.2、硬件连接
⑴AS5047P的VCC接3.3V,
⑵PB6/PB7/PB8分别接在PowerShield V0.2的5/9/6引脚,
⑶PB5做为使能控制,用1转3的排线接在PowerShield V0.2的4/7/8引脚,
关于PowerShield V0.2的详细介绍请看《SimpleFOC(六)—— PowerShield和AS5047P》,
先不要着急给24V上电,使用大功率电机,一定要非常小心!
◆9.2.1、修改底层代码
路径:此电脑\文档\Arduino\libraries\Simple_FOC\src\drivers\hardware_specific\generic_mcu.cpp
void _configure3PWM(long pwm_frequency,const int pinA, const int pinB, const int pinC) {
pinMode(PB6, PWM);
pinMode(PB7, PWM);
pinMode(PB8, PWM);
Timer4.pause();
Timer4.setPrescaleFactor(8); // 72/8=9MHz
Timer4.setCompare(TIMER_CH1, 0);
Timer4.setCompare(TIMER_CH2, 0);
Timer4.setCompare(TIMER_CH3, 0);
Timer4.setOverflow(359); //9M/360=25kHz
Timer4.refresh();
Timer4.resume();
return;
}
◆9.2.2、打开示例
◆9.2.3、修改代码
◆9.2.4、编译上传,设置电机转速,观察电机运行。
速度闭环模式的演示视频:https://www.bilibili.com/video/BV1ow411d76a/
◆9.3.1、打开示例
◆9.3.2、修改代码
◆9.3.3、编译上传,设置角度,观察电机运转。
位置闭环模式的演示视频:https://www.bilibili.com/video/BV1XU4y157kV/
我感觉效果不是很好,有点转不到位的样子,不知道是PID参数设置的不合适还是因为PWM不能设置中央对齐模式。
这篇文章太长了,程序上还有难点,花费了将近一个月的时间。
有人觉得用keil就够了,用Arduino IDE调试STM32多此一举,而且从调试的过程来看,Arduino IDE对STM32的兼容做的也不够好。但是我觉得用C++编写单片机代码的理念很先进,应该是未来的发展方向。
(完)
欢迎加入simpleFOC技术交流群:923734429 (入群申请写:CSDN)
请继续阅读相关文章:
SimpleFOC(一)—— 简介(附有文件下载链接)
SimpleFOC(二)—— 快速入门 (开环控制)
SimpleFOC(三)—— AS5600角度读取
SimpleFOC(四)—— 闭环控制
SimpleFOC(五)—— 双电机控制
SimpleFOC(六)—— PowerShield和AS5047P
SimpleFOC(八)—— 理论+实践 深度分析SVPWM