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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的平衡車源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:855478 發表于 2021-1-8 16:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這份代碼是國賽的時候用的,也算是一個豪華的平衡車,里面有很多算法值得初學者學習。
所有的輸入設備建議加一個二極管

STC8G8K64S4主板IO分配推薦
編碼器2個
DIR  P50
LSB CTIM0_P34

DIR  P51
LSB CTIM3_P04


ICM20602:
SPC    P25
SDI    P23
SDO    P24
CS    P27


SPI屏幕引腳:
SCL    P25
SDA    P23
RST    P32
DC    P33
CS    P35
BL    P36

2個電機:
P00
P01

P22
P26


線性CCD(第一個):
CLK: P20
SI:     P21
AO:P05

線性CCD(第二個):
CLK: P20
SI:     P21
AO:P06

單片機源程序如下:
  1. /********************* 節能管腳分配 *******************************************

  2. REST    P54   
  3. LED            P47
  4. LED            P15
  5. ---------------------------------------------------------------------------
  6. 下載口:
  7. R        P30
  8. T        P31
  9. UART3: 調試口
  10. R        P50
  11. T        P51
  12. UART4: 上位機
  13. R        P52
  14. T        P53
  15. ---------------------------------------------------------------------------
  16. 模擬MPU6050:
  17. SCL         P32
  18. SDA         P33
  19. MPUIT   
  20. ---------------------------------------------------------------------------
  21. ENCODER:
  22. L        DIR:P05     TIM3_CIN:P04         
  23. R        DIR:P07     TIM4_CIN:P06
  24. ---------------------------------------------------------------------------
  25. MOTOR_PWMXX: select P2
  26. L        P20  P21
  27. R        P22  P23
  28. 備用        P24  P25  P26        P27
  29. STC8A  一共1個PWM模塊 可以輸出8路頻率相同的PWM波  這8路PWM每路可以映射在三個管腳上面       
  30. channel     n = 2     n = 1    n = 6
  31. PWM00       P2_0      P1_0     P6_0  
  32. PWM01       P2_1      P1_1     P6_1
  33. PWM02       P2_2      P1_2     P6_2
  34. PWM03       P2_3      P1_3     P6_3
  35. PWM04       P2_4      P1_4     P6_4
  36. PWM05       P2_5      P1_5     P6_5
  37. PWM06       P2_6      P1_6     P6_6
  38. PWM07       P2_7      P1_7     P6_7
  39. ---------------------------------------------------------------------------
  40. ADCX: select P1
  41. 0     P1.0         
  42. 1     P1.1        
  43. 2     P1.2         
  44. 3     P1.3         
  45. 4     P1.4         
  46. 5     P1.5
  47. 6          P1.6
  48. 7          P1.7
  49. SCT8G/STC8A 有15個ADC通道 每個通道對應管腳如下
  50. 0     P1.0          8  P0.0
  51. 1     P1.1          9  P0.1
  52. 2     P1.2          10 P0.2
  53. 3     P1.3          11 P0.3
  54. 4     P1.4          12 P0.4
  55. 5     P1.5          13 P0.5
  56. 6     P1.6          14 P0.6
  57. 7     P1.7          15 測試內部 1.19V
  58. ---------------------------------------------------------------------------
  59. INT:
  60. INT0        P32
  61. INT1        P33
  62. INT2        P36
  63. INT3        P37
  64. ---------------------------------------------------------------------------
  65. timer:
  66. timer0       
  67. timer1
  68. tiemr2        串口波特率發生器
  69. timer3        P37
  70. timer4  
  71. ---------------------------------------------------------------------------
  72. */
  73. #include "headfile.h"

  74. //board.h文件中FOSC設置內部晶振頻率為35Mhz
  75. //使用stc-isp工具下載程序的時候需要將IRC頻率設置為35Mhz

  76. int16 send[6];             //上位機數組
  77. int16 sec;                 //小車運行時間
  78. float power;               //電源的電壓值
  79. char rec;                  //調試串口值
  80. float K1=0.04;                  //互補濾波加權值   注意:這里原始值是0.03,可能需要更改
  81. float Balance_Kp=600,Balance_Kd=-10,Velocity_Kp=-6,Velocity_Ki=-0.05;//PID參數
  82. float Angle_Balance,Gyro_Balance,Gyro_Turn; //平衡傾角 平衡陀螺儀 轉向陀螺儀
  83. int Encoder_Left,Encoder_Right;             //左右編碼器的脈沖計數
  84. long int Balance_Pwm,Velocity_Pwm,Turn_Pwm;      //直立環 速度環  轉向環的pwm
  85. char delay_50,delay_flag;
  86. char oled_show,rtu_show;
  87. Inductance ppInductance;
  88. Inductance *psInductance;
  89. float Kp=30,Kd=12;  //轉向環PD參數
  90. int Velocity_target;
  91. float zhongzhi;
  92. int distance_garage,distance_huandao;
  93. char flag,strong_flag,huandao_flag_num;
  94. float power_bili;
  95. char stop_flag;

  96. void main()
  97. {
  98.         RSTCFG = 0x50;      //自動下載和復位
  99.        
  100.         /**********數據初始化****************/
  101.         psInductance=&ppInductance;
  102.         stop_flag=0;
  103.         sec=0;
  104.   power=0;
  105.         rec='p';
  106.         Encoder_Left=Encoder_Right=0;
  107.         oled_show=1;
  108.         rtu_show=1;
  109.         Velocity_target=1000;
  110.         Velocity_Pwm=0;
  111.         zhongzhi=-6;
  112.         flag=2;
  113.         strong_flag=2;
  114.         distance_garage,distance_huandao=0;
  115.         psInductance->InductanceGYHC_MAX=0;
  116.   psInductance->dir_sum=0;
  117.         huandao_flag_num=0;
  118.         /***********************************/
  119.        
  120.         DisableGlobalIRQ();        //關閉總中斷
  121.         board_init();                //初始化內部寄存器
  122.        
  123.        
  124.         /**********硬件外設初始化************/
  125.   gpio_mode(led1, GPO_PP);
  126.         gpio_mode(led2, GPO_PP);

  127.   gpio_mode(key1, GPI_IMPEDANCE);
  128.         gpio_mode(key2, GPI_IMPEDANCE);
  129.   gpio_mode(key3, GPI_IMPEDANCE);
  130.         gpio_mode(key4, GPI_IMPEDANCE);

  131.         gpio_mode(P00, GPI_IMPEDANCE);
  132.         gpio_mode(P01, GPI_IMPEDANCE);
  133.         gpio_mode(P02, GPI_IMPEDANCE);
  134.         gpio_mode(P03, GPI_IMPEDANCE);       
  135.         gpio_mode(P05, GPI_IMPEDANCE);
  136.         gpio_mode(P07, GPI_IMPEDANCE);
  137.         gpio_mode(P10, GPI_IMPEDANCE);
  138.         gpio_mode(P16, GPI_IMPEDANCE);
  139.        
  140.         gpio_mode(P04, GPI_IMPEDANCE);
  141.         gpio_mode(P34, GPI_IMPEDANCE);       
  142.        
  143.         gpio_mode(P06, GPI_IMPEDANCE);
  144.         gpio_mode(P35, GPI_IMPEDANCE);
  145.        
  146.         gpio_mode(P23, GPO_PP);
  147.         gpio_mode(P22, GPO_PP);
  148.         gpio_mode(P21, GPO_PP);
  149.         gpio_mode(P20, GPO_PP);
  150.         gpio_mode(P44, GPO_PP);

  151.         gpio_mode(PWM1_P11, GPO_PP);
  152.         gpio_mode(PWM1_P12, GPO_PP);
  153.         gpio_mode(PWM1_P13, GPO_PP);
  154.         gpio_mode(PWM1_P14, GPO_PP);
  155.        
  156.         pwm_init(PWM1_P11,500, 0);
  157.         pwm_init(PWM1_P12,500, 0);
  158.         pwm_init(PWM1_P13,500, 0);
  159.         pwm_init(PWM1_P14,500, 0);
  160.        
  161.         adc_init(ADC_P10,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  162.         adc_init(ADC_P00,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  163.         adc_init(ADC_P01,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  164.         adc_init(ADC_P02,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  165.         adc_init(ADC_P03,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  166.         adc_init(ADC_P05,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  167.         adc_init(ADC_P16,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  168.   mpu6050_init();
  169.         oled_init();
  170.        
  171.         ctimer_count_init(CTIM0_P34);       
  172.         ctimer_count_init(CTIM4_P06);       
  173.         //uart_init(UART_3, UART3_RX_P50,UART3_TX_P51, 115200, TIM_2);
  174.         uart_init(UART_4, UART4_RX_P52,UART4_TX_P53, 115200, TIM_2);
  175.        
  176.         /***********************************/
  177.        
  178.         /**********軟件外設初始化************/       
  179.   exit_init(INT2_P36,FALLING_EDGE);
  180. //  exit_init(INT3_P37,FALLING_EDGE);       
  181.         pca_dealy_init();
  182. //        pca_init_interrupt_ms(PCA_0, 40);        //使用PCA_0作為周期中斷,時間1ms一次
  183.   pit_timer_ms(TIM_1,10);                  //定時器1
  184.         /***********************************/       
  185.        
  186.         adc_init(ADC_P10,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  187.         adc_init(ADC_P00,          ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  188.         adc_init(ADC_P01,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  189.         adc_init(ADC_P02,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  190.         adc_init(ADC_P05,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  191.         adc_init(ADC_P16,         ADC_SYSclk_DIV_2);        //初始化ADC,P1.0通道 ,ADC時鐘頻率:SYSclk/2
  192.   while(power<6.4)
  193.         {
  194.           power=12.12*adc_once(ADC_P16, ADC_10BIT)/1050;
  195.           oled_printf_float(80,6,power,3,2);
  196.                 if(key1==0)    Velocity_target=130;
  197.                 if(key2==0)    Velocity_target=160;
  198.                 if(key3==0)    Velocity_target=200;
  199.         }
  200.        
  201. EnableGlobalIRQ();        //開啟總中斷       
  202.        
  203.     while(1)          //50ms一個精確循環
  204.         {               
  205.         if(oled_show==1)
  206.         {
  207.                 oled_uint16(0,0, psInductance->InductanceAveNowA);
  208.                 oled_uint16(0,1, psInductance->InductanceAveNowB);       
  209.                 oled_uint16(0,2, psInductance->InductanceAveNowC);       
  210.                 oled_uint16(0,3, psInductance->InductanceAveNowD);       
  211.                 oled_uint16(0,4, psInductance->InductanceAveNowE);               
  212.                 oled_int16(0,5, psInductance->dir);               
  213.                 oled_int16(0,6, mpu_acc_x/48);               
  214. //                oled_uint16(0,4, psInductance->InductanceAveNowE);
  215. //               
  216.                 oled_uint16(60,0, psInductance->InductanceGYHA);
  217.                 oled_uint16(60,1, psInductance->InductanceGYHB);
  218.                 oled_uint16(60,2, psInductance->InductanceGYHC);       
  219.                 oled_uint16(60,3, psInductance->InductanceGYHD);
  220.                 oled_uint16(60,4, psInductance->InductanceGYHE);
  221.     oled_uint16(60,5,flag);
  222.     oled_printf_float(60,6,power,3,2);
  223.         }
  224.         if(rtu_show==1)
  225.         {
  226.     send[0]=Velocity_Pwm;    //mpu_gyro_z
  227.                 send[1]=Balance_Pwm;
  228.                 send[2]=Encoder_Left;                
  229.                 send[3]=Encoder_Right;         //注意這是平衡方向的加速度計
  230.                 send[4]=Angle_Balance;         //注意這是平衡方向的加速度計
  231.           rtu_send_data(send,5);
  232.         }
  233.           if(rec=='A')
  234.                 {
  235.                         Balance_Kd+=0.5;
  236.                         rec='p';
  237.                 }
  238.                         if(rec=='B')
  239.                         {                       
  240.                         Balance_Kd-=0.5;
  241.                         rec='p';
  242.                         }
  243.                         delay_flag = 1;
  244.       delay_50   = 0;
  245.     while(delay_flag);
  246.   }
  247. }


  248. //三電感AC先比較判斷偏左還是偏右  然后用左循跡AB或者右循跡BC差比和
復制代碼

所有程序51hei提供下載:
8.12 2.2米.zip (863.79 KB, 下載次數: 57)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:295290 發表于 2023-4-13 15:46 | 只看該作者
感謝分享!要是有個原理圖就完美了!
回復

使用道具 舉報

板凳
ID:1091382 發表于 2023-9-4 18:13 | 只看該作者
全是代碼,沒有實物圖怎么搞?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99视频免费在线观看 | 欧美一区二区三区四区五区无卡码 | 黄色毛片在线观看 | 91精品国产乱码久久久 | 婷婷久久综合 | 欧美综合色 | .国产精品成人自产拍在线观看6 | 日韩在线视频观看 | 91久久国产综合久久 | 奇米四色影视 | 蜜桃精品视频在线 | 国产成人综合一区二区三区 | 99国产精品一区二区三区 | 亚洲综合一区二区三区 | 亚洲天堂中文字幕 | 国产精久久久久久久妇剪断 | 天天久 | 国产黄色大片在线免费观看 | 中文字幕亚洲一区 | 精品久久久久国产免费第一页 | 亚洲久草视频 | 成人av看片 | 一区二区精品视频 | 欧美一级毛片免费观看 | 在线永久看片免费的视频 | 欧美激情一区二区 | 蜜桃精品视频在线 | 成人免费大片黄在线播放 | 一区二区三区精品 | 午夜国产| 成人深夜福利 | 中文字幕高清一区 | 婷婷开心激情综合五月天 | 在线免费观看黄色 | 亚洲精品一区二区另类图片 | 美女久久久 | 嫩草网| 久99久视频 | 一区二区三区免费在线观看 | 久久久久久久久一区 | 国产精品片aa在线观看 |