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

查看: 1408|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版