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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8161|回復: 4
打印 上一主題 下一主題
收起左側(cè)

基于STC8A8K單片機的PID舵機小車控制程序源碼

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:375898 發(fā)表于 2018-7-20 15:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己為電賽寫的 沒用到~

單片機源程序如下:
  1. #include<stc8.h>
  2. #include<math.h>
  3. #define PWMA1   P20
  4. #define PWMA2   P21
  5. #define PWMB1   P22
  6. #define PWMB2   P23
  7. #define SERVO   P24  //舵機引腳
  8. #define u8 unsigned char
  9. #define T 0.156f
  10. #define L 0.1445f
  11. #define K 3.114f
  12. #define PI 3.14159265
  13. int Encoder_Left,Encoder_Right;             //左右編碼器的脈沖計數(shù)
  14. float Velocity,Velocity_Set,Angle,Angle_Set;
  15. unsigned long count0,count1,count2,count3,Sensor;//編碼器脈沖計數(shù)
  16. int Motor_A,Motor_B,Servo,Target_A,Target_B;  //電機舵機控制相關(guān)   
  17. /**************************************************************************
  18. 函數(shù)功能:絕對值函數(shù)
  19. 入口參數(shù):int
  20. 返回  值:unsigned int
  21. **************************************************************************/
  22. int myabs(int a)//絕對值函數(shù)
  23. {                    
  24.           int temp;
  25.                 if(a<0)  temp=-a;  
  26.           else temp=a;
  27.           return temp;
  28. }
  29. /**************************************************************************
  30. 函數(shù)功能:電機舵機占空比
  31. **************************************************************************/
  32. void LmotorPWM(u8 D0,u8 D1)//左電機PWM占空比
  33. {
  34.   P_SW2=0X80;
  35.         PWMCKS=0X09;//PWM時鐘為系統(tǒng)時鐘
  36.         PWMC=0XFD3F;//設置PWM周期為64831個脈沖,T=20MS,
  37.         PWM0T1=D0*648;
  38.         PWM1T1=D1*648;
  39.         PWM0CR=0X80;//使能PWM0輸出,且初始電平為低電平
  40.         PWM1CR=0X80;//使能PWM1輸出,且初始電平為低電平
  41.         P_SW2=0X00;
  42.         PWMCR=0X80;
  43. }
  44. void RmotorPWM(u8 D2,u8 D3)//右電機PWM占空比
  45. {
  46.   P_SW2=0X80;
  47.         PWMCKS=0X0E;//PWM時鐘為系統(tǒng)時鐘
  48.         PWMC=0XFD3F;//設置PWM周期為12C0H個脈沖,T=200US
  49.         PWM2T1=D2*648;
  50.         PWM3T1=D3*648;
  51.         PWM2CR=0X80;//使能PWM2輸出,且初始電平為低電平
  52.         PWM3CR=0X80;//使能PWM3輸出,且初始電平為低電平
  53.         P_SW2=0X00;
  54.         PWMCR=0X80;
  55. }
  56. void DJPWM(u8 D4)//舵機PWM占空比
  57. {
  58.   P_SW2=0X80;
  59.         PWMCKS=0X0E;//PWM時鐘為系統(tǒng)時鐘
  60.         PWMC=0XFD3F;//設置PWM周期為12C0H個脈沖,T=200US
  61.         PWM4T2=0x0380;//在0.5MS時賦值高電平
  62.         PWM4T1=0x0380+17.7*D4;
  63.         PWM4CR=0X80;//使能PWM2輸出,且初始電平為低電平
  64.         P_SW2=0X00;
  65.         PWMCR=0X80;
  66. }
  67. /**************************************************************************
  68. 函數(shù)功能:小車運動學分析
  69. **************************************************************************/
  70. void Analysis(float velocity,float angle)
  71. {
  72.                 Target_A=velocity*(1+T*tan(angle)/2/L);
  73.                 Target_B=velocity*(1-T*tan(angle)/2/L);      //后輪差速
  74.                 Servo=9+angle*K;                    //舵機轉(zhuǎn)向   
  75. }
  76. /**************************************************************************
  77. 函數(shù)功能:占空比設置
  78. **************************************************************************/
  79. void Set_Pwm(int motor_a,int motor_b,int servo)
  80. {

  81.             if(motor_a<0)                        PWMA1=90,PWMA2=90+motor_a;
  82.                         else                     PWMA2=90,PWMA1=90-motor_a;
  83.                
  84.                   if(motor_b<0)                        PWMB1=90,PWMB2=90+motor_b;
  85.                         else                     PWMB2=90,PWMB1=90-motor_b;
  86.      SERVO=servo;        
  87. }
  88. /**************************************************************************
  89. 函數(shù)功能:電機PI控制
  90. **************************************************************************/
  91. int PI_A (int Encoder,int Target)
  92. {         
  93.          static int Bias,Pwm,Last_bias;
  94.          Bias=Target-Encoder;                //計算偏差
  95.          Pwm+=0.015*(Bias-Last_bias)+0.015*Bias;   //增量式PI控制器
  96.          Last_bias=Bias;                           //保存上一次偏差
  97.          return Pwm;                         //增量輸出
  98. }
  99. int PI_B (int Encoder,int Target)
  100. {         
  101.          static int Bias,Pwm,Last_bias;
  102.          Bias=Target-Encoder;                //計算偏差
  103.          Pwm+=0.015*(Bias-Last_bias)+0.015*Bias;   //增量式PI控制器
  104.          Last_bias=Bias;                           //保存上一次偏差
  105.          return Pwm;                         //增量輸出
  106. }
  107. /**************************************************************************
  108. 函數(shù)功能:電機占空比限制幅度
  109. **************************************************************************/
  110. void Xianfu_Pwm(void)
  111. {        
  112.           int Amplitude=90;    //===PWM滿幅是90 限制在90
  113.     if(Motor_A<-Amplitude) Motor_A=-Amplitude;        
  114.                 if(Motor_A>Amplitude)  Motor_A=Amplitude;        
  115.           if(Motor_B<-Amplitude) Motor_B=-Amplitude;        
  116.                 if(Motor_B>Amplitude)  Motor_B=Amplitude;               
  117.                 if(Servo<(0))     Servo=0;          //舵機限幅
  118.                 if(Servo>(120))    Servo=120;                  //舵機限幅
  119. }
  120. /**************************************************************************
  121. 函數(shù)功能:計算偏差角度
  122. **************************************************************************/
  123. void Get_RC(void)
  124. {
  125.         static float Bias,Last_Bias;
  126.         Velocity=45;          //電磁巡線模式下的速度
  127.         Bias=45-Sensor;  //提取偏差
  128.         Angle=myabs(Bias)*Bias*0.0002+Bias*0.001+(Bias-Last_Bias)*0.05; //PI控制
  129.         Last_Bias=Bias;   //上一次的偏差
  130.         
  131. }
  132. /**************************************************************************
  133. 函數(shù)功能:編碼器計數(shù)
  134. **************************************************************************/
  135. void PCA_C()
  136. {
  137. count0=0;
  138. count1=0;
  139. CCON=0X00;
  140. CMOD=0X09;//設定為系統(tǒng)時鐘,使能PCA溢出中斷
  141. CL=0X00;
  142. CH=0X00;
  143. CCAPM0=0X21;//設置PCA0模塊為16位捕獲模式,且為上升沿捕獲
  144. CCAPM1=0X21;//設置PCA1模塊為16位捕獲模式,且為上升沿捕獲
  145. CCAPM2=0X21;//設置PCA2模塊為16位捕獲模式,且為上升沿捕獲
  146. CCAPM3=0X21;//設置PCA3模塊為16位捕獲模式,且為上升沿捕獲
  147. CCAP0L=0X00;
  148. CCAP0H=0X00;
  149. CCAP1L=0X00;
  150. CCAP1H=0X00;
  151. CCAP2L=0X00;
  152. CCAP2H=0X00;
  153. CCAP3L=0X00;
  154. CCAP3H=0X00;
  155. CR=1;//啟動PCA
  156. EA=1;
  157. }
  158. /**************************************************************************
  159. 函數(shù)功能:電機運動控制算法
  160. **************************************************************************/
  161. void control(void)  
  162. {   
  163.           Encoder_Left=count0;        //===讀取編碼器的值                 //為了保證M法測速的時間基準,首先讀取編碼器數(shù)據(jù)
  164.                 Encoder_Right=count1;       //===讀取編碼器的值
  165.                 Get_RC();
  166.                 Analysis(Velocity,Angle);                     //小車運動學分析   
  167.                 Motor_A=PI_A(Encoder_Left,Target_A);     //===速度閉環(huán)控制計算電機A最終PWM
  168.                 Motor_B=PI_B(Encoder_Right,Target_B);    //===速度閉環(huán)控制計算電機B最終PWM
  169.                 Xianfu_Pwm();            //===PWM限幅
  170.                 Set_Pwm(Motor_A,Motor_B,Servo);    //===賦值給PWM寄存器           
  171. }

  172. void main()
  173. {
  174.                 while(1)
  175.         {
  176.                 control();
  177.                 LmotorPWM(PWMA1,PWMA2);
  178.                 RmotorPWM(PWMB1,PWMB2);
  179.                 DJPWM(Servo);//0-120度
  180.                 PCA_c();
  181.         }
  182. }
  183. void PCA() interrupt 7 using 1//編碼器中斷
  184. {
  185. if(CCF0)
  186. {
  187.         CCF0=0;
  188.         count0++;        
  189. }
  190. if(CCF1)
  191. {
  192.         CCF1=0;
  193.         count1++;
  194. }
  195. if(CCF2)
  196. {
  197.         CCF2=0;
  198.         count1++;
  199. }
  200. if(CCF3)
  201. {
  202.         CCF3=0;
  203.         count1++;
  204. }
  205. }
復制代碼

所有資料51hei提供下載:
STC8電機控制.zip (71.69 KB, 下載次數(shù): 117)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:487103 發(fā)表于 2019-4-22 00:23 | 只看該作者
很好的資料,加油
回復

使用道具 舉報

板凳
ID:587285 發(fā)表于 2019-7-20 11:20 | 只看該作者

輸出口是哪個啊
回復

使用道具 舉報

地板
ID:587285 發(fā)表于 2019-7-20 11:21 | 只看該作者
該怎么接單片機啊,求大佬解釋
回復

使用道具 舉報

5#
ID:462629 發(fā)表于 2021-12-28 10:00 | 只看該作者
能補全電路原理圖,源碼嗎
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产一区二区三区不卡 | 欧美一区二区三区视频 | 精品三级在线观看 | 日韩在线综合 | 一区视频| 九九激情视频 | www视频在线观看 | 一级毛片在线播放 | 999热精品视频 | 韩日在线视频 | 99久久精品国产一区二区三区 | 99久久免费观看 | 欧美日韩视频 | 浴室洗澡偷拍一区二区 | 亚洲人人| 亚洲一区二区久久 | 欧美日韩网站 | 玖玖久久 | 久久亚洲天堂 | 精品日韩一区二区 | 一区在线视频 | 91精品久久久久久久久久小网站 | 久久精品在线播放 | 亚洲一区二区久久 | 在线男人天堂 | 国产精品国产成人国产三级 | 久久久久国产一区二区三区四区 | 午夜国产一级 | 国产精品不卡 | wwwww在线观看 | 久久草视频 | 日韩无 | 欧洲av在线| 欧美激情国产日韩精品一区18 | 精品久久成人 | 日本免费在线观看视频 | 欧美成人精品一区二区男人看 | 99亚洲视频 | 日韩视频―中文字幕 | 精久久久 | 国产二区精品视频 |