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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8070|回復(fù): 4
收起左側(cè)

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

  [復(fù)制鏈接]
ID:375898 發(fā)表于 2018-7-20 15:06 | 顯示全部樓層 |閱讀模式
自己為電賽寫的 沒用到~

單片機(jī)源程序如下:
  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  //舵機(jī)引腳
  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;             //左右編碼器的脈沖計(jì)數(shù)
  14. float Velocity,Velocity_Set,Angle,Angle_Set;
  15. unsigned long count0,count1,count2,count3,Sensor;//編碼器脈沖計(jì)數(shù)
  16. int Motor_A,Motor_B,Servo,Target_A,Target_B;  //電機(jī)舵機(jī)控制相關(guān)   
  17. /**************************************************************************
  18. 函數(shù)功能:絕對(duì)值函數(shù)
  19. 入口參數(shù):int
  20. 返回  值:unsigned int
  21. **************************************************************************/
  22. int myabs(int a)//絕對(duì)值函數(shù)
  23. {                    
  24.           int temp;
  25.                 if(a<0)  temp=-a;  
  26.           else temp=a;
  27.           return temp;
  28. }
  29. /**************************************************************************
  30. 函數(shù)功能:電機(jī)舵機(jī)占空比
  31. **************************************************************************/
  32. void LmotorPWM(u8 D0,u8 D1)//左電機(jī)PWM占空比
  33. {
  34.   P_SW2=0X80;
  35.         PWMCKS=0X09;//PWM時(shí)鐘為系統(tǒng)時(shí)鐘
  36.         PWMC=0XFD3F;//設(shè)置PWM周期為64831個(gè)脈沖,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)//右電機(jī)PWM占空比
  45. {
  46.   P_SW2=0X80;
  47.         PWMCKS=0X0E;//PWM時(shí)鐘為系統(tǒng)時(shí)鐘
  48.         PWMC=0XFD3F;//設(shè)置PWM周期為12C0H個(gè)脈沖,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)//舵機(jī)PWM占空比
  57. {
  58.   P_SW2=0X80;
  59.         PWMCKS=0X0E;//PWM時(shí)鐘為系統(tǒng)時(shí)鐘
  60.         PWMC=0XFD3F;//設(shè)置PWM周期為12C0H個(gè)脈沖,T=200US
  61.         PWM4T2=0x0380;//在0.5MS時(shí)賦值高電平
  62.         PWM4T1=0x0380+17.7*D4;
  63.         PWM4CR=0X80;//使能PWM2輸出,且初始電平為低電平
  64.         P_SW2=0X00;
  65.         PWMCR=0X80;
  66. }
  67. /**************************************************************************
  68. 函數(shù)功能:小車運(yùn)動(dòng)學(xué)分析
  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;                    //舵機(jī)轉(zhuǎn)向   
  75. }
  76. /**************************************************************************
  77. 函數(shù)功能:占空比設(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ù)功能:電機(jī)PI控制
  90. **************************************************************************/
  91. int PI_A (int Encoder,int Target)
  92. {         
  93.          static int Bias,Pwm,Last_bias;
  94.          Bias=Target-Encoder;                //計(jì)算偏差
  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;                //計(jì)算偏差
  103.          Pwm+=0.015*(Bias-Last_bias)+0.015*Bias;   //增量式PI控制器
  104.          Last_bias=Bias;                           //保存上一次偏差
  105.          return Pwm;                         //增量輸出
  106. }
  107. /**************************************************************************
  108. 函數(shù)功能:電機(jī)占空比限制幅度
  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;          //舵機(jī)限幅
  118.                 if(Servo>(120))    Servo=120;                  //舵機(jī)限幅
  119. }
  120. /**************************************************************************
  121. 函數(shù)功能:計(jì)算偏差角度
  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ù)功能:編碼器計(jì)數(shù)
  134. **************************************************************************/
  135. void PCA_C()
  136. {
  137. count0=0;
  138. count1=0;
  139. CCON=0X00;
  140. CMOD=0X09;//設(shè)定為系統(tǒng)時(shí)鐘,使能PCA溢出中斷
  141. CL=0X00;
  142. CH=0X00;
  143. CCAPM0=0X21;//設(shè)置PCA0模塊為16位捕獲模式,且為上升沿捕獲
  144. CCAPM1=0X21;//設(shè)置PCA1模塊為16位捕獲模式,且為上升沿捕獲
  145. CCAPM2=0X21;//設(shè)置PCA2模塊為16位捕獲模式,且為上升沿捕獲
  146. CCAPM3=0X21;//設(shè)置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;//啟動(dòng)PCA
  156. EA=1;
  157. }
  158. /**************************************************************************
  159. 函數(shù)功能:電機(jī)運(yùn)動(dòng)控制算法
  160. **************************************************************************/
  161. void control(void)  
  162. {   
  163.           Encoder_Left=count0;        //===讀取編碼器的值                 //為了保證M法測(cè)速的時(shí)間基準(zhǔn),首先讀取編碼器數(shù)據(jù)
  164.                 Encoder_Right=count1;       //===讀取編碼器的值
  165.                 Get_RC();
  166.                 Analysis(Velocity,Angle);                     //小車運(yùn)動(dòng)學(xué)分析   
  167.                 Motor_A=PI_A(Encoder_Left,Target_A);     //===速度閉環(huán)控制計(jì)算電機(jī)A最終PWM
  168.                 Motor_B=PI_B(Encoder_Right,Target_B);    //===速度閉環(huán)控制計(jì)算電機(jī)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. }
復(fù)制代碼

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:487103 發(fā)表于 2019-4-22 00:23 | 顯示全部樓層
很好的資料,加油
回復(fù)

使用道具 舉報(bào)

ID:587285 發(fā)表于 2019-7-20 11:20 | 顯示全部樓層

輸出口是哪個(gè)啊
回復(fù)

使用道具 舉報(bào)

ID:587285 發(fā)表于 2019-7-20 11:21 | 顯示全部樓層
該怎么接單片機(jī)啊,求大佬解釋
回復(fù)

使用道具 舉報(bào)

ID:462629 發(fā)表于 2021-12-28 10:00 | 顯示全部樓層
能補(bǔ)全電路原理圖,源碼嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产av毛片 | 亚洲综合二区 | 国内自拍视频在线观看 | 影音先锋成人资源 | 一区二区三区四区不卡视频 | 有码一区 | 国产片侵犯亲女视频播放 | 91久久久久| 久久久久国产一区二区三区 | av国产精品毛片一区二区小说 | 亚洲欧美中文字幕在线观看 | 亚洲成人免费在线 | 成人午夜精品一区二区三区 | 在线免费观看黄视频 | av一区二区三区在线观看 | 一本一道久久a久久精品蜜桃 | 中国免费黄色片 | 一区二区三区成人 | 精品一区二区三区中文字幕 | 国产一区二区在线看 | 久久久久久国产 | 国产综合精品一区二区三区 | 国产你懂的在线观看 | 欧美在线观看一区 | 99精品久久99久久久久 | 精品国产乱码久久久久久久久 | 国产日韩欧美激情 | 麻豆久久久 | 国产精品美女久久久 | www.日韩系列| 日本不卡免费新一二三区 | 久久久久久国产精品久久 | 亚洲精品一区二区三区蜜桃久 | 成年免费大片黄在线观看一级 | 嫩草国产 | 国产精品久久久久久婷婷天堂 | 精品国产乱码久久久久久丨区2区 | 久久毛片网站 | 成人欧美日韩一区二区三区 | 欧美一卡二卡在线观看 | 日日摸日日添日日躁av |