×
单片机 > 单片机程序设计 > 详情

单片机(8bit)的16路舵机调速分析与实现

发布时间:2020-05-26 发布时间:
|
// main.c
[cpp] view plaincopyprint?
 
  1. #include   
  2. #include "ControlRobot.h"  
  3. #include  
  4.   
  5. #define DEBUG_PROTOCOL  
  6.   
  7. typedef unsigned char UCHAR8;  
  8. typedef unsigned int UINT16;  
  9.   
  10. #undef TRUE  
  11. #undef FALSE  
  12. #define TRUE 1  
  13. #define FALSE 0  
  14.   
  15. #define MEMORY_MODEL   
  16.   
  17. UINT16 MEMORY_MODEL delayVar1;  
  18. UCHAR8 MEMORY_MODEL delayVar2;  
  19.   
  20. #define BAUD_RATE 0xF3  
  21.   
  22. #define USED_PIN 2  
  23. #define PIN_GROUP_1 0  
  24. #define PIN_GROUP_2 1  
  25.   
  26. #define GROUP_1_CONTROL_PIN P0  
  27. #define GROUP_2_CONTROL_PIN P2  
  28.   
  29. #define STEERING_ENGINE_CYCLE 2000  
  30. #define STEERING_ENGINE_INIT_DELAY 50  
  31. #define STEERING_ENGINE_FULL_CYCLE ((STEERING_ENGINE_CYCLE) - (STEERING_ENGINE_INIT_DELAY))  
  32.   
  33. volatile UCHAR8 MEMORY_MODEL g_angle[2][ROBOT_JOINT_AMOUNT];  
  34. volatile bit MEMORY_MODEL g_fillingBufferIndex = 0;  
  35. volatile bit MEMORY_MODEL g_readyBufferIndex = 1;  
  36. volatile bit MEMORY_MODEL g_swapBuffer = FALSE;  
  37.   
  38. volatile UINT16 MEMORY_MODEL g_diffAngle[USED_PIN][8];  
  39. volatile UCHAR8 MEMORY_MODEL g_diffAngleMask[USED_PIN][8] =   
  40. {  
  41.     {  
  42.         ROBOT_PIN_MASK_LEFT_SHOULDER_VERTICAL,    
  43.         ROBOT_PIN_MASK_LEFT_SHOULDER_HORIZEN,    
  44.         ROBOT_PIN_MASK_LEFT_ELBOW,    
  45.         ROBOT_PIN_MASK_RIGHT_SHOULDER_VERTICAL,  
  46.         ROBOT_PIN_MASK_RIGHT_SHOULDER_HORIZEN,    
  47.         ROBOT_PIN_MASK_RIGHT_ELBOW,    
  48.         ROBOT_PIN_MASK_LEFT_HIP_VERTICAL,    
  49.         ROBOT_PIN_MASK_RIGHT_HIP_VERTICAL   
  50.     },  
  51.     {  
  52.         ROBOT_PIN_MASK_LEFT_HIP_HORIZEN,    
  53.         ROBOT_PIN_MASK_LEFT_KNEE,    
  54.         ROBOT_PIN_MASK_LEFT_ANKLE,    
  55.         ROBOT_PIN_MASK_LEFT_FOOT,    
  56.         ROBOT_PIN_MASK_RIGHT_HIP_HORIZEN,    
  57.         ROBOT_PIN_MASK_RIGHT_KNEE,    
  58.         ROBOT_PIN_MASK_RIGHT_ANKLE,    
  59.         ROBOT_PIN_MASK_RIGHT_FOOT  
  60.     }  
  61. };  
  62.   
  63. #ifdef DEBUG_PROTOCOL  
  64. sbit P10 = P1 ^ 0;  // 正在填充交换区1  
  65. sbit P11 = P1 ^ 1;  // 正在填充交换区2  
  66. sbit P12 = P1 ^ 2;  // 交换区变换  
  67. sbit P13 = P1 ^ 3;  // 协议是否正确  
  68. #endif   
  69.   
  70. void Delay10us(UINT16 ntimes)  
  71. {  
  72.     for (delayVar1 = 0; delayVar1 
  73.         for (delayVar2 = 0; delayVar2 
  74.             _nop_();       
  75. }  
  76.   
  77. void InitPwmPollint()  
  78. {  
  79.     UCHAR8 i;  
  80.     UCHAR8 j;  
  81.     UCHAR8 k;  
  82.     UINT16 temp;  
  83.       
  84.     for (i = 0; i 
  85.     {  
  86.         for (j = 0; j 
  87.         {  
  88.             for (k = j; k 
  89.             {  
  90.                 if (g_diffAngle[i][j] > g_diffAngle[i][k])  
  91.                 {  
  92.                     temp = g_diffAngle[i][j];  
  93.                     g_diffAngle[i][j] = g_diffAngle[i][k];  
  94.                     g_diffAngle[i][k] = temp;  
  95.                       
  96.                     temp = g_diffAngleMask[i][j];  
  97.                     g_diffAngleMask[i][j] = g_diffAngleMask[i][k];  
  98.                     g_diffAngleMask[i][k] = temp;  
  99.                 }  
  100.             }  
  101.         }  
  102.     }  
  103.       
  104.     for (i = 0; i 
  105.     {  
  106.         for (j = 0; j 
  107.         {  
  108.             if (INVALID_JOINT_VALUE == g_diffAngle[i][j])  
  109.             {  
  110.                 g_diffAngle[i][j] = STEERING_ENGINE_FULL_CYCLE;  
  111.             }  
  112.         }  
  113.     }  
  114.       
  115.     for (i = 0; i 
  116.     {  
  117.         for (j = 7; j >= 1; --j)  
  118.         {  
  119.             g_diffAngle[i][j] = g_diffAngle[i][j] - g_diffAngle[i][j - 1];  
  120.         }  
  121.     }      
  122. }  
  123.   
  124.   
  125. void InitSerialPort()  
  126. {  
  127.     AUXR    = 0x00;  
  128.     ES      = 0;  
  129.     TMOD    = 0x20;  
  130.     SCON    = 0x50;  
  131.     TH1     = BAUD_RATE;  
  132.     TL1     = TH1;  
  133.     PCON    = 0x80;  
  134.     EA      = 1;  
  135.     ES      = 1;  
  136.     TR1     = 1;  
  137. }  
  138.   
  139. void OnSerialPort() interrupt 4  
  140. {  
  141.     static UCHAR8 previousChar = 0;  
  142.     static UCHAR8 currentChar = 0;  
  143.     static UCHAR8 counter = 0;  
  144.   
  145.     if (RI)  
  146.     {  
  147.         RI = 0;  
  148.         currentChar = SBUF;  
  149.   
  150.         if (PROTOCOL_HEADER[0] == currentChar)       // 协议标志  
  151.         {  
  152.             previousChar =     currentChar;  
  153.         }  
  154.         else  
  155.         {  
  156.             if (PROTOCOL_HEADER[0] == previousChar && PROTOCOL_HEADER[1] == currentChar)       // 协议开始  
  157.             {  
  158.                 counter = 0;  
  159.                 previousChar = currentChar;  
  160.                 g_swapBuffer = FALSE;  
  161.             }  
  162.             else if (PROTOCOL_END[0] == previousChar && PROTOCOL_END[1] == currentChar)   // 协议结束  
  163.             {  
  164.                 previousChar = currentChar;  
  165.   
  166.                 if (ROBOT_JOINT_AMOUNT == counter)      // 协议接受正确  
  167.                 {  
  168.                     if (0 == g_fillingBufferIndex)  
  169.                     {  
  170.                         g_readyBufferIndex = 0;  
  171.                         g_fillingBufferIndex = 1;  
  172.                     }  
  173.                     else  
  174.                     {  
  175.                         g_readyBufferIndex = 1;  
  176.                         g_fillingBufferIndex = 0;  
  177.                     }  
  178.   
  179.                     g_swapBuffer = TRUE;  
  180.       
  181. #ifdef DEBUG_PROTOCOL  
  182.                     P13 = 0;  
  183. #endif  
  184.                 }  
  185.                 else  
  186.                 {  
  187.                     g_swapBuffer = FALSE;  
  188.                       
  189. #ifdef DEBUG_PROTOCOL  
  190.                     P13 = 1;  
  191. #endif  
  192.                 }  
  193.   
  194.                 counter = 0;  
  195.             }  
  196.             else   // 接受协议正文  
  197.             {  
  198.                 g_swapBuffer = FALSE;  
  199.                 previousChar = currentChar;  
  200.   
  201.                 if (counter 
  202.                      g_angle[g_fillingBufferIndex][counter] = currentChar;  
  203.   
  204.                 ++counter;  
  205.             }  
  206.         }    // if (PROTOCOL_HEADER[0] == currentChar)  
  207.   
  208.         SBUF = currentChar;  
  209.         while (!TI)  
  210.             ;  
  211.         TI = 0;  
  212.     }    // (RI)  
  213. }  
  214.   
  215. void FillDiffAngle()  
  216. {  
  217.     // 设置舵机要调整的角度  
  218.     g_diffAngle[PIN_GROUP_1][ROBOT_PIN_INDEX_LEFT_SHOULDER_VERTICAL] = g_angle[g_readyBufferIndex][ROBOT_LEFT_SHOULDER_VERTICAL];  
  219.     g_diffAngle[PIN_GROUP_1][ROBOT_PIN_INDEX_LEFT_SHOULDER_HORIZEN] = g_angle[g_readyBufferIndex][ROBOT_LEFT_SHOULDER_HORIZEN];  
  220.     g_diffAngle[PIN_GROUP_1][ROBOT_PIN_INDEX_LEFT_ELBOW] = g_angle[g_readyBufferIndex][ROBOT_LEFT_ELBOW];  
  221.   
  222.     g_diffAngle[PIN_GROUP_1][ROBOT_PIN_INDEX_RIGHT_SHOULDER_VERTICAL] = g_angle[g_readyBufferIndex][ROBOT_RIGHT_SHOULDER_VERTICAL];  
  223.     g_diffAngle[PIN_GROUP_1][ROBOT_PIN_INDEX_RIGHT_SHOULDER_HORIZEN] = g_angle[g_readyBufferIndex][ROBOT_RIGHT_SHOULDER_HORIZEN];  
  224.     g_diffAngle[PIN_GROUP_1][ROBOT_PIN_INDEX_RIGHT_ELBOW] = g_angle[g_readyBufferIndex][ROBOT_RIGHT_ELBOW];  
  225.   
  226.     g_diffAngle[PIN_GROUP_1][ROBOT_PIN_INDEX_LEFT_HIP_VERTICAL] = g_angle[g_readyBufferIndex][ROBOT_LEFT_HIP_VERTICAL];  
  227.     g_diffAngle[PIN_GROUP_1][ROBOT_PIN_INDEX_RIGHT_HIP_VERTICAL] = g_angle[g_readyBufferIndex][ROBOT_RIGHT_HIP_VERTICAL];  
  228.       
  229.     g_diffAngle[PIN_GROUP_2][ROBOT_PIN_INDEX_LEFT_HIP_HORIZEN] = g_angle[g_readyBufferIndex][ROBOT_LEFT_HIP_HORIZEN];  
  230.     g_diffAngle[PIN_GROUP_2][ROBOT_PIN_INDEX_LEFT_KNEE] = g_angle[g_readyBufferIndex][ROBOT_LEFT_KNEE];  
  231.     g_diffAngle[PIN_GROUP_2][ROBOT_PIN_INDEX_LEFT_ANKLE] = g_angle[g_readyBufferIndex][ROBOT_LEFT_ANKLE];  
  232.     g_diffAngle[PIN_GROUP_2][ROBOT_PIN_INDEX_LEFT_FOOT] = g_angle[g_readyBufferIndex][ROBOT_LEFT_FOOT];  
  233.   
  234.     g_diffAngle[PIN_GROUP_2][ROBOT_PIN_INDEX_RIGHT_HIP_HORIZEN] = g_angle[g_readyBufferIndex][ROBOT_RIGHT_HIP_HORIZEN];  
  235.     g_diffAngle[PIN_GROUP_2][ROBOT_PIN_INDEX_RIGHT_KNEE] = g_angle[g_readyBufferIndex][ROBOT_RIGHT_KNEE];  
  236.     g_diffAngle[PIN_GROUP_2][ROBOT_PIN_INDEX_RIGHT_ANKLE] = g_angle[g_readyBufferIndex][ROBOT_RIGHT_ANKLE];  
  237.     g_diffAngle[PIN_GROUP_2][ROBOT_PIN_INDEX_RIGHT_FOOT] = g_angle[g_readyBufferIndex][ROBOT_RIGHT_FOOT];  
  238.   
  239.     // 复位舵机管脚索引  
  240.     g_diffAngleMask[PIN_GROUP_1][ROBOT_PIN_INDEX_LEFT_SHOULDER_VERTICAL] = ROBOT_PIN_MASK_LEFT_SHOULDER_VERTICAL;  
  241.     g_diffAngleMask[PIN_GROUP_1][ROBOT_PIN_INDEX_LEFT_SHOULDER_HORIZEN] = ROBOT_PIN_MASK_LEFT_SHOULDER_HORIZEN;  
  242.     g_diffAngleMask[PIN_GROUP_1][ROBOT_PIN_INDEX_LEFT_ELBOW] = ROBOT_PIN_MASK_LEFT_ELBOW;  
  243.   
  244.     g_diffAngleMask[PIN_GROUP_1][ROBOT_PIN_INDEX_RIGHT_SHOULDER_VERTICAL] = ROBOT_PIN_MASK_RIGHT_SHOULDER_VERTICAL;  
  245.     g_diffAngleMask[PIN_GROUP_1][ROBOT_PIN_INDEX_RIGHT_SHOULDER_HORIZEN] = ROBOT_PIN_MASK_RIGHT_SHOULDER_HORIZEN;  
  246.     g_diffAngleMask[PIN_GROUP_1][ROBOT_PIN_INDEX_RIGHT_ELBOW] = ROBOT_PIN_MASK_RIGHT_ELBOW;  
  247.   
  248.     g_diffAngleMask[PIN_GROUP_1][ROBOT_PIN_INDEX_LEFT_HIP_VERTICAL] = ROBOT_PIN_MASK_LEFT_HIP_VERTICAL;  
  249.     g_diffAngleMask[PIN_GROUP_1][ROBOT_PIN_INDEX_RIGHT_HIP_VERTICAL] = ROBOT_PIN_MASK_RIGHT_HIP_VERTICAL;  
  250.       
  251.     g_diffAngleMask[PIN_GROUP_2][ROBOT_PIN_INDEX_LEFT_HIP_HORIZEN] = ROBOT_PIN_MASK_LEFT_HIP_HORIZEN;  
  252.     g_diffAngleMask[PIN_GROUP_2][ROBOT_PIN_INDEX_LEFT_KNEE] = ROBOT_PIN_MASK_LEFT_KNEE;  
  253.     g_diffAngleMask[PIN_GROUP_2][ROBOT_PIN_INDEX_LEFT_ANKLE] = ROBOT_PIN_MASK_LEFT_ANKLE;  
  254.     g_diffAngleMask[PIN_GROUP_2][ROBOT_PIN_INDEX_LEFT_FOOT] = ROBOT_PIN_MASK_LEFT_FOOT;  
  255.   
  256.     g_diffAngleMask[PIN_GROUP_2][ROBOT_PIN_INDEX_RIGHT_HIP_HORIZEN] = ROBOT_PIN_MASK_RIGHT_HIP_HORIZEN;  
  257.     g_diffAngleMask[PIN_GROUP_2][ROBOT_PIN_INDEX_RIGHT_KNEE] = ROBOT_PIN_MASK_RIGHT_KNEE;  
  258.     g_diffAngleMask[PIN_GROUP_2][ROBOT_PIN_INDEX_RIGHT_ANKLE] = ROBOT_PIN_MASK_RIGHT_ANKLE;  
  259.     g_diffAngleMask[PIN_GROUP_2][ROBOT_PIN_INDEX_RIGHT_FOOT] = ROBOT_PIN_MASK_RIGHT_FOOT;  
  260. }  
  261.   
  262. #define PWM_STEERING_ENGINE(group)                                                            
  263. {                                                                                             
  264.     counter = STEERING_ENGINE_INIT_DELAY;                                                     
  265.         for (i = 0; i 
  266.             counter += g_diffAngle[PIN_GROUP_##group][i];                                     
  267.                                                                                               
  268.         for (i = 0; i 
  269.         {                                                                                     
  270.             GROUP_##group##_CONTROL_PIN = 0xFF;                                               
  271.             Delay10us(STEERING_ENGINE_INIT_DELAY);                                            
  272.                                                                                               
  273.             for (j = 0; j 
  274.             {                                                                                 
  275.                 Delay10us(g_diffAngle[PIN_GROUP_##group][j]);                                 
  276.                 GROUP_##group##_CONTROL_PIN &= ~(g_diffAngleMask[PIN_GROUP_##group][j]);      
  277.             }                                                                                 
  278.                                                                                               
  279.             Delay10us(STEERING_ENGINE_CYCLE - counter);                                       
  280.         }                                                                                     
  281. }  
  282.   
  283. void main()  
  284. {  
  285.     UCHAR8 i;  
  286.     UCHAR8 j;  
  287.     UINT16 counter;  
  288.   
  289.     InitSerialPort();  
  290.       
  291.     P1 = 0xFF;  
  292.   
  293.     // 初始化舵机角度  
  294.     for (i = 0; i 
  295.     {  
  296.         g_angle[0][i] = 45;  
  297.         g_angle[1][i] = 45;  
  298.     }  
  299.       
  300.     for (i = 0; i 
  301.         for (j = 0; j 
  302.             g_diffAngle[i][j] = 0;  
  303.               
  304.     FillDiffAngle();  
  305.     InitPwmPollint();  
  306.   
  307.     while (1)  
  308.     {  
  309. #ifdef DEBUG_PROTOCOL  
  310.         if (g_fillingBufferIndex)  
  311.         {  
  312.             P11 = 0;  
  313.             P10 = 1;  
  314.         }  
  315.         else  
  316.         {  
  317.             P11 = 1;  
  318.             P10 = 0;  
  319.         }  
  320.   
  321.         if (g_swapBuffer)  
  322.             P12 = 0;  
  323.         else  
  324.             P12 = 1;  
  325. #endif  
  326.   
  327.         if (g_swapBuffer)  
  328.         {  
  329.             FillDiffAngle();  
  330.               
  331.             g_swapBuffer = FALSE;  
  332.               
  333.             InitPwmPollint();  
  334.         }  
  335.                   
  336.         PWM_STEERING_ENGINE(1)  
  337.         PWM_STEERING_ENGINE(2)  
  338.     }  
  339.   
  340. }

关键字:单片机  1  舵机调速 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计