打印
[STM32F1]

STM32 FOC PMSM电机开发技术支持

[复制链接]
楼主: yocheng
手机看帖
扫描二维码
随时随地手机跟帖
21
grant_jx| | 2014-11-17 18:45 | 只看该作者 回帖奖励 |倒序浏览
最近怎么多了这么多用ST FOC库的 ?
你有问题可以来这问啊,我也不能保证都可以回答你,尽力吧。

使用特权

评论回复
22
wnxyy| | 2014-12-10 09:14 | 只看该作者
学习了,接下来我也要弄下这个库了

使用特权

评论回复
23
yocheng|  楼主 | 2014-12-10 16:34 | 只看该作者
grant_jx 发表于 2014-11-17 18:45
最近怎么多了这么多用ST FOC库的 ?
你有问题可以来这问啊,我也不能保证都可以回答你,尽力吧。 ...

多谢,版主,现在已经搞好了,新的FOC 4.0库

使用特权

评论回复
24
452828196| | 2015-1-30 15:37 | 只看该作者
请问4.0的库里面是不是main已经有了封装起来了啊?为什么我下载下来之后编译直接就通过了,还是什么意思?

使用特权

评论回复
25
452828196| | 2015-1-30 15:39 | 只看该作者
yocheng 发表于 2014-12-10 16:34
多谢,版主,现在已经搞好了,新的FOC 4.0库

我用4.0的库,我也在做一个电机驱动,请问用库开发让电机转起来难度大吗?

使用特权

评论回复
26
452828196| | 2015-1-30 15:40 | 只看该作者
自己画的板子,用ICS,hall,速度可调节,还有电流控制性能怎么样?谢谢了

使用特权

评论回复
27
yocheng|  楼主 | 2015-1-30 17:50 | 只看该作者
452828196 发表于 2015-1-30 15:40
自己画的板子,用ICS,hall,速度可调节,还有电流控制性能怎么样?谢谢了

还好,如果想电机转起来很简单,但深入优化就有难度

使用特权

评论回复
28
452828196| | 2015-2-3 12:01 | 只看该作者
我能加你QQ吗?

使用特权

评论回复
29
452828196| | 2015-2-3 15:29 | 只看该作者
grant_jx 发表于 2014-11-17 18:45
最近怎么多了这么多用ST FOC库的 ?
你有问题可以来这问啊,我也不能保证都可以回答你,尽力吧。 ...

自家写main需要注意哪些?我用例子里的potentiometer_start(); 电位器启动,可是没动静,大神帮我看看是不是我移植有问题:
define PROJECT_CHK
#include "CrossCheck.h"
#undef PROJECT_CHK

#include "MCTuningClass.h"
#include "MCInterfaceClass.h"
#include "MCTasks.h"
#include "Parameters conversion.h"
#include "Timebase.h"
#include "UITask.h"
#include "MCLibraryISRPriorityConf.h"
#include <stdio.h>
#include "stm32_eval.h"

/********************************W22-Foc-2015.02.03********************************/
#include "MC.h"

/********************************end********************************/

/************ W22-Foc-2015.02.03-DEFINE for USER STATE MACHINE  *****************/
#define US_RESET        0x00
#define US_POSITIVE_RUN 0x01
#define US_STOP        0x02
#define COUNT_MAX_SEC  3
#define STOP_DURATION_SEC 2
#define COUNT_MAX (COUNT_MAX_SEC * USER_TIMEBASE_FREQUENCY_HZ)
#define STOP_DURATION  (STOP_DURATION_SEC * USER_TIMEBASE_FREQUENCY_HZ)
#define USER_TIMEBASE_FREQUENCY_HZ        10
#define USER_TIMEBASE_OCCURENCE_TICKS  (SYS_TICK_FREQUENCY/USER_TIMEBASE_FREQUENCY_HZ)-1u
/********************************end********************************/

#define FIRMWARE_VERS "STM32 FOC SDK\0Ver.4.0.0"
const char s_fwVer[32] = FIRMWARE_VERS;

#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/* Uncomment the following line to enable the demo mode */
/* #define DEMOMODE */

/* DEMO MODE prototypes, variables, macros */
#if defined(DEMOMODE)

#define MANUAL_MODE 0x00
#define DEMO_MODE   0x01

static volatile uint8_t Mode = DEMO_MODE;
void Demo(void);
void TqSpeedMode_start(void);
#endif
void potentiometer_start(void);

/* Private function prototypes -----------------------------------------------*/

void SysTick_Configuration(void);

/* Private variables ---------------------------------------------------------*/
/*******************************2015-02-03-W22-Foc********************************/
static CMCI oMCI_1;                                    
static uint8_t User_State = US_RESET;
bool cmd_status = FALSE;
static uint16_t UserCnt = 0;

uint16_t potentiometer_value=0;
uint16_t speed_max_valueRPM = MOTOR_MAX_SPEED_RPM;    //Maximum value for speed reference from Workbench
uint16_t speed_min_valueRPM = 1000;                   //Set the minimum value for speed reference
uint16_t speed_firstramp_duration = 100;   //Set the duration for first ramp  
/*******************************end********************************/
CMCI oMCI[MC_NUM];
CMCT oMCT[MC_NUM];  
uint32_t wConfig[MC_NUM] = {UI_CONFIG_M1,UI_CONFIG_M2};


/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/  

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{  

  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */

#if !defined(STM32F0XX)
  /*NVIC Priority group configuration.
    Default option is NVIC_PriorityGroup_3.
  */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
#endif
  
  /*MCInterface and MCTuning boot*/
  MCboot(oMCI,oMCT);
   
  /*Systick configuration.*/
  SysTick_Configuration();
  


  while(1)
  {
   potentiometer_start();  
  }
}

void potentiometer_start()
{

oMCI_1 = GetMCI(M1);

GPIO_InitTypeDef GPIO_InitStructure;


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
     

if (TB_UserTimebaseHasElapsed())
{
  /* User defined code */
  switch (User_State)
  {
   case US_RESET:
    {
          /* Next state */
          /* This command sets what will be the first speed ramp after the
          MCI_StartMotor command. It requires as first parameter the oMCI[0], as
          second parameter the target mechanical speed in thenth of Hz and as
          third parameter the speed ramp duration in milliseconds. */
          MCI_ExecSpeedRamp(oMCI_1, 1800/6, speed_firstramp_duration);
         
          /* This is a user command used to start the motor. The speed ramp shall be
          pre programmed before the command.*/
          cmd_status = MCI_StartMotor(oMCI_1);
         
          /* It verifies if the command  "MCI_StartMotor" is successfully executed
          otherwise it tries to restart the procedure */
          if(cmd_status==FALSE)   
           {
            User_State = US_RESET;                       // Command NOT executed
           }
          else User_State = US_POSITIVE_RUN;           // Command executed

          UserCnt = 0;
    }
    break;  
   case US_POSITIVE_RUN:
    {
      /*control point for regular conversion request pending*/
      if(MC_RegularConvState() == UDRC_STATE_IDLE)
      /*define the regular channel for ADC (PC4) with a sampling time */
        
        MC_RequestRegularConv(ADC_Channel_14,ADC_SampleTime_71Cycles5);            
      
      /*in case of End Of Conversion (EOC) the variable defined below contains
      the last ADC value for PC4 (potentiometer->MCU pin) */
      else if(MC_RegularConvState() == UDRC_STATE_EOC)
            potentiometer_value = MC_GetRegularConv();
      
      /* It counts the time for each new speed value assignment  */
      if (UserCnt < COUNT_MAX)
          {
            UserCnt++;
          }
          else
          {
            UserCnt=0;
            /* In case of low RPM value < Minimum Speed (speed_min_value) the
            motor is forced to stop */            
            if(((potentiometer_value+1)*speed_max_valueRPM / 65535) <= speed_min_valueRPM)
             {
               User_State = US_STOP;
               UserCnt=0;
             }
            else
             {
             /* It changes the motor speed reference according with the potentiometer
             value acquired by ADC on channel PC4 - the duration of the ramp is fixed
             at 100 milliseconds */         
             MCI_ExecSpeedRamp(oMCI_1, ((potentiometer_value+1)*speed_max_valueRPM / 65535)/6, speed_firstramp_duration);  
             }
          }   
    }
    break;
   case US_STOP:
    {
       /* This is a user command to stop the motor */
       MCI_StopMotor(oMCI_1);
        
       /* After the time "STOP_DURATION" the motor will be restarted */
       if (UserCnt >= STOP_DURATION)
          {
            /* Next state */
            
            User_State = US_RESET;
            UserCnt = 0;
          }
          else
          {
            UserCnt++;
          }
    }
    break;  
  }
  TB_SetUserTimebaseTime(USER_TIMEBASE_OCCURENCE_TICKS);
}
}

使用特权

评论回复
30
sunny1988| | 2015-2-3 17:41 | 只看该作者
最近在试着用2.0的电机库调我的PMSM马达,做过的还请分享下经验啊!

使用特权

评论回复
31
useisbb| | 2015-2-7 14:32 | 只看该作者
我的板子每次都停在start_up,采用的三路电阻采集电流。电机用的专用伺服电机

使用特权

评论回复
32
useisbb| | 2015-2-7 14:33 | 只看该作者
而且用专业仪器测量配置了,电机参数。用的是磁场定向无传感器启动,不知道为什么失败

使用特权

评论回复
33
yocheng|  楼主 | 2015-2-7 19:32 | 只看该作者
本帖最后由 yocheng 于 2015-2-7 19:40 编辑
452828196 发表于 2015-2-3 15:29
自家写main需要注意哪些?我用例子里的potentiometer_start(); 电位器启动,可是没动静,大神帮我看看是 ...

这个是对应STM32F103的电位器例程,你的电位器IO脚,要对应相应的ADC资源配置
如你上图,用PA7脚 ,F103系列就是 ADC_Channel_7   

使用特权

评论回复
34
452828196| | 2015-2-8 12:40 | 只看该作者
yocheng 发表于 2015-2-7 19:32
这个是对应STM32F103的电位器例程,你的电位器IO脚,要对应相应的ADC资源配置
如你上图,用PA7脚 ,F103系 ...

这个我改过来了,还是没起转,不知道是怎么回事

使用特权

评论回复
35
yocheng|  楼主 | 2015-2-8 19:48 | 只看该作者
useisbb 发表于 2015-2-7 14:32
我的板子每次都停在start_up,采用的三路电阻采集电流。电机用的专用伺服电机 ...

start_up 失败,一般是开环跑完,没有进入闭环,检查下进闭环的成立条件

使用特权

评论回复
36
yocheng|  楼主 | 2015-2-8 19:49 | 只看该作者
452828196 发表于 2015-2-8 12:40
这个我改过来了,还是没起转,不知道是怎么回事

用WB的串口通信启动电机成功吗?电位器是在用WB能启动成功的大前提才加这代码吧

使用特权

评论回复
37
useisbb| | 2015-2-10 14:35 | 只看该作者
yocheng 发表于 2015-2-8 19:49
用WB的串口通信启动电机成功吗?电位器是在用WB能启动成功的大前提才加这代码吧 ...

串口启动也失败

使用特权

评论回复
38
useisbb| | 2015-2-10 14:37 | 只看该作者
yocheng 发表于 2015-2-8 19:48
start_up 失败,一般是开环跑完,没有进入闭环,检查下进闭环的成立条件

全是库只能看到这一步MCI_RampCompleted(oMCI)
这函数一直输出为FALSE

使用特权

评论回复
39
yocheng|  楼主 | 2015-2-10 22:26 | 只看该作者
useisbb 发表于 2015-2-10 14:37
全是库只能看到这一步MCI_RampCompleted(oMCI)
这函数一直输出为FALSE

不能成功进闭环,原因很多,硬件,软件参数设置,先用open_loop 模式,调试好硬件。再转回软件参数设定进闭环

使用特权

评论回复
40
useisbb| | 2015-2-12 22:40 | 只看该作者
grant_jx 发表于 2014-4-26 22:04
在ST Motor Control Workbench 配置中,有没有打开串口?图中对话框中的第二项。

...

我用的4.0的库总是启动失败,电机转一下就停了,用的无传感器方式。PLL的转角信号传输回来非常漂亮的锯齿波。请问这应该是怎么回事

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则