找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8030|回复: 9
打印 上一主题 下一主题
收起左侧

STM32 PID精准控制电机转到指定位置源程序

  [复制链接]
跳转到指定楼层
楼主
ID:519988 发表于 2019-4-23 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
步进电机转到指定位置

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "beep.h"
  6. #include "encoder.h"
  7. #include "timer.h"


  8. int main(void)
  9. {
  10.         vu8 key=0;       
  11.         delay_init();                     //延时函数初始化          
  12.         uart_init(9600);                    //=====串口初始化
  13.   Encoder_Init_TIM2();            //=====编码器接口
  14.         TIM6_Int_Init(99,7199);       //10MS进入一次中断
  15.         TIM3_PWM_Init(7199,0);         //不分频。PWM频率=72000000/900=80Khz
  16. while(1)
  17.         {
  18.                
  19.                 key=KEY_Scan(0);        //得到键值
  20.                    if(key)
  21.                 {                                                  
  22.                         switch(key)
  23.                         {                                 
  24.                                 case WKUP_PRES:        //控制蜂鸣器
  25.                                 LED0=!LED0;
  26.                                         break;
  27.                                 case KEY2_PRES:        //控制LED0翻转
  28.                                         LED0=!LED0;
  29.                                         break;
  30.                                 case KEY1_PRES:        //控制LED1翻转         
  31.                                         LED1=!LED1;
  32.                                         break;
  33.                                 case KEY0_PRES:        //同时控制LED0,LED1翻转
  34.                                         LED0=!LED0;
  35.                                         LED1=!LED1;
  36.                                         break;
  37.                         }
  38.                 }else delay_ms(10);
  39.         }         
  40. }
复制代码
  1. #include "control.h"       
  2. #define PI 3.141592653
  3. #include "sys.h"


  4. int Encoder,Target_position=10280;             //Encoder编码器的脉冲计数,相当于实际速度 Target_velocity目标速度  一周1040脉冲 初始位置10000在encoder.c中设置
  5. int Moto;                 //电机PWM变量 应是Motor的 向Moto致敬

  6. void TIM6_IRQHandler(void)   //TIM6中断    函数实现了编码器角速度线速度的计算  10MS进入一次中断
  7. {
  8.         if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
  9.                 {
  10.                 TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除TIMx更新中断标志
  11.                 Encoder=Read_Encoder(2);
  12.                 printf("位置%d\r\n",Encoder);
  13.                 Moto=Position_PID(Encoder,Target_position);              //===位置PID控制器
  14.                 Xianfu_Pwm();                                                            //===PWM限幅
  15.     Set_Pwm(Moto);                                                         //===赋值给PWM寄存器         
  16.                 }
  17. }


  18. /**************************************************************************
  19. 函数功能:赋值给PWM寄存器
  20. 入口参数:PWM
  21. 返回  值:无
  22. **************************************************************************/
  23. void Set_Pwm(int moto1)
  24. {
  25.                         if(moto1<0)                        IN2=1,                        IN1=0;   //换向引脚
  26.                         else                                                                    IN2=0,                        IN1=1;
  27.                         TIM_SetCompare2(TIM3,myabs(moto1));
  28. }

  29. /**************************************************************************
  30. 函数功能:限制PWM赋值
  31. 入口参数:无
  32. 返回  值:无
  33. **************************************************************************/
  34. void Xianfu_Pwm(void)
  35. {        
  36.           int Amplitude=5000;    //===PWM满幅是7200 限制在7100
  37.     if(Moto<-Amplitude) Moto=-Amplitude;        
  38.                 if(Moto>Amplitude)  Moto=Amplitude;        
  39. }

  40. /**************************************************************************
  41. 函数功能:绝对值函数
  42. 入口参数:int
  43. 返回  值:unsigned int
  44. **************************************************************************/
  45. int myabs(int a)
  46. {                    
  47.           int temp;
  48.                 if(a<0)  temp=-a;  
  49.           else temp=a;
  50.           return temp;
  51. }
  52. /**************************************************************************
  53. 函数功能:增量PI控制器

  54. 入口参数:编码器测量值,目标速度
  55. 返回  值:电机PWM
  56. 根据增量式离散]]PID公式
  57. pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
  58. e(k)代表本次偏差
  59. e(k-1)代表上一次的偏差  以此类推
  60. pwm代表增量输出
  61. 在我们的速度控制闭环系统里面,只使用PI控制
  62. pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
  63. **************************************************************************/
  64. int Position_PID (int Encoder,int Target)
  65. {        
  66.          float Position_KP=10,Position_KI=0.1,Position_KD=40;
  67.          static float Bias,Pwm,Integral_bias,Last_Bias;
  68.          Bias=Encoder-Target;                                  //计算偏差
  69.          Integral_bias+=Bias;                                         //求出偏差的积分
  70.          Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias);       //位置式PID控制器
  71.          Last_Bias=Bias;                                       //保存上一次偏差
  72.          return Pwm;                                           //增量输出
  73. }
复制代码


所有资料51hei提供下载:
PID精准控制电机转到指定位置.7z (191.75 KB, 下载次数: 310)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:86244 发表于 2019-4-24 21:22 | 只看该作者
楼主很用心,很好的资料
回复

使用道具 举报

板凳
ID:525089 发表于 2019-4-30 14:01 | 只看该作者
才学习电机,还有很多不懂的地方啊。
回复

使用道具 举报

地板
ID:76606 发表于 2019-7-11 20:09 | 只看该作者
下载学习学习
回复

使用道具 举报

5#
ID:267330 发表于 2019-9-12 20:36 | 只看该作者
肯定要学习
回复

使用道具 举报

6#
ID:302850 发表于 2019-9-12 20:54 来自手机 | 只看该作者
收藏下,感觉一定会用到
回复

使用道具 举报

7#
ID:217614 发表于 2019-9-14 13:39 | 只看该作者

非常好谢谢
回复

使用道具 举报

8#
ID:20672 发表于 2019-9-14 16:07 | 只看该作者
正好用到~~
回复

使用道具 举报

9#
ID:752842 发表于 2020-5-26 16:51 | 只看该作者
刚刚好,向大佬学习
回复

使用道具 举报

10#
ID:302325 发表于 2020-6-1 02:08 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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