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

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

[复制链接]
子曰好人 发布时间:2018-9-2 19:17
本帖最后由 子曰好人 于 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能很好的跟踪给定转速。
我发现一个问题,代码里面在电机运行结束之后有些变量好像没有清零,这个问题留到后面在研究吧。

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




1 收藏 1 评论116 发布时间:2018-9-2 19:17

举报

116个回答
zhdzhd-174422 回答时间: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 */
子曰好人 回答时间:2018-9-2 22:36:27
zhdzhd-174422 发表于 2018-9-2 22:27
代码规整,有功底,佩服!
大佬也会有纰漏啊

不好意思,感谢指正
stm1024 回答时间:2018-9-3 10:24:43
哈哈,和你观点一样,很多故障报警,都是报的speed feedback,我在测试的时候,连堵转都试过,原本以为是电流过大报警,但没想到居然还是speed feedback故障
子曰好人 回答时间:2018-9-3 10:45:56
stm1024 发表于 2018-9-3 10:24
哈哈,和你观点一样,很多故障报警,都是报的speed feedback,我在测试的时候,连堵转都试过,原本以为是电 ...

去研究一下电机库生成的故障触发机制代码,也许就能明白了,搞清楚是怎么回事之后就能自定义故障报警了
LT-386596 回答时间: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()?
子曰好人 回答时间: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
zhdzhd-174422 回答时间:2018-9-4 23:27:57
VR连接的脚感觉像是PB1,从电路图上来看.
子曰好人 回答时间:2018-9-5 08:56:32
zhdzhd-174422 发表于 2018-9-4 23:27
VR连接的脚感觉像是PB1,从电路图上来看.

手误写错了,已更正
花落莫相离 回答时间:2018-10-25 19:58:06
楼主,我不太懂Speed_ref = (15500*Speed_Adc)>>16;这段程序中15500的作用时什么?

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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