[教程]开源电调VESC在Win7 64bit下开发环境的搭建(失败)

经过一周多的查找资料和尝试,VESC开源电调在Window下的开发环境搭建最后还是失败了。
主要问题有:原作者没有对windows下的开发提供教程支持(他本人一直使用Linux)、原作者6年前用的Eclipse插件现在已不被支持、硬件上SWD接口不能成功连接(原因未知)。
因此我最后卡在了“硬件SWD不能连接”,如果日后发现是bootloader软件关闭了该引脚,也许会再尝试弄一下 ?。

为什么要弄这个?

为什么要弄这个

我想从电调入手,从电机控制算法开始学习控制算法的知识。学习控制应该是需要软硬件结合的,而电机+电调板的组合是占用空间最小的硬件了吧。

VESC是什么?

在网上搜“open source esc stm32”得到第一个结果就是VESC(简介:https://vedder.se/tag/stm32-esc/ ,固件项目: https://github.com/vedderb/bldc ),中文名“本杰明电调”,因为作者叫Benjamin Vedder。这个是最流行的开源电调项目(可能是因为硬件比较稳定且功率够大——持续50A、峰值240A电流,电机芯片是TI的Drv8302,支持100%占空比输入,意味着无论PWM周期是20ms还是20us,都能输出100%占空比,电机性能可以做的很好——别家如英飞凌的芯片可没有这么好。题外话了 ?),可以用来改装滑板。

硬件准备

  1. VESC电调一个、小BLDC一个(找同学要了个精灵3的2312电机,不要螺旋桨)、3S/12V航模电池、ST-Link V2:烧录器需要用ST-Link V2,因为作者用eclipse开发,烧录器的.cfg文件他已经指定为这个;如果要用JLink可能涉及一些文件的修改,咱也不懂,那就买一个吧。
  2. stm32f103rbt6核心板一个、ST-Link V2:这个是看到国外一巴西小哥的视频里用了这个板子和ST-Link来验证他的开发环境(vscode),刚好我手上也有,就拿出来了(事实证明这个硬件最后验证了我的软件环境搭建步骤是没问题的)。
    debug时可以添加断点和查看寄存器值

软件准备

  1. IDE方案1:SW4STM32(win_64bits_v2.9):基于Eclipse、专为STM32优化的跨平台免费开发环境(http://www.openstm32.org);比起Eclipse好处是它安装完就自带编译工具链(arm-none-eabi啥的,我也不懂),不用另外下载编译工具链、手动添加路径到系统变量PATH什么的。
  2. IDE方案2:vscode_v1.36.1(编辑器)+ARM_v0.5.0(插件)+C/C++_v0.24.0(插件)+Cortex-Debug_v0.3.1(插件):https://code.visualstudio.com 、OpenOCD_0.10.0:http://openocd.org 、巴西小哥视频中用到的另外几个安装包:MSYS2(为了在vscode里面使用bash和make):https://mega.nz/#!u94zCQpD!iTKJ7NljQraQdEE2A4OqQFz7UJgLJf7l0skq769L6MY 、GNU_ARM工具链:https://mega.nz/#!3wgDCKqR!-dOLUNWbuOaVlmd2o4p4RKOYQ48BWJqBi_wIoqSKuUE
  3. 代码1:vesc开源电调代码:https://github.com/vedderb/bldc
  4. 代码2:巴西小哥的闪灯例程:https://mega.nz/#!DlQyRRgb!H9KzeY3BchlRCG_jmcA6j6J2WT_jFKZczUJmZ1_ex3w
    这里之所以有2套IDE和2份代码,是因为搭建环境进行得不顺利,编译和烧录都存在一定的问题,所以会有交叉验证IDE和代码的过程。最后的结果是:vscode的IDE方案2证实是正确可用的

IDE方案2的验证

按照上一小节的IDE方案2搭建好软件环境后,在vscode下编译和烧录闪灯例程到stm32f103核心板,可以看到上面的红色LED在闪;并且main.c里可以添加断点、查看寄存器值、查看变量值(仅十进制,没有十六进制)。
具体步骤如下:

  1. 下载vscode并安装,然后在里面搜索并安装以下插件:ARM、C/C++、Cortex-Debug;三个vscode插件
  2. 解压MSYS2和GNU_ARM到某个路径(解压就算安装完了);解压闪灯例程;
  3. 安装OpenOCD;
  4. 添加以下5个路径到系统变量PATH(具体路径视解压位置而定):D:\openocd-0.10.0\bin;D:\GNU_MSYS_WIN32\usr\bin;D:\GNU_MSYS_WIN32\mingw32\bin;D:\GNU_ARM_STM32\bin;D:\GNU_ARM_STM32\arm-none-eabi\bin
  5. 下面开始验证IDE是否正确可用:
    打开vscode,文件->打开工作区,选择aula4.code-workspace:打开这个
  6. 然后打开终端(终端->新建终端),输入bash,回车,就会变成下图(如果效果和下面不一样,请检查MSYS路径是否成功添加到PATH,因为这个操作是在执行D:\GNU_MSYS_WIN32\usr\bin下的bash.exe):示范
  7. 然后在这个bash终端下输入make,回车,得到以下输出表示成功编译出.elf文件:示范
  8. ST-Link V2连接核心板,然后插上电脑(记得是自动安装驱动的,如果驱动有问题,就去ST官网下载对应工具,里面有驱动:https://www.st.com/en/development-tools/st-link-v2.html);
  9. 回到vscode,输入make flash,回车,即可完成烧录(如果有问题,应该是芯片被锁住了,解决方法看后面):示范闪灯程序
  10. 至此为止,vscode下闪灯例程的编译与烧录就顺利完成了;
  11. 不过debug功能更重要,vscode下debug要怎么做呢?
  12. vscode左边栏点击debug插件,再点击绿色小箭头,即进入debug状态:进入debug

硬件的坑

上面通过一个小的例程说明用vscode搭配插件的方式,是可以编译makefile工程的。
经过多次尝试(包括用keil/ST-Link Utility),最后确定该环境的确可以编译github下载的bldc工程,但是ST-Link连接不上VESC电调板导致下载和调试不能继续进行(具体原因未知)。

软件的坑

这里指的是IDE的坑。
原作者在2012年给出他在Ubuntu下安装eclipse和插件的教程:http://vedder.se/2012/12/debugging-the-stm32f4-using-openocd-gdb-and-eclipse/ ,后面没有更新过,也没有windows下的教程。

  1. eclipse的运行需要依赖java环境:上java官网下载jdk或者jre,解压安装,然后手动把bin路径添加到PATH,和添加JAVA_HOME变量,否则eclipse不能正常运行;比如我这里给PATH添加:D:\jdk-12.0.1_windows-x64_bin\jdk-12.0.1\bin,然后JAVA_HOME是:D:\jdk-12.0.1_windows-x64_bin\jdk-12.0.1\bin
  2. 需要用的zylincdt插件已不支持新版eclipse,只支持4.1~4.4以及部分4.5版本(参考:https://www.cnblogs.com/goodhx/p/6036387.html ),而我第一个下载的版本是最新的4.12.0,所以在eclipse marketplace找不到。网上说有手动输入网址可以在线安装的方法,结果出现错误,当时以为是自己新版eclipse不会配置,就想换用教程对应的4.4吧;
  3. 重新下载4.4版eclipse之后,再去marketplace也找不到zylincdt插件;这次用在线安装的方法,发现可能因为网址搬走了,没安装成功;SR2即为Eclipse v4.4
  4. 然后呢,对java环境也有要求(不知是VESC代码工程还是eclipse软件的要求):要用jre7_32bit的环境才行(64位会有问题;jdk8_64位也不行,其他版本没试过);

所以干脆不考虑eclipse了,转至vscode来弄,后来又了解到为STM32优化的基于eclipse的IDE:SW4STM32,就把这两个都试了一下。

  1. SW4STM32很顺利的成功编译了VESC工程,但电调SWD接口有问题,无法验证烧录功能是否也正常;同时它对闪灯示例工程的编译出现错误,无法编译通过,也无法验证烧录功能;编译出错

没有写出来的细节

除了绊脚的坑,还有一些需要注意的细节需要说明一下:

  1. 闪灯示例中,手动更改头文件包含路径:如图所示位置
  2. 可以通过修改.json文件实现打开软件时自动执行bash命令,省去每次打开工程都要手动输入bash:在这里插入图片描述
  3. 查资料过程中发现:OpenOCD从0.9.0开始默认通过ST-Link的RST引脚对MCU产生复位信号,这是为了满足低功耗MCU调试的需要;一般情况下并不需要这个功能(在.cfg文件最后添加一段代码即可:https://github.com/chaosAD/ST-Link-SWD-No-SRST/wiki/Disabling-the-ST-Link-SRST
  4. 烧录器如果从ST-Link V2换成JLink或者其他,至少需要修改.cfg文件(至于还有没有其他文件要改就不清楚了,所以尽量只用ST-Link):在这里插入图片描述

作者:Maple_Leaf_15
来源:CSDN
原文:https://blog.csdn.net/Maple_Leaf_15/article/details/96275140
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 9
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
/* This file is part of AutoQuad ESC32. AutoQuad ESC32 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. AutoQuad ESC32 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with AutoQuad ESC32. If not, see . Copyright © 2011, 2012 Bill Nesbitt */ /* * pwm.c文件.此文件有2个功能,2个功能分别使用,不能同时使用 * 1、pwm in输入模式,pwm输入中断里,调用runNewInput函数 * 2、one wire通讯协议,pwm输入中断里,调用owEdgeDetect函数,来输入新的数据,调用owReset函数来复位1wire通讯 * */ #include "pwm.h" #include "timer.h" #include "run.h" #include "main.h" #include "ow.h" #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" #include "misc.h" static int16_t pwmMinPeriod; //timer1 ch1 pwm 输入最小周期 static int16_t pwmMaxPeriod; //timer1 ch1 pwm 输入最大周期 int16_t pwmMinValue; //timer1 ch2 pwm 输入最小周期 static int16_t pwmMaxValue; //timer1 ch2 pwm 输入最大周期 int16_t pwmLoValue; int16_t pwmHiValue; int16_t pwmMinStart; volatile uint32_t pwmValidMicros; //关闭输入捕获比较中断 1和2 void pwmIsrAllOff(void) { PWM_TIM->DIER &= (uint16_t)~(TIM_IT_CC1 | TIM_IT_CC2);//关闭中断 } //开启输入捕获比较中断 1和2 void pwmIsrAllOn(void) { PWM_TIM->CCR1; PWM_TIM->CCR2; PWM_TIM->DIER |= (TIM_IT_CC1 | TIM_IT_CC2);//允许捕获比较 1 2中断 } //开启捕获比较2中断 void pwmIsrRunOn(void) { uint16_t dier = PWM_TIM->DIER; dier &= (uint16_t)~(TIM_IT_CC1 | TIM_IT_CC2); dier |= TIM_IT_CC2;//允许捕获/比较2中断 PWM_TIM->CCR1; PWM_TIM->CCR2; PWM_TIM->DIER = dier; } //timer 1 void pwmInit(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; pwmSetConstants(); // TIM1 channel 1 pin (PA.08) configuration GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO;_InitStructure); // Enable the TIM1 global Interrupt NVIC_InitStructure.NVIC_IRQChannel = PWM_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC;_InitStructure); TIM_TimeBaseStructInit(&TIM;_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = (PWM_CLK_DIVISOR-1); TIM_TimeBaseStructure.TIM_Period = 0xffff; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIM, &TIM;_TimeBaseStructure); TIM_ICInitStructure.TIM_Channel = PWM_CHANNEL; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(PWM_TIM, &TIM;_ICInitStructure); // Select the TIM Input Trigger: TI1FP1 // 滤波后的定时器输入1(TI1FP1) TIM_SelectInputTrigger(PWM_TIM, TIM_TS_TI1FP1); // Select the slave Mode: Reset Mode TIM_SelectSlaveMode(PWM_TIM, TIM_SlaveMode_Reset);//复位模式 // Enable the Master/Slave Mode TIM_SelectMasterSlaveMode(PWM_TIM, TIM_MasterSlaveMode_Enable); // TIM enable counter TIM_Cmd(PWM_TIM, ENABLE); pwmIsrAllOn(); } //timer1 TIM1_CC_IRQHandler中断 void PWM_IRQ_HANDLER(void) { uint16_t pwmValue; uint16_t periodValue; uint8_t edge; edge = !(PWM_TIM->SR & TIM_IT_CC2); periodValue = PWM_TIM->CCR1; //IO 输入PA8 周期 pwmValue = PWM_TIM->CCR2; //IO 输入(但是没有看到配置了使用哪个IO做为输入了) 脉宽长度 // look for good RC PWM input if (inputMode == ESC_INPUT_PWM && //PWM输入模式 periodValue >= pwmMinPeriod && periodValue = pwmMinValue && pwmValue <= pwmMaxValue //脉宽长度 ) { if (edge == 0) { pwmValidMicros = timerMicros; runNewInput(pwmValue); //PWM正确.输入 } } } void pwmSetConstants(void) { float rpmScale = p[PWM_RPM_SCALE]; pwmMinPeriod = p[PWM_MIN_PERIOD] = (int)p[PWM_MIN_PERIOD];//PWM最小周期 timer1 ch1 pwmMaxPeriod = p[PWM_MAX_PERIOD] = (int)p[PWM_MAX_PERIOD];//PWM最大周期 timer1 ch1 pwmMinValue = p[PWM_MIN_VALUE] = (int)p[PWM_MIN_VALUE]; //PWM最小周期 timer1 ch2 pwmMaxValue = p[PWM_MAX_VALUE] = (int)p[PWM_MAX_VALUE]; //PWM最大周期 timer1 ch2 pwmLoValue = p[PWM_LO_VALUE] = (int)p[PWM_LO_VALUE]; pwmHiValue = p[PWM_HI_VALUE] = (int)p[PWM_HI_VALUE]; pwmMinStart = p[PWM_MIN_START] = (int)p[PWM_MIN_START]; if (rpmScale PWM_RPM_SCALE_MAX) rpmScale = PWM_RPM_SCALE_MAX; p[PWM_RPM_SCALE] = rpmScale; } ESC32开源电调 源码与原理图,此源码采用RTT操作系统,CAN PWM操作方式 ,本人已用PWM方式成功驱动起来,CAN 暂且还没做测试。 此资料是 啊嘉 开源出来的,好资料不敢独享,稍加整理放到这与大家共享。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值