找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 17751|回复: 24
打印 上一主题 下一主题
收起左侧

两轮自平衡小车的制作过程 含源码

  [复制链接]
跳转到指定楼层
楼主


两轮自平衡小车全部的制作资料下载:
自平衡小车程序.7z (305.54 KB, 下载次数: 254)



调试记录:
2016.12.2
        完成基本角度闭环程序,基本调节出角度的PD,
        富民发现直立可能需要位置闭环+角度闭环+速度闭环。

2016.12.3 pm 13:00
        完成基本速度闭环和位置闭环程序,基本可以按照设定方向前进,
        只是中途的PID参数没有调节好有停顿现象,开始蓝牙控制模式。

2016.12.3 pm 14:43
        完成基本的前进 后退蓝牙控制功能,就是有些时候出现过冲停顿。
        下一步进行转弯控制程序的抒写。

2016.12.3 pm 16:55
         完成基本控制功能,前进、后退、原地左转、原地右转、使用简单
         的蓝牙指令控制,0x01前进、0x02后退、 0x03原地左转、 0x04原
         地右转、0x00什么保持直立状态,下一步进行直立调节,优化静止
         时的状态。

2016.12.5 pm 13:50
        加入了手机APP蓝牙控制 出现问题 抖动过大多次控制容易出现死机
        现象,需要继续直立PID调节参数。

2016.12.22 pm 17:49
        加入了 模糊控制 参数调节的还算可以,只调节了直立参数 速度闭环
        和位置闭环参数还没有调节等待明天调节。

2016.12.31 am 11:13
        所有功能都已完毕。直立、壁障、循迹、蓝牙遥控、由于循迹采用双线
        导致有些时候不稳定、不知道是机械愿意还是软件原因导致直立静止时
        有些抖动。基本可以完成所有多需任务。




这个是去年做的一个两轮自平衡循迹小车,小车采用两片STM32,一块负责图像处理,另一块负责对电机的控制。两块板子之间使用串口通信传输数据。
做这个车子学会了很多,最初两块板子之间串口通信有问题,程序会跑着跑着就跑飞,很是恼火。之后每次需要串口通信才打开中断,解决了跑飞的问题。
以下是车子的图片,和源码。

主程序下面是部分程序预览(完整版本请下载本帖附件):
  1. #include "System_init.h"

  2. /*特别注意:flag变量 不可以更改 否则无法直立*/
  3. extern u8 flag;

  4. /**********主函数**********/                                                                                   
  5. int main(void)
  6. {
  7.         system_init();         //整体系统初始化函数
  8.                 temp_data11 = 80;
  9.         for(;;)
  10.         {
  11.       /*
  12.           函数说明:
  13.           upright_Adjust函数。
  14.           功能:直立控制。
  15.           参数个数:3个。
  16.           1)P参数。
  17.           2)I参数。
  18.           3)D参数。
  19.           此函数是用于直立的函数P是PID中的比例参数
  20.           D是PID的微分参数、直立不用I积分参数。
  21.           */
  22.           /*
  23.           函数说明:
  24.           speed_control函数。
  25.           功能:蓝牙控制函数。
  26.           参数个数:3个。
  27.           1)串口采集参数(不需要更改、放着就可以)
  28.           2)速度控制参数(可以更改最大40最小10)
  29.           3)转角速度控制参数(可修改,最大40最小10)
  30.           */
  31.                              SpeedL(3500);
  32.         SpeedR(3500);
  33.           if(1 == flag)
  34.           {
  35.                                    
  36.            //upright_Adjust(400.0,0.0,25.0);                            //9.5



  37.            /*特别注意:flag变量 不可以更改 否则无法直立*/
  38.            flag = 0;
  39.           }
  40.         }
  41. }



复制代码
以stm32f103rct6为例
测试串口通信数据
MPU数据进行处理
检测X轴加速度,Y轴角速度
参考网上例程
mpu6050.c文件:
  1. #include "MPU6050.h"
  2. #include "System_init.h"

  3. void I2C_Congiguration(void)
  4. {

  5.   GPIO_InitTypeDef  GPIO_InitStructure;
  6.   I2C_InitTypeDef  I2C_InitStructure;

  7.         /* 使能?I22C1 有关的时钟 */
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  9.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);  
  10.    
  11.   /* PB6-I2C2_SCL、PB7-I2C2_SDA*/
  12.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11;
  13.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;               // 开漏输出
  15.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  16.         
  17.   /* I2C 配置 */
  18.   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  19.   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  20.   I2C_InitStructure.I2C_OwnAddress1 = I2C2_MPU6050;
  21.   I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  22.   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  23.   I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
  24. /* 使I2C1 */
  25.   I2C_Cmd(I2C2, ENABLE);

  26.   /* I2C2 初始化 */
  27.   I2C_Init(I2C2, &I2C_InitStructure);

  28.         /*允许1字节1应答模式*/
  29.         I2C_AcknowledgeConfig(I2C2, ENABLE);   
  30.         
  31.         
  32. }


  33. void MPU6050_Init(void)
  34. {
  35.         delay_ms(100);
  36.         I2C_WriteByte(PWR_MGMT_1,0x00);
  37.         delay_ms(10);
  38.         I2C_WriteByte(SMPLRT_DIV,0x07);
  39.         delay_ms(10);
  40.         I2C_WriteByte(CONFIG,0x06);
  41.         delay_ms(10);
  42.          I2C_WriteByte(GYRO_CONFIG,0x18);
  43.         delay_ms(10);
  44.          I2C_WriteByte(ACCEL_CONFIG,0x01);
  45.         delay_ms(1000);

  46. }

  47. void I2C_WriteByte(uint8_t REG_Address, uint8_t Write_Data)
  48. {
  49.         while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
  50.   /* Send STRAT condition */
  51.   I2C_GenerateSTART(I2C2, ENABLE);

  52.   /* Test on EV5 and clear it */
  53.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));  

  54.   /* Send EEPROM address for write */
  55.   I2C_Send7bitAddress(I2C2, I2C2_MPU6050, I2C_Direction_Transmitter);
  56.   
  57.   /* Test on EV6 and clear it */
  58.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  59.       
  60.   /* Send the EEPROM's internal address to write to */
  61.   I2C_SendData(I2C2, REG_Address);
  62.   
  63.   /* Test on EV8 and clear it */
  64.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  65.   /* Send the byte to be written */
  66.   I2C_SendData(I2C2, Write_Data);
  67.    
  68.   /* Test on EV8 and clear it */
  69.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  70.   
  71.   /* Send STOP condition */
  72.   I2C_GenerateSTOP(I2C2, ENABLE);
  73.         I2C_WaitEepromStandbyState();

  74. }

  75. uint8_t I2C_ReadByte(uint8_t REG_Address)
  76. {
  77.         uint8_t data_byte;
  78.   //*((u8 *)0x4001080c) |=0x80;
  79.   while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
  80.    
  81.    
  82.   /* Send START condition */
  83.   I2C_GenerateSTART(I2C2, ENABLE);
  84.   //*((u8 *)0x4001080c) &=~0x80;
  85.   
  86.   /* Test on EV5 and clear it */
  87.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));

  88.   /* Send EEPROM address for write */
  89.   I2C_Send7bitAddress(I2C2, I2C2_MPU6050, I2C_Direction_Transmitter);

  90.   /* Test on EV6 and clear it */
  91.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  92.   
  93.   /* Clear EV6 by setting again the PE bit */
  94.   I2C_Cmd(I2C2, ENABLE);

  95.   /* Send the EEPROM's internal address to write to */
  96.   I2C_SendData(I2C2, REG_Address);  

  97.   /* Test on EV8 and clear it */
  98.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  99.   
  100.   /* Send STRAT condition a second time */  
  101.   I2C_GenerateSTART(I2C2, ENABLE);
  102.   
  103.   /* Test on EV5 and clear it */
  104.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
  105.   
  106.   /* Send EEPROM address for read */
  107.   I2C_Send7bitAddress(I2C2, I2C2_MPU6050, I2C_Direction_Receiver);
  108.   
  109.   /* Test on EV6 and clear it */
  110.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  111.   
  112.   /* While there is data to be read */
  113.        /* Disable Acknowledgement */
  114.       I2C_AcknowledgeConfig(I2C2, DISABLE);
  115.       
  116.       /* Send STOP Condition */
  117.       I2C_GenerateSTOP(I2C2, ENABLE);

  118.     /* Test on EV7 and clear it */
  119.     if(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))      
  120.       /* Read a byte from the EEPROM */
  121.       data_byte = I2C_ReceiveData(I2C2);


  122.   /* Enable Acknowledgement to be ready for another reception */
  123.   I2C_AcknowledgeConfig(I2C2, ENABLE);
  124.         //I2C_EE_WaitEepromStandbyState();
  125.         return data_byte;
  126. }

  127. void I2C_ReadBuffer(uint8_t* Data_Buffer, uint8_t REG_Address, uint8_t Num_Byte)
  128. {  
  129.   //*((u8 *)0x4001080c) |=0x80;
  130.   while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
  131.    
  132.    
  133.   /* Send START condition */
  134.   I2C_GenerateSTART(I2C2, ENABLE);
  135.   //*((u8 *)0x4001080c) &=~0x80;
  136.   
  137.   /* Test on EV5 and clear it */
  138.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));

  139.   /* Send EEPROM address for write */
  140.   I2C_Send7bitAddress(I2C2, I2C2_MPU6050, I2C_Direction_Transmitter);

  141.   /* Test on EV6 and clear it */
  142.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  143.   
  144.   /* Clear EV6 by setting again the PE bit */
  145.   I2C_Cmd(I2C2, ENABLE);

  146.   /* Send the EEPROM's internal address to write to */
  147.   I2C_SendData(I2C2, REG_Address);  

  148.   /* Test on EV8 and clear it */
  149.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  150.   
  151.   /* Send STRAT condition a second time */  
  152.   I2C_GenerateSTART(I2C2, ENABLE);
  153.   
  154.   /* Test on EV5 and clear it */
  155.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
  156.   
  157.   /* Send EEPROM address for read */
  158.   I2C_Send7bitAddress(I2C2, I2C2_MPU6050, I2C_Direction_Receiver);
  159.   
  160.   /* Test on EV6 and clear it */
  161.   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  162.   
  163.   /* While there is data to be read */
  164.   while(Num_Byte)  
  165.   {
  166.     if(Num_Byte == 1)
  167.     {
  168.       /* Disable Acknowledgement */
  169.       I2C_AcknowledgeConfig(I2C2, DISABLE);
  170.       
  171.       /* Send STOP Condition */
  172.       I2C_GenerateSTOP(I2C2, ENABLE);
  173.     }

  174.     /* Test on EV7 and clear it */
  175.     if(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))  
  176.     {      
  177.       /* Read a byte from the EEPROM */
  178.       *Data_Buffer = I2C_ReceiveData(I2C2);

  179.       /* Point to the next location where the byte read will be saved */
  180.       Data_Buffer++;
  181.       
  182.       /* Decrement the read bytes counter */
  183.       Num_Byte--;        
  184.     }   
  185.   }

  186.   /* Enable Acknowledgement to be ready for another reception */
  187.   I2C_AcknowledgeConfig(I2C2, ENABLE);
  188.         //I2C_EE_WaitEepromStandbyState();
  189. }







  190. void I2C_WaitEepromStandbyState(void)      
  191. {
  192.   vu16 SR1_Tmp = 0;

  193.   do
  194.   {
  195.     /* Send START condition */
  196.     I2C_GenerateSTART(I2C2, ENABLE);
  197.     /* Read I2C2 SR1 register */
  198.     SR1_Tmp = I2C_ReadRegister(I2C2, I2C_Register_SR1);
  199.     /* Send EEPROM address for write */
  200.     I2C_Send7bitAddress(I2C2, I2C2_MPU6050, I2C_Direction_Transmitter);
  201.   }while(!(I2C_ReadRegister(I2C2, I2C_Register_SR1) & 0x0002));
  202.   
  203.   /* Clear AF flag */
  204.   I2C_ClearFlag(I2C2, I2C_FLAG_AF);
  205.     /* STOP condition */   
  206.     I2C_GenerateSTOP(I2C2, ENABLE); // Added by Najoua 27/08/2008
  207. }
复制代码
pazzy.c文件:
  1. #include "pazzy.h"
  2. #include "System_init.h"

  3. #define FMAX    100       /*语言值的满幅值*/
  4. //角度值
  5. int PFF[4]={0,8,16,24};
  6. /*输入量D语言值特征点*/
  7. // 角速度
  8. int DFF[4]={0,16,45,80};
  9. /*输出量U语言值特征点*/
  10. int UFF[7]={0,12,30};
  11. /*采用了调整因子的规则表,大误差时偏重误差,小误差时偏重误差变化*/
  12. /*a0=0.3,a1=0.55,a2=0.74,a3=0.89   */
  13. int rule[7][7]={
  14. //误差变化率 -3,-2,-1, 0, 1, 2, 3             // 误差
  15.                 { 2, 2, 2, 2, 2, 1, 1,},          //   -3
  16.                 { 2, 1, 1, 1, 1, 1, 2,},          //   -2
  17.                 { 2, 1, 0, 0, 0, 0, 0,},          //   -1
  18.             { 2, 2, 2, 2, 2, 2, 2,},          //    0
  19.                 { 0, 0, 0, 0, 0, 1, 2,},          //    1
  20.                 { 0, 1, 1, 1, 1, 1, 2,},          //    2
  21.                 { 1, 1, 2, 2, 2, 2, 2}};          //    3           //    3

  22. /**********************************************************/
  23. float Fuzzy(float P,float D)   /*模糊运算引擎*/
  24. {
  25.         float    U;           /*偏差,偏差微分以及输出值的精确量*/
  26.         float   PF[2],DF[2],UF[4];   /*偏差,偏差微分以及输出值的隶属度*/
  27.         int    Pn,Dn,Un[4];
  28.         double   temp1,temp2;
  29.         /*隶属度的确定*/
  30.         /*根据PD的指定语言值获得有效隶属度*/
  31.         if(P>-PFF[3] && P<pff[3])
  32.         {
  33.                 if(P<=-PFF[2])
  34.                 {
  35.                         Pn=-2;
  36.                         PF[0]=FMAX*((float)(-PFF[2]-P)/(PFF[3]-PFF[2]));
  37.                 }
  38.                 else if(P<=-PFF[1])
  39.                 {
  40.                         Pn=-1;
  41.                         PF[0]=FMAX*((float)(-PFF[1]-P)/(PFF[2]-PFF[1]));
  42.                 }
  43.                 else if(P<=PFF[0])
  44.                 {
  45.                         Pn=0;
  46.                         PF[0]=FMAX*((float)(-PFF[0]-P)/(PFF[1]-PFF[0]));
  47.                 }
  48.                 else if(P<=PFF[1])
  49.                 {
  50.                         Pn=1; PF[0]=FMAX*((float)(PFF[1]-P)/(PFF[1]-PFF[0]));
  51.                 }
  52.                 else if(P<=PFF[2])
  53.                 {
  54.                         Pn=2; PF[0]=FMAX*((float)(PFF[2]-P)/(PFF[2]-PFF[1]));
  55.                 }
  56.                 else if(P<=PFF[3])
  57.                 {
  58.                         Pn=3; PF[0]= FMAX*((float)(PFF[3]-P)/(PFF[3]-PFF[2]));
  59.                 }
  60.         }
  61.         else if(P<=-PFF[3])
  62.         {
  63.                 Pn=-2;   PF[0]=FMAX;
  64.         }
  65.         else if(P>=PFF[3])
  66.         {
  67.                 Pn=3;   PF[0]=0;
  68.         }
  69.         PF[1]=FMAX-PF[0];




  70.         if(D>-DFF[3] && D<dff[3])
  71.         {
  72.                 if(D<=-DFF[2])
  73.                 {
  74.                         Dn=-2;DF[0]=FMAX*((float)(-DFF[2]-D)/(DFF[3]-DFF[2]));
  75.                 }
  76.                 else if(D<=-DFF[1])
  77.                 {
  78.                         Dn=-1;
  79.                         DF[0]=FMAX*((float)(-DFF[1]-D)/(DFF[2]-DFF[1]));
  80.                 }
  81.                 else if(D<=DFF[0])
  82.                 {
  83.                         Dn=0;
  84.                         DF[0]=FMAX*((float)(-DFF[0]-D)/(DFF[1]-DFF[0]));
  85.                 }
  86.                 else if(D<=DFF[1])
  87.                 {
  88.                         Dn=1;
  89.                         DF[0]=FMAX*((float)(DFF[1]-D)/(DFF[1]-DFF[0]));
  90.                 }
  91.                 else if(D<=DFF[2])
  92.                 {
  93.                         Dn=2; DF[0]=FMAX*((float)(DFF[2]-D)/(DFF[2]-DFF[1]));
  94.                 }
  95.                 else if(D<=DFF[3])
  96.                 {
  97.                         Dn=3; DF[0]=FMAX*((float)(DFF[3]-D)/(DFF[3]-DFF[2]));
  98.                 }
  99.         }
  100.         else if(D<=-DFF[3])
  101.         {
  102.                 Dn=-2;
  103.                 DF[0]=FMAX;
  104.         }
  105.         else if(D>=DFF[3])
  106.         {
  107.                 Dn=3;
  108.                 DF[0]=0;
  109.         }
  110.         DF[1]=FMAX-DF[0];

  111.         /*使用误差范围优化后的规则表rule[7][7]*/
  112.         /*输出值使用13个隶属函数,中心值由UFF[7]指定*/
  113.         /*一般都是四个规则有效*/
  114.         Un[0]=rule[Pn-1+3][Dn-1+3];
  115.         Un[1]=rule[Pn+3][Dn-1+3];
  116.         Un[2]=rule[Pn-1+3][Dn+3];
  117.         Un[3]=rule[Pn+3][Dn+3];

  118.         if(PF[0]<=DF[0])
  119.         UF[0]=PF[0];
  120.         else
  121.         UF[0]=DF[0];

  122.         if(PF[1]<=DF[0])
  123.         UF[1]=PF[1];
  124.         else
  125.         UF[1]=DF[0];
  126.         if(PF[0]<=DF[1])
  127.         UF[2]=PF[0];
  128.         else
  129.         UF[2]=DF[1];
  130.         if(PF[1]<=DF[1])
  131.         UF[3]=PF[1];
  132.         else
  133.         UF[3]=DF[1];
  134.         /*同隶属函数输出语言值求大*/
  135.         if(Un[0]==Un[1])
  136.         {
  137.                 if(UF[0]>UF[1])
  138.                 UF[1]=0;
  139.                 else
  140.                 UF[0]=0;
  141.         }
  142.         if(Un[0]==Un[2])
  143.         {
  144.                 if(UF[0]>UF[2])
  145.                 UF[2]=0;
  146.                 else
  147.                 UF[0]=0;
  148.         }
  149.         if(Un[0]==Un[3])
  150.         {
  151.                 if(UF[0]>UF[3])
  152.                 UF[3]=0;
  153.                 else
  154.                 UF[0]=0;
  155.         }
  156.         if(Un[1]==Un[2])
  157.         {
  158.                 if(UF[1]>UF[2])
  159.                 UF[2]=0;
  160.                 else
  161.                 UF[1]=0;
  162.         }
  163.         if(Un[1]==Un[3])
  164.         {
  165.                 if(UF[1]>UF[3])
  166.                 UF[3]=0;
  167.                 else
  168.                 UF[1]=0;
  169.         }
  170.         if(Un[2]==Un[3])
  171.         {
  172.                 if(UF[2]>UF[3])
  173.                 UF[3]=0;
  174.                 else
  175.                 UF[2]=0;
  176.         }
  177.         /*重心法反模糊*/
  178.         /*Un[]原值为输出隶属函数标号,转换为隶属函数值*/
  179.         if(Un[0]>=0)
  180.         Un[0]=UFF[Un[0]];
  181.         else
  182.         Un[0]=-UFF[-Un[0]];
  183.         if(Un[1]>=0)
  184.         Un[1]=UFF[Un[1]];
  185.         else
  186.         Un[1]=-UFF[-Un[1]];
  187.         if(Un[2]>=0)
  188.         Un[2]=UFF[Un[2]];
  189.         else
  190.         Un[2]=-UFF[-Un[2]];
  191.         if(Un[3]>=0)
  192.         Un[3]=UFF[Un[3]];
  193.         else
  194.         Un[3]=-UFF[-Un[3]];

  195.         temp1=UF[0]*Un[0]+UF[1]*Un[1]+UF[2]*Un[2]+UF[3]*Un[3]; //因为选定隶属函数为三角形,且对称,故可以证明中心在中间的特征点上(横坐标)。
  196.         temp2=UF[0]+UF[1]+UF[2]+UF[3];
  197.         U=temp1/temp2;

  198.         return U; //最后的输出
  199. }
复制代码

评分

参与人数 6黑币 +33 收起 理由
2123788100abc + 5 很给力!
单片机小菜鸡 + 5 太厉害了
gxsdl + 2 共享资料的黑币奖励!
bosschuan + 6
sax_yang + 3 共享资料的黑币奖励!
YJGG + 12 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶2 踩
回复

举报

沙发
ID:23606 发表于 2016-5-27 13:34 | 只看该作者
楼主这调试怎么在未来调的
回复

举报

板凳
ID:79544 发表于 2016-6-27 12:45 | 只看该作者
楼主牛人说明很详细,谢谢分享!
回复

举报

地板
ID:167603 发表于 2017-3-16 23:16 | 只看该作者
51黑有你更精彩
回复

举报

5#
ID:146110 发表于 2017-4-30 16:04 | 只看该作者
楼主牛人说明很详细,谢谢分享...
回复

举报

6#
ID:196580 发表于 2017-5-4 17:02 | 只看该作者
谢谢楼主分享
回复

举报

7#
ID:206769 发表于 2017-6-1 16:39 | 只看该作者
不过后期调试有点麻烦
回复

举报

8#
ID:228825 发表于 2017-9-5 22:29 | 只看该作者
谢谢楼主分享
回复

举报

9#
ID:231452 发表于 2017-9-6 16:58 | 只看该作者
谢谢楼主分享
回复

举报

10#
ID:242562 发表于 2017-10-25 12:39 来自触屏版 | 只看该作者
准备着手
回复

举报

11#
ID:134810 发表于 2017-10-26 08:51 来自触屏版 | 只看该作者
我最近也做了平衡小车
回复

举报

12#
ID:265054 发表于 2017-12-21 21:25 | 只看该作者
楼主有没有做过ti的tms320f28069
回复

举报

13#
ID:285305 发表于 2018-2-26 17:00 | 只看该作者
一直在找这个,但是黑币不够下载!
回复

举报

14#
ID:285305 发表于 2018-2-26 21:20 来自触屏版 | 只看该作者
楼主用的用的电机是步进电机还是减速电机?
回复

举报

15#
ID:293018 发表于 2018-3-17 09:07 | 只看该作者
真心不错,值得参考
回复

举报

16#
ID:297869 发表于 2018-3-27 17:28 | 只看该作者
厉害厉害
回复

举报

17#
ID:363336 发表于 2018-7-2 17:29 | 只看该作者
厉害厉害
回复

举报

18#
ID:398133 发表于 2018-10-29 15:39 | 只看该作者
感谢楼主分享啊
回复

举报

19#
ID:415794 发表于 2018-10-29 21:01 | 只看该作者
楼主牛人!感谢分享
回复

举报

20#
ID:419888 发表于 2018-11-2 20:42 | 只看该作者
不错,挺好的!!!!!
回复

举报

21#
ID:427133 发表于 2018-11-30 15:07 | 只看该作者
楼主技术果然高超
回复

举报

22#
ID:583559 发表于 2019-8-3 11:19 | 只看该作者
不错不错
回复

举报

23#
ID:400671 发表于 2019-8-20 14:20 | 只看该作者
楼主技术果然高超
回复

举报

24#
ID:601357 发表于 2021-12-13 19:15 | 只看该作者
楼主谢谢分享正在学这个
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表