搜索
查看: 23671|回复: 117

[原创] No.5 电机套件实验任务3&旋钮控制转速

  [复制链接]

该用户从未签到

20

主题

1628

帖子

5

蝴蝶豆

论坛元老

最后登录
2022-6-7
发表于 2018-9-2 19:17:16 | 显示全部楼层 |阅读模式
本帖最后由 子曰好人 于 2018-9-5 08:55 编辑

继续做实验,任务3和旋钮控制转速。
首先来看看任务3的要求:
任务3要求.png
这个可通过代码实现也可以通过上位机实现,已经有坛友做过这样的事情了。通过上位机做就是快速拨弄圆盘,这样系统不能在短时间内反转,造成观测器不能收敛,触发速度反馈错误报警,其实我个人觉得这里也是有过流报警存在的,这就看系统优先响应哪一个报警了。
我这里通过代码来实现task3。
任务3代码:
  1. void task_3(void)
  2. {
  3.     MC_ProgramSpeedRampMotor1(-3000/6,1000); //设置-3000rpm的转速,在一秒之内达到
  4.     MC_StartMotor1();       //启动电机
  5.     HAL_Delay(500);         //运行500ms
  6.     while(RUN != MC_GetSTMStateMotor1()); //等待电机处于运行状态,可有可无
  7.     MC_ProgramSpeedRampMotor1(3000/6,1000); //切换到3000rpm转速
  8.     MC_StartMotor1();       //启动电机
  9.     while(MC_SPEED_FDBK != STM_GetFaultState(&STM[M1])); //等待错误触发
  10.     HAL_Delay(1000);    //延时一秒,方便可以在上位机上看见错误是否发生
  11.     MC_AcknowledgeFaultMotor1();    //清除错误
  12.     HAL_Delay(100);     //延时0.1秒
  13.     MC_ProgramSpeedRampMotor1(MC_GetLastRampFinalSpeedMotor1(),1000);   //重新设置上一次速度值
  14.     MC_StartMotor1();   //启动电机
  15.     HAL_Delay(5000);    //运行5秒
  16.     MC_StopMotor1();    //停机
  17.     HAL_GPIO_WritePin(LED11_GPIO_Port,LED11_Pin,GPIO_PIN_RESET); //拉低LED引脚,表示任务结束
  18. }
复制代码
主函数代码:
  1. /* Infinite loop */
  2.   /* USER CODE BEGIN WHILE */
  3.   while (1)
  4.   {
  5.       
  6.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
  7.       {
  8.           task_3();
  9.       }
  10.       else
  11.       {
  12.         MC_StopMotor1();
  13.       }      
  14.   /* USER CODE END WHILE */
复制代码
实验现象:
任务三速度变化截图.png
通过速度变化趋势可以看到任务成功实现了,我对比了PPT的预期结果图,有一些差距。当速度设置为3000rpm时,speed reference并没有跟随代码变为3000。另外,我做了延迟清除错误信息,所以在图中可以看到一截零速状态。


好了,任务3完成。
---------------------------------------------------------
现在分享一个开放性实验,旋钮控制转速,我把这个任务定为任务4吧,用旋钮来控制电机转速我觉得才是真正的一个电机控制系统。
由于SDK中并没有考虑旋钮ADC的初始化,所以如果要使用旋钮电位器首先要通过cubemx对ADC进行初始化,在我的第二篇帖子中已经讲过关于套件的硬件资源,也知道了旋钮电位器连接的是PB1引脚。
用户1.png
创建全局变量:
  1. int32_t Speed_Adc = 0;
  2. int32_t Speed_ref = 0;
  3. PWMC_Handle_t * MC_SPEED_REF;
复制代码
任务4代码:
  1. void task_4(void)
  2. {
  3.     Speed_Adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12);
  4.     Speed_ref = (15500*Speed_Adc)>>16;
  5.     if(Speed_ref > 0)
  6.     {
  7.         MC_ProgramSpeedRampMotor1((Speed_ref+1500)/6,1000);
  8.         MC_StartMotor1();
  9.     }
  10.     else
  11.     {
  12.         MC_StopMotor1();
  13.     }
  14.     HAL_Delay(100);
  15. }
复制代码
主函数代码:
  1. /* Initialize interrupts */
  2.   MX_NVIC_Init();
  3.   /* USER CODE BEGIN 2 */
  4.   MC_SPEED_REF = &PWM_Handle_M1._Super;
  5.   /* USER CODE END 2 */

  6.   /* Infinite loop */
  7.   /* USER CODE BEGIN WHILE */
  8.   while (1)
  9.   {

  10.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
  11.       {
  12.           task_4();
  13.       }
  14.       else
  15.       {
  16.           MC_ProgramSpeedRampMotor1(0,0);
  17.           MC_StopMotor1();
  18.       }
  19.   /* USER CODE END WHILE */

  20.   /* USER CODE BEGIN 3 */

  21.   }
  22.   /* USER CODE END 3 */
复制代码
在这里稍微解释一下代码:
Speed_Adc是存储ADC采样值的变量,Speed_ref变量通过ADC采样值转化为速度设定值,MC_SPEED_REF是一个指针变量,用于获取ADC初始化设置,R3_1_F30X_ExecRegularConv这个函数在r3_1_f30x_pwm_curr_fdbk,c这个文件中,用于处理规则ADC采样。速度换算这里可以没什么说的。速度设定的时候加1500偏移是有原因的,当设定速度过低的时候电机系统根本不能正常启动,这是我尝试设置的时候所能达到的最低启动速度。

实验现象:
旋钮调速转速跟踪波形.png
从实验结果看来,这份代码默认速度PID能很好的跟踪给定转速。
我发现一个问题,代码里面在电机运行结束之后有些变量好像没有清零,这个问题留到后面在研究吧。

本帖两个任务分享就到这里,欢迎大家留言讨论。




回复

使用道具 举报

该用户从未签到

64

主题

909

帖子

76

蝴蝶豆

论坛元老

最后登录
2021-9-5
发表于 2018-9-2 22:27:32 | 显示全部楼层
代码规整,有功底,佩服!
大佬也会有纰漏啊

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      
      if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
      {
          task_5(); ------>task_3();
      }
      else
      {
        MC_StopMotor1();
      }      
  /* USER CODE END WHILE */
回复 支持 反对

使用道具 举报

该用户从未签到

20

主题

1628

帖子

5

蝴蝶豆

论坛元老

最后登录
2022-6-7
 楼主| 发表于 2018-9-2 22:36:27 | 显示全部楼层
zhdzhd-174422 发表于 2018-9-2 22:27
代码规整,有功底,佩服!
大佬也会有纰漏啊

不好意思,感谢指正
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
    发表于 2018-9-3 10:24:43 | 显示全部楼层
    哈哈,和你观点一样,很多故障报警,都是报的speed feedback,我在测试的时候,连堵转都试过,原本以为是电流过大报警,但没想到居然还是speed feedback故障
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    1628

    帖子

    5

    蝴蝶豆

    论坛元老

    最后登录
    2022-6-7
     楼主| 发表于 2018-9-3 10:45:56 | 显示全部楼层
    stm1024 发表于 2018-9-3 10:24
    哈哈,和你观点一样,很多故障报警,都是报的speed feedback,我在测试的时候,连堵转都试过,原本以为是电 ...

    去研究一下电机库生成的故障触发机制代码,也许就能明白了,搞清楚是怎么回事之后就能自定义故障报警了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    32

    帖子

    0

    蝴蝶豆

    中级会员

    最后登录
    2019-11-25
    发表于 2018-9-4 18:38:17 | 显示全部楼层
    Speed_Adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12); 5.2.0 找不到  R3_1_F30X_ExecRegularConv()?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    1628

    帖子

    5

    蝴蝶豆

    论坛元老

    最后登录
    2022-6-7
     楼主| 发表于 2018-9-4 22:54:20 | 显示全部楼层
    LT-386596 发表于 2018-9-4 18:38
    Speed_Adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12); 5.2.0 找不到  R3_1_F30X_ExecRegu ...

    在r3_1_f30x_pwm_curr_fdbk.c这个文件里面,要调用这个函数需要包含头文件r3_1_f30x_pwm_curr_fdbk.h
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    64

    主题

    909

    帖子

    76

    蝴蝶豆

    论坛元老

    最后登录
    2021-9-5
    发表于 2018-9-4 23:27:57 | 显示全部楼层
    VR连接的脚感觉像是PB1,从电路图上来看.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    1628

    帖子

    5

    蝴蝶豆

    论坛元老

    最后登录
    2022-6-7
     楼主| 发表于 2018-9-5 08:56:32 | 显示全部楼层
    zhdzhd-174422 发表于 2018-9-4 23:27
    VR连接的脚感觉像是PB1,从电路图上来看.

    手误写错了,已更正
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    70

    帖子

    10

    蝴蝶豆

    中级会员

    最后登录
    2020-7-21
    发表于 2018-10-25 19:58:06 | 显示全部楼层
    楼主,我不太懂Speed_ref = (15500*Speed_Adc)>>16;这段程序中15500的作用时什么?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-26 06:29 , Processed in 1.183920 second(s), 42 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表