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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8446|回復(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ù)功能:絕對值函數(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ù)功能:電機(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法測速的時(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)


評分

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

查看全部評分

回復(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ī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一区二区三区蜜桃视频 | 欧美在线激情 | 国产免费一区二区三区 | 色欧美片视频在线观看 | 玩丰满女领导对白露脸hd | 国产精品成人一区二区三区 | 在线播放亚洲 | 91久久精品一区二区二区 | 国产精品久久久久久久免费观看 | 日本在线一二 | 色久影院 | 在线免费观看成人 | 久久久久久久国产精品 | 免费看黄视频网站 | 国产午夜精品福利 | 天天躁日日躁狠狠躁白人 | 精品欧美一区免费观看α√ | 久久6| av影音资源 | 欧美国产日韩在线观看 | 国产精品自拍视频 | 在线国产精品一区 | 精品国产乱码久久久久久图片 | 精品日本中文字幕 | 中文字幕精品一区二区三区精品 | 欧美精品综合在线 | 日韩在线免费 | 成人午夜精品 | 成人免费视频网站在线观看 | 2018国产大陆天天弄 | 久在线 | 国产精品久久久久久久7电影 | 欧洲一区二区视频 | 日韩久久在线 | 国产亚洲一区二区三区 | 亚洲精品久久久久久久久久久久久 | 亚洲国产一区二区三区, | 欧美日韩一区二区视频在线观看 | 在线免费观看日本视频 | 日本不卡一区二区三区在线观看 | 中文在线一区二区 |