久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3439|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

電子設(shè)計競賽pid四軸(王者版)stm32源碼與資料下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:218295 發(fā)表于 2017-8-10 21:51 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


轉(zhuǎn)速、電流雙閉環(huán)直流調(diào)速系統(tǒng)和調(diào)節(jié)器的工程設(shè)計方法2.1  
轉(zhuǎn)速、電流雙閉環(huán)直流調(diào)速系統(tǒng)及其靜特性
采用PI調(diào)節(jié)的單個轉(zhuǎn)速閉環(huán)直流調(diào)速系統(tǒng)可以在保證系統(tǒng)穩(wěn)定的前提下實現(xiàn)轉(zhuǎn)速無靜差。但是,如果對系統(tǒng)的動態(tài)性能要求較高,單閉環(huán)系統(tǒng)就難以滿足需要,這主要是因為在單閉環(huán)系統(tǒng)中不能控制電流和轉(zhuǎn)矩的動態(tài)過程。電流截止負(fù)反饋環(huán)節(jié)是專門用來控制電流的,并不能很理想地控制電流的動態(tài)波形,圖2-1a)。
在起動過程中,始終保持電流(轉(zhuǎn)矩)為允許的最大值,使電力拖動系統(tǒng)以最大的加速度起動,到達(dá)穩(wěn)態(tài)轉(zhuǎn)速時,立即讓電流降下來,使轉(zhuǎn)矩馬上與負(fù)載相平衡,從而轉(zhuǎn)入穩(wěn)態(tài)運行。這樣的理想起動過程波形示于圖2-1b。
為了實現(xiàn)在允許條件下的最快起動,關(guān)鍵是要獲得一段使電流保持為最大值的恒流過程。按照反饋控制規(guī)律,采用某個物理量的負(fù)反饋就可以保持該量基本不變,那么,采用電流負(fù)反饋應(yīng)該能夠得到近似的恒流過程。應(yīng)該在起動過程中只有電流負(fù)反饋,沒有轉(zhuǎn)速負(fù)反饋,達(dá)到穩(wěn)態(tài)轉(zhuǎn)速后,又希望只要轉(zhuǎn)速負(fù)反饋,不再讓電流負(fù)反饋發(fā)揮作用。


stm32單片機(jī)源程序如下:
  1. #include"pid.h"
  2. #include"fuzzy.h"
  3. #include"pwm.h"
  4. #include"dac.h"


  5.   PIDtypedef PID1;         //PID結(jié)構(gòu)體
  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; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值        
  19.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
  20.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
  21.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
  22.         TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位

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

  24.         //中斷優(yōu)先級NVIC設(shè)置
  25.         NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM3中斷
  26.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占優(yōu)先級1級
  27.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //從優(yōu)先級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)        //        采樣時間到,中斷處理函數(shù)
  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));          //常規(guī)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);             //重新設(shè)定PWM值
  63. TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除中斷標(biāo)志位               
  64. }
  65. void incPIDinit(void)
  66. {
  67. //PID1參數(shù)初始化
  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參數(shù)初始化
  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參數(shù)初始化
  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參數(shù)初始化
  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;  //當(dāng)前誤差
  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. /*最后設(shè)定四個輪子的轉(zhuǎn)速,轉(zhuǎn)速 1rad/s等價于122.23個脈沖每秒的轉(zhuǎn)速*/
  137.   void set_speed(float W1,float W2,float W3,float W4)
  138.         {
  139.                         float temp;
  140.                            
  141. ……………………

  142. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
pid.rar (249.46 KB, 下載次數(shù): 45)



評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天想天天干 | 亚洲国产精品自拍 | 国产精品二区三区 | 中文字幕国产精品 | 91一区二区三区在线观看 | 午夜视频网站 | 亚洲国产精品久久久 | 国产精品99久久久久久www | 久久久久久国产精品 | 在线观看成人精品 | 一级黄色片网站 | 91精品国产91久久久久久最新 | 国产在线97| 国产日韩精品在线 | 久久99蜜桃综合影院免费观看 | 国产91成人 | 国产91观看 | 日日日操 | 99久热| 欧美一区2区三区3区公司 | 午夜影院在线视频 | www.亚洲免费 | 国产精品一区久久久 | 国产污视频在线 | 国产在线高清 | 欧美va大片 | 亚洲欧美日韩中文在线 | 日韩精品免费一区 | 国产午夜精品一区二区三区四区 | 久久久久亚洲精品 | 成人亚洲 | 91看片在线观看 | 欧美日韩一区在线 | 97色在线视频 | 欧美激情精品久久久久久免费 | 激情六月丁香 | 国产精品久久久久久久久图文区 | 欧美亚洲激情 | 成人精品久久久 | 日韩欧美在线免费观看视频 | 欧美久久影院 |