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

QQ登錄

只需一步,快速開始

搜索
查看: 17633|回復(fù): 24
打印 上一主題 下一主題
收起左側(cè)

兩輪自平衡小車的制作過程 含源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


兩輪自平衡小車全部的制作資料下載:
自平衡小車程序.rar (13.1 MB, 下載次數(shù): 254)



調(diào)試記錄:
2016.12.2
        完成基本角度閉環(huán)程序,基本調(diào)節(jié)出角度的PD,
        富民發(fā)現(xiàn)直立可能需要位置閉環(huán)+角度閉環(huán)+速度閉環(huán)。

2016.12.3 pm 13:00
        完成基本速度閉環(huán)和位置閉環(huán)程序,基本可以按照設(shè)定方向前進(jìn),
        只是中途的PID參數(shù)沒有調(diào)節(jié)好有停頓現(xiàn)象,開始藍(lán)牙控制模式。

2016.12.3 pm 14:43
        完成基本的前進(jìn) 后退藍(lán)牙控制功能,就是有些時(shí)候出現(xiàn)過沖停頓。
        下一步進(jìn)行轉(zhuǎn)彎控制程序的抒寫。

2016.12.3 pm 16:55
         完成基本控制功能,前進(jìn)、后退、原地左轉(zhuǎn)、原地右轉(zhuǎn)、使用簡(jiǎn)單
         的藍(lán)牙指令控制,0x01前進(jìn)、0x02后退、 0x03原地左轉(zhuǎn)、 0x04原
         地右轉(zhuǎn)、0x00什么保持直立狀態(tài),下一步進(jìn)行直立調(diào)節(jié),優(yōu)化靜止
         時(shí)的狀態(tài)。

2016.12.5 pm 13:50
        加入了手機(jī)APP藍(lán)牙控制 出現(xiàn)問題 抖動(dòng)過大多次控制容易出現(xiàn)死機(jī)
        現(xiàn)象,需要繼續(xù)直立PID調(diào)節(jié)參數(shù)。

2016.12.22 pm 17:49
        加入了 模糊控制 參數(shù)調(diào)節(jié)的還算可以,只調(diào)節(jié)了直立參數(shù) 速度閉環(huán)
        和位置閉環(huán)參數(shù)還沒有調(diào)節(jié)等待明天調(diào)節(jié)。

2016.12.31 am 11:13
        所有功能都已完畢。直立、壁障、循跡、藍(lán)牙遙控、由于循跡采用雙線
        導(dǎo)致有些時(shí)候不穩(wěn)定、不知道是機(jī)械愿意還是軟件原因?qū)е轮绷㈧o止時(shí)
        有些抖動(dòng)。基本可以完成所有多需任務(wù)。




這個(gè)是去年做的一個(gè)兩輪自平衡循跡小車,小車采用兩片STM32,一塊負(fù)責(zé)圖像處理,另一塊負(fù)責(zé)對(duì)電機(jī)的控制。兩塊板子之間使用串口通信傳輸數(shù)據(jù)。
做這個(gè)車子學(xué)會(huì)了很多,最初兩塊板子之間串口通信有問題,程序會(huì)跑著跑著就跑飛,很是惱火。之后每次需要串口通信才打開中斷,解決了跑飛的問題。
以下是車子的圖片,和源碼。

主程序下面是部分程序預(yù)覽(完整版本請(qǐng)下載本帖附件):
  1. #include "System_init.h"

  2. /*特別注意:flag變量 不可以更改 否則無法直立*/
  3. extern u8 flag;

  4. /**********主函數(shù)**********/                                                                                   
  5. int main(void)
  6. {
  7.         system_init();         //整體系統(tǒng)初始化函數(shù)
  8.                 temp_data11 = 80;
  9.         for(;;)
  10.         {
  11.       /*
  12.           函數(shù)說明:
  13.           upright_Adjust函數(shù)。
  14.           功能:直立控制。
  15.           參數(shù)個(gè)數(shù):3個(gè)。
  16.           1)P參數(shù)。
  17.           2)I參數(shù)。
  18.           3)D參數(shù)。
  19.           此函數(shù)是用于直立的函數(shù)P是PID中的比例參數(shù)
  20.           D是PID的微分參數(shù)、直立不用I積分參數(shù)。
  21.           */
  22.           /*
  23.           函數(shù)說明:
  24.           speed_control函數(shù)。
  25.           功能:藍(lán)牙控制函數(shù)。
  26.           參數(shù)個(gè)數(shù):3個(gè)。
  27.           1)串口采集參數(shù)(不需要更改、放著就可以)
  28.           2)速度控制參數(shù)(可以更改最大40最小10)
  29.           3)轉(zhuǎn)角速度控制參數(shù)(可修改,最大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. }



復(fù)制代碼
以stm32f103rct6為例
測(cè)試串口通信數(shù)據(jù)
MPU數(shù)據(jù)進(jìn)行處理
檢測(cè)X軸加速度,Y軸角速度
參考網(wǎng)上例程
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 有關(guān)的時(shí)鐘 */
  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字節(jié)1應(yīng)答模式*/
  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. }
復(fù)制代碼
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語言值特征點(diǎn)*/
  7. // 角速度
  8. int DFF[4]={0,16,45,80};
  9. /*輸出量U語言值特征點(diǎn)*/
  10. int UFF[7]={0,12,30};
  11. /*采用了調(diào)整因子的規(guī)則表,大誤差時(shí)偏重誤差,小誤差時(shí)偏重誤差變化*/
  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)   /*模糊運(yùn)算引擎*/
  24. {
  25.         float    U;           /*偏差,偏差微分以及輸出值的精確量*/
  26.         float   PF[2],DF[2],UF[4];   /*偏差,偏差微分以及輸出值的隸屬度*/
  27.         int    Pn,Dn,Un[4];
  28.         double   temp1,temp2;
  29.         /*隸屬度的確定*/
  30.         /*根據(jù)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.         /*使用誤差范圍優(yōu)化后的規(guī)則表rule[7][7]*/
  112.         /*輸出值使用13個(gè)隸屬函數(shù),中心值由UFF[7]指定*/
  113.         /*一般都是四個(gè)規(guī)則有效*/
  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.         /*同隸屬函數(shù)輸出語言值求大*/
  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[]原值為輸出隸屬函數(shù)標(biāo)號(hào),轉(zhuǎn)換為隸屬函數(shù)值*/
  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]; //因?yàn)檫x定隸屬函數(shù)為三角形,且對(duì)稱,故可以證明中心在中間的特征點(diǎn)上(橫坐標(biāo))。
  196.         temp2=UF[0]+UF[1]+UF[2]+UF[3];
  197.         U=temp1/temp2;

  198.         return U; //最后的輸出
  199. }
復(fù)制代碼

評(píng)分

參與人數(shù) 6黑幣 +33 收起 理由
2123788100abc + 5 很給力!
單片機(jī)小菜雞 + 5 太厲害了
gxsdl + 2 共享資料的黑幣獎(jiǎng)勵(lì)!
bosschuan + 6
sax_yang + 3 共享資料的黑幣獎(jiǎng)勵(lì)!
YJGG + 12 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:23606 發(fā)表于 2016-5-27 13:34 | 只看該作者
樓主這調(diào)試怎么在未來調(diào)的
回復(fù)

使用道具 舉報(bào)

板凳
ID:79544 發(fā)表于 2016-6-27 12:45 | 只看該作者
樓主牛人說明很詳細(xì),謝謝分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:167603 發(fā)表于 2017-3-16 23:16 | 只看該作者
51黑有你更精彩
回復(fù)

使用道具 舉報(bào)

5#
ID:146110 發(fā)表于 2017-4-30 16:04 | 只看該作者
樓主牛人說明很詳細(xì),謝謝分享...
回復(fù)

使用道具 舉報(bào)

6#
ID:196580 發(fā)表于 2017-5-4 17:02 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

7#
ID:206769 發(fā)表于 2017-6-1 16:39 | 只看該作者
不過后期調(diào)試有點(diǎn)麻煩
回復(fù)

使用道具 舉報(bào)

8#
ID:228825 發(fā)表于 2017-9-5 22:29 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

9#
ID:231452 發(fā)表于 2017-9-6 16:58 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

10#
ID:242562 發(fā)表于 2017-10-25 12:39 來自手機(jī) | 只看該作者
準(zhǔn)備著手
回復(fù)

使用道具 舉報(bào)

11#
ID:134810 發(fā)表于 2017-10-26 08:51 來自手機(jī) | 只看該作者
我最近也做了平衡小車
回復(fù)

使用道具 舉報(bào)

12#
ID:265054 發(fā)表于 2017-12-21 21:25 | 只看該作者
樓主有沒有做過ti的tms320f28069
回復(fù)

使用道具 舉報(bào)

13#
ID:285305 發(fā)表于 2018-2-26 17:00 | 只看該作者
一直在找這個(gè),但是黑幣不夠下載!
回復(fù)

使用道具 舉報(bào)

14#
ID:285305 發(fā)表于 2018-2-26 21:20 來自手機(jī) | 只看該作者
樓主用的用的電機(jī)是步進(jìn)電機(jī)還是減速電機(jī)?
回復(fù)

使用道具 舉報(bào)

15#
ID:293018 發(fā)表于 2018-3-17 09:07 | 只看該作者
真心不錯(cuò),值得參考
回復(fù)

使用道具 舉報(bào)

16#
ID:297869 發(fā)表于 2018-3-27 17:28 | 只看該作者
厲害厲害
回復(fù)

使用道具 舉報(bào)

17#
ID:363336 發(fā)表于 2018-7-2 17:29 | 只看該作者
厲害厲害
回復(fù)

使用道具 舉報(bào)

18#
ID:398133 發(fā)表于 2018-10-29 15:39 | 只看該作者
感謝樓主分享啊
回復(fù)

使用道具 舉報(bào)

19#
ID:415794 發(fā)表于 2018-10-29 21:01 | 只看該作者
樓主牛人!感謝分享
回復(fù)

使用道具 舉報(bào)

20#
ID:419888 發(fā)表于 2018-11-2 20:42 | 只看該作者
不錯(cuò),挺好的。。。。
回復(fù)

使用道具 舉報(bào)

21#
ID:427133 發(fā)表于 2018-11-30 15:07 | 只看該作者
樓主技術(shù)果然高超
回復(fù)

使用道具 舉報(bào)

22#
ID:583559 發(fā)表于 2019-8-3 11:19 | 只看該作者
不錯(cuò)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

23#
ID:400671 發(fā)表于 2019-8-20 14:20 | 只看該作者
樓主技術(shù)果然高超
回復(fù)

使用道具 舉報(bào)

24#
ID:601357 發(fā)表于 2021-12-13 19:15 | 只看該作者
樓主謝謝分享正在學(xué)這個(gè)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表