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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2260|回復: 0
打印 上一主題 下一主題
收起左側

STM8單片機直流電機伺服控制設計程序

[復制鏈接]
跳轉到指定樓層
樓主
有需要的可以直接下載

單片機源程序如下:
  1. //#include "iostm8s103k3.h"
  2. #include "iostm8s207r8.h"



  3. //STM8S207單片機; 連上仿真器后,ST-LINK-->Option Bytes: AFR5,右鍵-->Alternate Active,使PB0/PB1/PB2為PWM輸出端口功能。
  4. //下載運行后,View-->Livewatch,觀察PID控制參數的變化,觀察LED1的亮度;
  5. //TIM2中斷作為計時時間;PE0作為外中斷輸入;把外部頻率信號與PE0連接,進行脈沖計數(頻率測量)

  6. //開發板上用杜邦線把PB0與PD5連接起來;
  7. //單片機PC1(PWM輸出)與焊的電路板PC1端子連接;電機編碼器轉速信號(黃線)與單片機PE0連接;
  8. //電機編碼器供電正極(藍線)接+5V;電機編碼器供電負極(黑線)接GND;
  9. //電機本身供電正極(紅線)接+12V,電機本身供電負極(白線)接焊的電路板的P1排針的第3腳(功率三極管集電極),
  10. //焊的電路板接線參考《直流電機PWM調速電路圖》

  11. unsigned long   pulsecount=0;
  12. unsigned long   frequency=0;   
  13. static const unsigned int ArrPwmVal = 16000; //PWM信號周期:1ms, 1KHz
  14. int    pwmvalue=8000;                          //pwm1value取值范圍0~16000;
  15. float  Kp=10,Ki=0.1,Kd=0;                      //PID參數
  16. float  set_velocity=1000.0, sample_velocity=0;
  17. float  PIDoutvalue=0;                          //PID運算輸出值
  18. int    duty=0;                                 //PWM波占空比

  19. void Delay1ms(unsigned int c )                //1ms延遲函數                  
  20. {
  21.     unsigned int i;
  22.    
  23.     while(c--!=0)                             //一個while循環占用3個機器周期
  24.         for(i=0;i<3000;i++);                   //一條for循環占用4個機器周期
  25. }

  26. void InitLED(void)
  27. {
  28.     PD_DDR|=0x60;  //設置PD5、PD6為輸出模式
  29.     PD_CR1|=0x60;  //設置PD5、PD6為推挽輸出
  30. }


  31. //1KHZ PWM頻率;//上橋臂PWM---PC1\PC2\PC3;下橋臂PWM---PB0\PB1\PB2
  32. void InitTIM1_PWM(void)  //16 位高級控制定時器(TIM1);定時器16MHz基準; 只使用了CC1P通道
  33. {
  34.                    //分頻,1分頻; 計數器的時鐘頻率(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)
  35.     TIM1_PSCRH=0;  //預分頻器高8位(TIM1_PSCRH)
  36.     TIM1_PSCRL=0;  //預分頻器低8位(TIM1_PSCRL)
  37.      
  38.     TIM1_ARRH=ArrPwmVal/256;
  39.     TIM1_ARRL=ArrPwmVal%256;
  40.    
  41.     TIM1_CR1 = 0x04;   //DIR0:向上計數;URS=1:寄存器被更新時,產生更新中斷
  42.     TIM1_CCMR1 = 0x60; //PWM1模式,禁止預裝載
  43.    
  44.     TIM1_CCER1=0x01;   //CH1通道輸出PWM使能,高電平有效

  45.     TIM1_BKR|=0x80;    //使能PWM輸出 //0x80;使能OC和OCN輸出;MOE: 主輸出使能
  46.    
  47.            
  48.     TIM1_CR1 |= 0x01;  //使能定時計數器
  49. }


  50. void TIM2_Init(unsigned int psc,unsigned int arr)  //psc  分頻系數  arr  計數值
  51. {
  52.     TIM2_CR1 = 0x00;       //向上計數   中斷繼續計數   關閉計數器
  53.     TIM2_IER = 0x01;       //UIE=1:允許更新中斷
  54.     TIM2_PSCR = psc;       //fMASTER/2^psc;
  55.     TIM2_ARRH = arr/256;
  56.     TIM2_ARRL = arr%256;
  57.     TIM2_CR1 |=0x01;       //開始計數
  58.   
  59. }

  60. void InitEXTI(void)  //PE0作為外中斷輸入
  61. {                     //PEx對應EXTI4_IRQHandler
  62.     EXTI_CR2=0x02;   //PE端口下降沿觸發中斷
  63.     PE_DDR&=0xFE;    //PE0為輸入模式
  64.     PE_CR1|=0x01;    //PE0上拉
  65.     PE_CR2|=0x01;    //PE0使能外部中斷
  66. }

  67. /**************************************************************************
  68. 函數功能:位置式PID控制器
  69. 入口參數:編碼器測量位置信息,目標位置
  70. 返回  值:sum
  71. 根據位置式離散PID公式
  72. pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
  73. e(k)代表本次偏差
  74. e(k-1)代表上一次的偏差  
  75. ∑e(k)代表e(k)以及之前的偏差的累積和;
  76. pwm代表輸出
  77. **************************************************************************/
  78. float Position_PID (float set_value,float feedback_value)
  79. {        
  80.      static float error,sum,Integral_part,pre_error;
  81.    
  82.      error=set_value-feedback_value;                       //計算偏差
  83.      Integral_part+=error;                                       //求出偏差的積分
  84.      if(Integral_part>15000) Integral_part=15000;
  85.      if(Integral_part<0) Integral_part=0;
  86.      sum=Kp*error+Ki*Integral_part+Kd*(error-pre_error);   //位置式PID控制器
  87.      pre_error=error;                                      //保存上一次偏差
  88.    
  89.      if(sum<0)
  90.        sum=0;
  91.      
  92.      PIDoutvalue=sum;
  93.       
  94.      return sum;                                           //增量輸出
  95. }



  96. void main( void )
  97. {
  98.     CLK_CKDIVR=0x00;      //HSI不分頻,主時鐘16M  
  99.    
  100.     InitLED();
  101.     InitTIM1_PWM();
  102.     InitEXTI();
  103.    
  104.     asm("sim");          //disable all interrupt  EA=0;
  105.     TIM2_Init(8,62499);  // 定時器2中斷周期: 2^8/16M *62500=1s;  
  106.     asm("rim");          //開中斷
  107.    
  108.     frequency=0;
  109.    
  110.     while(1)
  111.     {   
  112.         sample_velocity=frequency;
  113.       //  pwmvalue=(int)Position_PID(set_velocity,sample_velocity);
  114.         
  115.         if(pwmvalue<0)
  116.             pwmvalue=0;
  117.         if(pwmvalue>15900)
  118.             pwmvalue=15900;         //PWM限幅
  119.       
  120.            
  121.         TIM1_CCR1H = pwmvalue/256;  //PWM1通道占空比寄存器賦值
  122.         TIM1_CCR1L = pwmvalue%256;
  123.         
  124.         duty=pwmvalue/160;          //占空比duty=pwmvalue/16000 *100%;
  125.         
  126.         Delay1ms(10);               //轉速閉環控制周期:10ms;

  127.     }

  128. }



  129. #pragma vector=0x09   // 9:  EXTI4  端口E外部中斷
  130. __interrupt void EXTI4_IRQHandler(void) //PE
  131. {
  132.     pulsecount++;
  133. }

  134. #pragma vector=15
  135. __interrupt void TIM2_OVER_INT(void)
  136. {
  137.     TIM2_SR1 = 0x00;
  138.    
  139.     frequency=pulsecount;   //電機旋轉1周輸出6個脈沖
  140.     pulsecount=0;
  141.    
  142.     PD_ODR ^=0x60;            //PD5、PD6閃爍
  143.    
  144. }
復制代碼
  1. //#include "iostm8s103k3.h"
  2. #include "iostm8s207r8.h"



  3. //207單片機; 連上仿真器后,ST-LINK-->Option Bytes: AFR5,右鍵-->Alternate Active,使PB0/PB1/PB2為PWM輸出端口功能。
  4. //16KHZ PWM頻率
  5. //上橋臂PWM---PC1\PC2\PC3
  6. //下橋臂PWM---PB0\PB1\PB2
  7. //用杜邦線把PB0與PD5連接起來;先下載程序,再連線;
  8. //下載運行后,View-->Livewatch,改變pwmvalue1的值,改變PWM1占空比,觀察LED1的亮度;

  9. static const unsigned int ArrPwmVal = 1000; //PWM信號周期; 1000
  10. unsigned int pwm1value=500;


  11. void InitTIM1_PWM(void)  //16 位高級控制定時器(TIM1);1us定時器時鐘基準
  12. {
  13.                    //分頻,1分頻; 計數器的時鐘頻率(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)
  14.     TIM1_PSCRH=0;  //預分頻器高8位(TIM1_PSCRH)
  15.     TIM1_PSCRL=15;  //預分頻器低8位(TIM1_PSCRL)
  16.      
  17.     TIM1_ARRH=ArrPwmVal/256;
  18.     TIM1_ARRL=ArrPwmVal%256;
  19.    
  20.     TIM1_CR1 = 0x04;   //DIR0:向上計數;URS=1:寄存器被更新時,產生更新中斷
  21.     TIM1_CCMR1 = 0x60; //PWM1模式,禁止預裝載
  22.    
  23.     TIM1_CCER1=0x05;   //CH1、CH2通道輸出PWM使能,高電平有效

  24.     TIM1_BKR|=0x80;    //使能PWM輸出 //0x80;使能OC和OCN輸出;MOE: 主輸出使能
  25.     TIM1_DTR=16;       //死區62.5ns*16=1us
  26.    
  27.            
  28.     TIM1_CR1 |= 0x01;  //使能定時計數器
  29. }




  30. void main( void )
  31. {
  32.   
  33.   CLK_CKDIVR=0x00;//HSI不分頻,主時鐘16M  
  34.   InitTIM1_PWM();
  35.   
  36.   while(1)
  37.   {
  38.       TIM1_CCR1H = pwm1value/256;  //PWM1通道占空比10%
  39.       TIM1_CCR1L = pwm1value%256;     
  40.       
  41.   }

  42. }
復制代碼

所有資料51hei提供下載:
直流電機伺服控制設計訓練.zip (1.29 MB, 下載次數: 23)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品视频一区二区三区在线观看 | 国产99免费 | 欧美aaa| 国产成人免费视频网站高清观看视频 | 欧美视频在线观看 | 欧美日韩免费一区二区三区 | 亚洲精品视频一区 | 免费国产视频在线观看 | 视频一二区 | 成人av大全 | 三级在线视频 | 国产欧美性成人精品午夜 | 国产视频久久 | 久久国产精品一区二区三区 | 成人欧美一区二区三区在线观看 | 日本三级网站在线观看 | 九一在线| 日韩中文字幕一区 | 黄色av一区 | 日韩欧美在线一区 | 久草视频在线播放 | 亚洲精品国产精品国自产在线 | 精品综合久久久 | 欧美日韩一区二区电影 | 欧美激情国产精品 | 夜夜艹| 成人在线播放网址 | 亚洲成人一区二区三区 | 亚洲一区二区三区久久久 | av中文字幕网站 | 国产精品欧美一区二区三区 | 久久一日本道色综合久久 | 天天综合网天天综合色 | 久久之精品 | 国产精品一区三区 | 精品久久久久久久久久久久 | 国产成人99久久亚洲综合精品 | 免费一级欧美在线观看视频 | 国产精品亚洲一区 | 日韩成人一区 | 成人综合一区二区 |