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

查看: 1395|回复: 1

【HAL库每天一例】第115例:单轴25GA370直流电机增量式PID旋...

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
发表于 2016-9-7 08:48:40 | 显示全部楼层 |阅读模式
例程下载:
资料包括程序、相关说明资料以及软件使用截图

百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1
360云盘:http://yunpan.cn/OcPiRp3wEcA92u密码 cfb6
(硬石YS-F1Pro开发板HAL库例程持续更新\5. 软件设计之电机控制(HAL库版本)\有刷直流电机.zip
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL_MOTOR-045. 单轴25GA370直流电机增量式PID旋转控制(L298N驱动)
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
【2】跳线帽情况
【3】操作及现象
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

main.c文件内容
  1. /* 私有类型定义 --------------------------------------------------------------*/
  2. //定义PID结构体
  3. typedef struct
  4. {
  5.    __IO int      SetPoint;                                 //设定目标 Desired Value
  6.    __IO double   Proportion;                               //比例常数 Proportional Const
  7.    __IO double   Integral;                                 //积分常数 Integral Const
  8.    __IO double   Derivative;                               //微分常数 Derivative Const
  9.    __IO int      LastError;                                //Error[-1]
  10.    __IO int      PrevError;                                //Error[-2]
  11. }PID;

  12. /* 私有宏定义 ----------------------------------------------------------------*/
  13. /*************************************/
  14. //定义PID相关宏
  15. // 这三个参数设定对电机运行影响非常大
  16. /*************************************/
  17. #define  P_DATA      3.2                                 //P参数
  18. #define  I_DATA      1.1                                //I参数
  19. #define  D_DATA      -0.15                              //D参数

  20. /* 私有变量 ------------------------------------------------------------------*/
  21. __IO uint16_t time_count=0;        // 时间计数,每1ms增加一(与滴定时器频率有关)
  22. __IO uint32_t CaptureNumber=0;     // 输入捕获数
  23. __IO uint8_t  start_flag=0;
  24. __IO double encoder_speed=0;
  25. static PID sPID;
  26. static PID *sptr = &sPID;

  27. int main(void)
  28. {
  29.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  30.   HAL_Init();
  31.   /* 配置系统时钟 */
  32.   SystemClock_Config();

  33.   KEY_GPIO_Init();
  34.   MX_DEBUG_USART_Init();
  35.   
  36.   IncPIDInit();
  37.   
  38.   ENCODER_TIMx_Init();
  39.   HAL_TIM_Base_Start(&htimx_ENCODER);  
  40.   
  41.   /* 高级控制定时器初始化并配置PWM输出功能 */
  42.   L298N_TIMx_Init();
  43.   /* 启动定时器 */
  44.   HAL_TIM_Base_Start(&htimx_L298N);
  45.   
  46.   HAL_TIM_IC_Start_IT(&htimx_ENCODER,ENCODER_TIM_CHANNELx);
  47.   
  48.   /* 启动定时器通道和互补通道PWM输出 */
  49.   L298N_DCMOTOR_Contrl(1,2,0);
  50.   start_flag=1;
  51.   
  52.   printf("增量式PID算法控制电机旋转\n");
  53.   /* 无限循环 */
  54.   while (1)
  55.   {
  56.     if(KEY1_StateRead()==KEY_DOWN)  // 增速
  57.     {
  58.       /* 设置目标速度 */
  59.       sptr->SetPoint =50;   
  60.     }
  61.     if(KEY2_StateRead()==KEY_DOWN)  // 减速
  62.     {
  63.       /* 设置目标速度 */
  64.       sptr->SetPoint =300;
  65.     }   
  66.   }
  67. }

  68. void HAL_SYSTICK_Callback(void)
  69. {
  70.   if(start_flag) // 等待脉冲输出后才开始计时
  71.   {
  72.     time_count++;         // 每1ms自动增一
  73.     if(time_count==200)
  74.     {
  75.       __IO uint32_t count;
  76.       __IO int para;
  77.       __IO double cal;
  78.       
  79.       /* 得到编码器计数值,数值越大说明速度越大 */
  80.       count=CaptureNumber;
  81.       CaptureNumber=0;    // 清零,从零开始计数
  82.       
  83.       /* 计数得到增量式PID的增量数值 */
  84.       para=IncPIDCalc(count);
  85.       
  86.       /* 根据增量数值调整当前电机速度 */
  87.       if((para<-3)||(para>3)) // 不做 PID 调整,避免误差较小时频繁调节引起震荡。
  88.       {
  89.         PWM_Duty +=para;  
  90.       }        
  91.       if(PWM_Duty>899)PWM_Duty=899;  
  92.       
  93.       
  94.       // 11:编码器线数(转速一圈输出脉冲数)
  95.       // 34:电机减数比,内部电机转动圈数与电机输出轴转动圈数比,即减速齿轮比      
  96.       cal=sptr->SetPoint;
  97.       printf("\n设定目标速度 -> 编码器在%ds时间计数%d个脉冲\n",time_count,sptr->SetPoint);      
  98.       printf("                相当于实际目标速度为:%0.2f圈/s\n",cal*(1000/time_count)/11/34);
  99.       
  100.       cal=count;
  101.       printf("当前电机速度-> 编码器在%ds时间计数%d个脉冲\n",time_count,count);
  102.       printf("                相当于当前实际速度为:%0.2f圈/s\n",cal*(1000/time_count)/11/34);
  103.       
  104.       printf("增量式PID算法计数结果值:%d   设置新的占空比为:%d\n",para,PWM_Duty);
  105.       
  106.       L298N_DCMOTOR_Contrl(1,2,PWM_Duty);
  107.       time_count=0;      
  108.     }
  109.   }
  110. }

  111. /**************PID参数初始化********************************/
  112. void IncPIDInit(void)
  113. {
  114.     sptr->LastError=0;            //Error[-1]
  115.     sptr->PrevError=0;            //Error[-2]
  116.     sptr->Proportion=P_DATA;      //比例常数 Proportional Const
  117.     sptr->Integral=I_DATA;        //积分常数  Integral Const
  118.     sptr->Derivative=D_DATA;      //微分常数 Derivative Const
  119.     sptr->SetPoint=100;           //设定目标Desired Value
  120. }
  121. /********************增量式PID控制设计************************************/
  122. int IncPIDCalc(int NextPoint)
  123. {
  124.   int iError,iIncpid;                                 //当前误差
  125.   iError=sptr->SetPoint-NextPoint;                    //增量计算
  126.   iIncpid=(sptr->Proportion * iError)                 //E[k]项
  127.               -(sptr->Integral * sptr->LastError)     //E[k-1]项
  128.               +(sptr->Derivative * sptr->PrevError);  //E[k-2]项
  129.               
  130.   sptr->PrevError=sptr->LastError;                    //存储误差,用于下次计算
  131.   sptr->LastError=iError;
  132.   return(iIncpid);                                    //返回增量值
  133. }
  134. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码



回复

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-9-7 11:32:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版