你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【电机培训】玩个ST牌电调?

[复制链接]
RuiJey 发布时间:2017-8-30 20:56
本帖最后由 RuiJack 于 2017-8-30 21:22 编辑

      此次培训的视频和工具大家都差不多能介绍的都介绍了诶,我们还可以怎么玩玩?
      好像之前一直想把四轴用的电调也做来玩玩,但又不会电机控制咧。这次好像可以捡个便宜,用ST的库来仿照做一个?

      那么,初步想法是这样的 -> 原来的工程 + PWM捕获 = 简易电调。
      连工程都用原来的,可是懒到家了。
      好了,首先来看看可用的资源。nucleo-F302的板子,电机驱动库SPN7的示例功工程中已经使用了TIM1,TIM2,TIM6,TIM16,额。为了保证尽可能少的改动,来看看还有哪个定时器可以用吧。
QQ截图20170830194600.png

      好吧,至少还有两个定时器可供选择,TIM15,TIM17,但是板子上已经有很多已经都有用了,有些也被电机驱动库作为其他功能用了,对照数据手册和nucleo-F302板子的AD PCB功能,来寻找可用的GPIO,这里就省略耗时的过程。来看下其中一个可用的IO
QQ截图20170830195025.png

      是的,你没有看错,这还是UART2的RX引脚,已经被用了,好在可以暂时不用串口2来接收上位机数据,只用于向电脑发送调试数据。对应板子上的插针是
QQ截图20170830195414.png

      刚好还有个插针,后面再介绍下这还有个方便测试的好处。

      好了,继续正题。接下来开始初始化TIM15 CH2.之前还没有接触过HAL库,很多地方就参考库中的例程来了。
      首先是GPIO初始化。之所以连这个也提出来,是因为一直在纳闷儿引脚要配置为复用上下拉模式,可能有段时间没用32的定时器捕获模式了,有点忘了。

  1.   GPIO_InitStruct.Pin = GPIO_PIN_3;
  2.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  3.   GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  4.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  5.   GPIO_InitStruct.Alternate = GPIO_AF9_TIM15;
  6.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
复制代码
     然后是定时器基本参数的初始化。
  1.   htim15.Instance = TIM15;
  2.   htim15.Init.Prescaler = 72 - 1;
  3.   htim15.Init.CounterMode = TIM_COUNTERMODE_UP;
  4.   htim15.Init.Period = 0xFFFF;
  5.   htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  6.   htim15.Init.RepetitionCounter = 0;
  7.   htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  8.   if(HAL_TIM_IC_Init(&htim15) != HAL_OK)
  9.   {
  10.         BSP_LED_On(LED2);        
  11.   }
复制代码
     接着是两个定时器通道的配置。这里直接使用了32定时器的PWM输入模式,以前在F1上就用得方便,这里也将两个内部输入通道连接到同一个输入引脚,CH2,通道1用作高电平脉宽采集,通道2用作PWM周期采集。两个通道的配置差异主要是采样边沿,和通道映射。
  1.   sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  2.   sConfigIC.ICFilter = 0;

  3.   sConfigIC.ICPolarity = TIM_ICPOLARITY_FALLING;
  4.   sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
  5.   if(HAL_TIM_IC_ConfigChannel(&htim15, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  6.   {               
  7.         BSP_LED_On(LED2);
  8.   }

  9.   sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING;
  10.   sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  11.   if(HAL_TIM_IC_ConfigChannel(&htim15, &sConfigIC, TIM_CHANNEL_2) != HAL_OK)
  12.   {
  13.         BSP_LED_On(LED2);
  14.   }
复制代码
    这里有一段是输入捕获的配置,跟以前STD库有些区别,还没细看,直接从HAL库例程中拿过来先用着
  1.   sSlaveConfig.SlaveMode        = TIM_SLAVEMODE_RESET;
  2.   sSlaveConfig.InputTrigger     = TIM_TS_TI2FP2;
  3.   sSlaveConfig.TriggerPolarity  = TIM_TRIGGERPOLARITY_NONINVERTED;
  4.   sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
  5.   sSlaveConfig.TriggerFilter    = 0;
  6.   if(HAL_TIM_SlaveConfigSynchronization(&htim15, &sSlaveConfig) != HAL_OK)
  7.   {
  8.       BSP_LED_On(LED2);
  9.   }
复制代码
     还有两个通道输入捕获中断的使能
  1.   if (HAL_TIM_IC_Start_IT(&htim15, TIM_CHANNEL_2) != HAL_OK)
  2.   {
  3.       BSP_LED_On(LED2);
  4.       Error_Handler();
  5.   }

  6.   if (HAL_TIM_IC_Start_IT(&htim15, TIM_CHANNEL_1) != HAL_OK)
  7.   {
  8.       BSP_LED_On(LED2);
  9.       Error_Handler();
  10.   }
复制代码
     我们在按顺序看中断部分,首先是中断向量的使能。这里需要注意的是TIM15的中断和TIM1 BREAK中断是用的同一个中断向量。
  1. #define TIM15_IRQn       TIM1_BRK_TIM15_IRQn
复制代码
     所以最终我们还是得对原有工程进行修改,还是按顺序先来看中断服务函数
  1. void TIM1_BRK_TIM15_IRQHandler(void)
  2. {

  3.       if(__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_BREAK) != RESET)
  4.       {
  5.             MC_StopMotor();
  6.             SIXSTEP_parameters.STATUS = OVERCURRENT;        
  7.       }

  8.       HAL_TIM_IRQHandler(&htim1);
  9.       HAL_TIM_IRQHandler(&htim15);
  10. }
复制代码
     最后一行就是添加的TIM15中断服务函数入口。
      接下来继续刚才提到需要修改的两个地方,由于HAL库中将中断分类处理进行了封装,这里就不贴这个部分,直接来看需要修改的部分。
      首先是TIM6的计数器溢出中断,这里改好的,对入口参数进行检查,确认是TIM6的溢出中断,才执行原来的函数。同时为TIM15添加溢出中断的回调函数。
  1.   void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2.   {
  3.     if(htim->Instance == TIM6)
  4.     {
  5.         MC_TIMx_SixStep_timebase();
  6.     }
  7.     else if(htim->Instance == TIM15)
  8.     {
  9.         TIM15_PeriodElapsedCallback();
  10.     }
  11.                
  12.   }
复制代码
     话说写到这我突然忘了还有哪个地方的中断服务函数要改,敢信?唉,像我这样思路不清晰的,写代码真是个定时炸弹呀,指不定哪里留了个BUG还记不起来了。 大家待会儿直接对照看工程代码吧。
      TIM15用到了两个中断,一个是溢出中断,记录溢出次数,另一个是读取捕获到的高电平脉宽值和PWM周期值。前面将定时器时钟设置为1/72主频,这样捕获到的值的单位刚好就是us
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  2. {               
  3.     if (htim->Instance == TIM15)
  4.     {
  5.         if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  6.         {
  7.             capCnt++;

  8.             pulsePeriod = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2) + periodCnt * 0xFFFF;
  9.             pulsePeriod        += 1;
  10.             periodCnt = 0;
  11.             pulseWidth = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
  12.             pulseWidth += 1;

  13.             if (pulsePeriod != 0)
  14.             {
  15.                 uwDutyCycle = (pulseWidth * 100) / pulsePeriod;
  16.                 uwFrequency = ulTmrClk  / pulsePeriod;
  17.             }
  18.             else
  19.             {
  20.                 uwDutyCycle = 0;
  21.                 uwFrequency = 0;
  22.                 pulsePeriod = 0;
  23.                 pulseWidth = 0;
  24.             }
  25.         }
  26.     }
  27. }        
复制代码
     好了,主要的两个部分就这些,剩下的就是启动停止电机和设置速度。这部分就不贴吧,直接上传功臣压缩包。

      话说我还去移植6步换相的库,浪费的时间都可以熟悉HAL库,然后开始学习FOC库了

      今天先上传,改天有时间再来完善,大家看了一起讨论讨论。
/-------------------------------------------------------------------------------------------------------------------/
      顺便把测试图片和视频上传了
QQ截图20170830210638.png


      测试视频,使用函数发生器给电调信号,周期20ms,油门对应的脉冲宽度1-2ms。



Rui_STM32CubeExpansion_SPN7_V1.1.0.part01.rar

下载

9.5 MB, 下载次数: 82

原来工程上改的,只能打包上传了

Rui_STM32CubeExpansion_SPN7_V1.1.0.part02.rar

下载

9.24 MB, 下载次数: 74

有点大,分个卷

收藏 2 评论5 发布时间:2017-8-30 20:56

举报

5个回答
Grant 回答时间:2017-9-2 19:13:21
出了很久了,一直没发布,最近才公开。
http://www.st.com/content/st_com ... t5571_gl_bn_aug2017

en.steval-esc001v1_image.jpg
workbench界面有改动,电机硬件参数增加了诸如摩擦系数等,看起来速度环下以后PID不用用户改了。

ST其实是有几个版本的ESC的,还有一个是深圳ST做的基于STSPIN32F0的版本,另外说还有一个完整的无人机方案,包括姿态控制和ESC,说是开源的,可能还需要一些时间才能公开。
RuiJey 回答时间:2017-8-30 21:01:37
TIM15 CH2对应的PA3这个引脚,刚好是串口2的接收引脚,所以你会发现这个引脚连接在板载ST-LINK的串口TX引脚上,所以这里还有个方便的调试方法,直接用ST-LINK的串口向板子发送数据,任意数据,这样在这个引脚上就会有方波产生,嘿,还不用接信号源,也不会用手给输出脉冲信号了,直接用串口发送任意数据。简单粗暴还很方便。
zero99 回答时间:2017-8-31 09:06:46
不错,支持一下
五哥 回答时间:2017-8-31 09:28:15
ST新出了电调板,用的是STM32F303做的,比较高端。性能还没有测试。
RuiJey 回答时间:2017-8-31 11:37:53
五哥 发表于 2017-8-31 09:28
ST新出了电调板,用的是STM32F303做的,比较高端。性能还没有测试。

分享个链接学习下?
PCB工程应该是开源的吧

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版