找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电子设计竞赛pid四轴(王者版)stm32源码与资料下载

[复制链接]
跳转到指定楼层
楼主


转速、电流双闭环直流调速系统和调节器的工程设计方法2.1  
转速、电流双闭环直流调速系统及其静特性
采用PI调节的单个转速闭环直流调速系统可以在保证系统稳定的前提下实现转速无静差。但是,如果对系统的动态性能要求较高,单闭环系统就难以满足需要,这主要是因为在单闭环系统中不能控制电流和转矩的动态过程。电流截止负反馈环节是专门用来控制电流的,并不能很理想地控制电流的动态波形,图2-1a)。
在起动过程中,始终保持电流(转矩)为允许的最大值,使电力拖动系统以最大的加速度起动,到达稳态转速时,立即让电流降下来,使转矩马上与负载相平衡,从而转入稳态运行。这样的理想起动过程波形示于图2-1b。
为了实现在允许条件下的最快起动,关键是要获得一段使电流保持为最大值的恒流过程。按照反馈控制规律,采用某个物理量的负反馈就可以保持该量基本不变,那么,采用电流负反馈应该能够得到近似的恒流过程。应该在起动过程中只有电流负反馈,没有转速负反馈,达到稳态转速后,又希望只要转速负反馈,不再让电流负反馈发挥作用。


stm32单片机源程序如下:
  1. #include"pid.h"
  2. #include"fuzzy.h"
  3. #include"pwm.h"
  4. #include"dac.h"


  5.   PIDtypedef PID1;         //PID结构体
  6. PIDtypedef PID2;
  7. PIDtypedef PID3;
  8. PIDtypedef PID4;

  9. extern u8 start_flag;
  10. extern u16 pwm1,pwm2,pwm3,pwm4;

  11. void PIDperiodinit(u16 arr,u16 psc)
  12. {
  13.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  14.         NVIC_InitTypeDef NVIC_InitStructure;

  15.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能
  16.         
  17.         //定时器TIM6初始化
  18.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
  19.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  20.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  21.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  22.         TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

  23.         TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

  24.         //中断优先级NVIC设置
  25.         NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM3中断
  26.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级1级
  27.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级1级
  28.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  29.         NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


  30. //        TIM_Cmd(TIM6, ENABLE);  //放在主程序中使能

  31. }


  32. void TIM6_IRQHandler(void)        //        采样时间到,中断处理函数
  33. {         
  34.         
  35. if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)//更新中断
  36.         {

  37.         frequency1=1000000/period_TIM4        ; //通过捕获的波形的周期算出频率
  38.         frequency2=1000000/period_TIM1        ;
  39.         frequency3=1000000/period_TIM2        ;
  40.         frequency4=1000000/period_TIM5        ;
  41. /********PID1处理**********/
  42.         PID1.sum_error+=(incPIDcalc(&PID1,frequency1));         //计算增量并累加
  43.        pwm1=PID1.sum_error*4.6875  ;   //pwm1 代表将要输出PWM的占空比
  44.           frequency1=0; //清零
  45.      period_TIM4=0;
  46. /********PID2处理**********/
  47.          PID2.sum_error+=(incPIDcalc(&PID2,frequency2));         //计算增量并累加  Y=Y+Y'               
  48.          pwm2=PID2.sum_error*4.6875 ;   //将要输出PWM的占空比
  49.         frequency2=0;
  50.         period_TIM1=0;
  51. /********PID3处理**********/
  52.          PID3.sum_error+=(incPIDcalc(&PID3,frequency3));          //常规PID控制
  53.         pwm3=PID3.sum_error*4.6875 ;   //将要输出PWM的占空比
  54.         frequency3=0;
  55.         period_TIM2=0;

  56. /********PID4处理**********/
  57.             PID4.sum_error+=(incPIDcalc(&PID4,frequency4));         //计算增量并累加
  58.          pwm4=PID4.sum_error*4.6875 ;   //将要输出PWM的占空比
  59.         frequency4=0;
  60.         period_TIM5=0;

  61.           }
  62.          TIM_SetCompare(pwm1,pwm2,pwm3,pwm4);             //重新设定PWM值
  63. TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除中断标志位               
  64. }
  65. void incPIDinit(void)
  66. {
  67. //PID1参数初始化
  68. PID1.sum_error=0;
  69. PID1.last_error=0;
  70. PID1.prev_error=0;
  71. PID1.proportion=0;
  72. PID1.integral=0;
  73. PID1.derivative=0;
  74. PID1.setpoint=0;

  75. //PID2参数初始化
  76. PID2.sum_error=0;
  77. PID2.last_error=0;
  78. PID2.prev_error=0;
  79. PID2.proportion=0;
  80. PID2.integral=0;
  81. PID2.derivative=0;
  82. PID2.setpoint=0;

  83. //PID3参数初始化
  84. PID3.sum_error=0;
  85. PID3.last_error=0;
  86. PID3.prev_error=0;
  87. PID3.proportion=0;
  88. PID3.integral=0;
  89. PID3.derivative=0;
  90. PID3.setpoint=0;

  91. //PID4参数初始化
  92. PID4.sum_error=0;
  93. PID4.last_error=0;
  94. PID4.prev_error=0;
  95. PID4.proportion=0;
  96. PID4.integral=0;
  97. PID4.derivative=0;
  98. PID4.setpoint=0;
  99. }
  100. void PID_setpoint(PIDtypedef*PIDx,u16 setvalue)
  101. {
  102.   PIDx->setpoint=setvalue;
  103. }
  104. int incPIDcalc(PIDtypedef *PIDx,u16 nextpoint)
  105. {
  106. int iError,iincpid;
  107. iError=PIDx->setpoint-nextpoint;  //当前误差
  108. /*iincpid=                                               //增量计算
  109. PIDx->proportion*iError                //e[k]项
  110. -PIDx->integral*PIDx->last_error          //e[k-1]
  111. +PIDx->derivative*PIDx->prev_error;//e[k-2]
  112. */
  113. iincpid=                                                          //增量计算
  114. PIDx->proportion*(iError-PIDx->last_error)
  115. +PIDx->integral*iError
  116. +PIDx->derivative*(iError-2*PIDx->last_error+PIDx->prev_error);

  117. PIDx->prev_error=PIDx->last_error; //存储误差,便于下次计算
  118. PIDx->last_error=iError;
  119. return(iincpid) ;
  120. }
  121. void PID_set(float pp,float ii,float dd)
  122. {
  123.   PID1.proportion=pp;
  124. PID1.integral=ii;
  125. PID1.derivative=dd;
  126. PID2.proportion=pp;
  127. PID2.integral=ii;
  128. PID2.derivative=dd;
  129.   PID3.proportion=pp;
  130. PID3.integral=ii;
  131. PID3.derivative=dd;
  132.   PID4.proportion=pp;
  133. PID4.integral=ii;
  134. PID4.derivative=dd;
  135. }

  136. /*最后设定四个轮子的转速,转速 1rad/s等价于122.23个脉冲每秒的转速*/
  137.   void set_speed(float W1,float W2,float W3,float W4)
  138.         {
  139.                         float temp;
  140.                            
  141. ……………………

  142. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
pid.rar (249.46 KB, 下载次数: 44)



评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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