找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32四輪小車pid代碼求助 不論怎么設(shè)置初值,車輪總是全速轉(zhuǎn)動

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:881103 發(fā)表于 2021-2-21 09:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
100黑幣
自己寫了一個四輪的小車,主控是stm32f103rct6
目前的問題是,不論怎么設(shè)置初值,車輪總是全速轉(zhuǎn)動,并且拔掉編碼器的線,車輪轉(zhuǎn)速依舊沒啥變化,不知道是哪里除了問題

單片機源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "encoder.h"
  4. #include "timer.h"
  5. #include "pwm.h"
  6. #include "pid.h"
  7. #include "motor.h"
  8. #include <stdio.h>
  9. #include "usart.h"
  10. int FleftSpeedNow  =0;
  11. int FrightSpeedNow =0;
  12. int BleftSpeedNow  =0;
  13. int BrightSpeedNow =0;

  14. int FleftSpeeSet   =400;//mm/s
  15. int FrightSpeedSet = 2000;//mm/s
  16. int BleftSpeeSet   = 600;//mm/s
  17. int BrightSpeedSet = 600;//mm/s



  18. int main(void)
  19. {

  20.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
  21.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁用JTAG 啟用 SWD
  22.        
  23.         MY_NVIC_PriorityGroupConfig(2);        //=====設(shè)置中斷分組
  24.         delay_init();          //=====延時函數(shù)初始化
  25.         Motor_Init();   //電機初始化
  26.         Encoder_Init_TIM2();            //=====初始化編碼器
  27.         Encoder_Init_TIM1();
  28.         Encoder_Init_TIM3();
  29.         Encoder_Init_TIM4();            //=====初始化編碼器            
  30.         PWM_Init(7199,0);           //=====初始化PWM
  31.         TIM5_Int_Init(50-1,7200-1);     //=====定時器初始化 5ms一次中斷
  32.         PID_Init();                                                //=====PID參數(shù)初始化
  33.   uart_init(9600);
  34.         FrontmotorLeft=400;
  35.         //閉環(huán)速度控制
  36.         while(1)
  37.         {   
  38.                 //給速度設(shè)定值,想修改速度,就更該leftSpeeSet、rightSpeedSet變量的值
  39.                 Fpid_Task_Letf.speedSet  = FleftSpeeSet;
  40.                 Fpid_Task_Right.speedSet = FrightSpeedSet;
  41.                 Bpid_Task_Letf.speedSet  = BleftSpeeSet;
  42.                 Bpid_Task_Right.speedSet = BrightSpeedSet;
  43.                
  44.                 //給定速度實時值
  45.                 Fpid_Task_Letf.speedNow  = FleftSpeedNow;
  46.                 Fpid_Task_Right.speedNow = FrightSpeedNow;
  47.                 Bpid_Task_Letf.speedNow  = BleftSpeedNow;
  48.                 Bpid_Task_Right.speedNow = BrightSpeedNow;
  49.                
  50.                 //執(zhí)行PID控制函數(shù)
  51.                 Pid_Ctrl(&FrontmotorLeft ,&FrontmotorRight,&BackmotorLeft ,&BackmotorRight);
  52.                
  53.                 //根據(jù)PID計算的PWM數(shù)據(jù)進(jìn)行設(shè)置PWM
  54.                 Set_Pwm_Front(FrontmotorLeft,FrontmotorRight);
  55.                 Set_Pwm_Back(BackmotorLeft,BackmotorRight);
  56.                 delay_ms(10);
  57.         }
  58. }

  59. //5ms 定時器中斷服務(wù)函數(shù) --> 計算速度實時值,運行該程序之前,確保自己已經(jīng)能獲得輪速,如果不懂,可看之前電機測速的文章

  60. void TIM5_IRQHandler(void)                            //TIM7中斷
  61. {
  62.         if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否
  63.         {
  64.                 TIM_ClearITPendingBit(TIM5, TIM_IT_Update);   //清除TIMx的中斷待處理位
  65.                
  66.                 Get_Motor_Speed(&FleftSpeedNow ,&FrightSpeedNow,&BleftSpeedNow,&BrightSpeedNow);//計算電機速度
  67.                                           
  68.                                           
  69.         }
  70. }

  71. #include "sys.h"
  72. #include "delay.h"
  73. #include "encoder.h"
  74. #include "timer.h"
  75. #include "pwm.h"
  76. #include "pid.h"
  77. #include "motor.h"
  78. #include <stdio.h>
  79. #include "usart.h"
  80. int FleftSpeedNow  =0;
  81. int FrightSpeedNow =0;
  82. int BleftSpeedNow  =0;
  83. int BrightSpeedNow =0;

  84. int FleftSpeeSet   =400;//mm/s
  85. int FrightSpeedSet = 2000;//mm/s
  86. int BleftSpeeSet   = 600;//mm/s
  87. int BrightSpeedSet = 600;//mm/s



  88. int main(void)
  89. {

  90.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
  91.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁用JTAG 啟用 SWD
  92.        
  93.         MY_NVIC_PriorityGroupConfig(2);        //=====設(shè)置中斷分組
  94.         delay_init();          //=====延時函數(shù)初始化
  95.         Motor_Init();   //電機初始化
  96.         Encoder_Init_TIM2();            //=====初始化編碼器
  97.         Encoder_Init_TIM1();
  98.         Encoder_Init_TIM3();
  99.         Encoder_Init_TIM4();            //=====初始化編碼器            
  100.         PWM_Init(7199,0);           //=====初始化PWM
  101.         TIM5_Int_Init(50-1,7200-1);     //=====定時器初始化 5ms一次中斷
  102.         PID_Init();                                                //=====PID參數(shù)初始化
  103.   uart_init(9600);
  104.         FrontmotorLeft=400;
  105.         //閉環(huán)速度控制
  106.         while(1)
  107.         {   
  108.                 //給速度設(shè)定值,想修改速度,就更該leftSpeeSet、rightSpeedSet變量的值
  109.                 Fpid_Task_Letf.speedSet  = FleftSpeeSet;
  110.                 Fpid_Task_Right.speedSet = FrightSpeedSet;
  111.                 Bpid_Task_Letf.speedSet  = BleftSpeeSet;
  112.                 Bpid_Task_Right.speedSet = BrightSpeedSet;
  113.                
  114.                 //給定速度實時值
  115.                 Fpid_Task_Letf.speedNow  = FleftSpeedNow;
  116.                 Fpid_Task_Right.speedNow = FrightSpeedNow;
  117.                 Bpid_Task_Letf.speedNow  = BleftSpeedNow;
  118.                 Bpid_Task_Right.speedNow = BrightSpeedNow;
  119.                
  120.                 //執(zhí)行PID控制函數(shù)
  121.                 Pid_Ctrl(&FrontmotorLeft ,&FrontmotorRight,&BackmotorLeft ,&BackmotorRight);
  122.                
  123.                 //根據(jù)PID計算的PWM數(shù)據(jù)進(jìn)行設(shè)置PWM
  124.                 Set_Pwm_Front(FrontmotorLeft,FrontmotorRight);
  125.                 Set_Pwm_Back(BackmotorLeft,BackmotorRight);
  126.                 delay_ms(10);
  127.         }
  128. }

  129. //5ms 定時器中斷服務(wù)函數(shù) --> 計算速度實時值,運行該程序之前,確保自己已經(jīng)能獲得輪速,如果不懂,可看之前電機測速的文章

  130. void TIM5_IRQHandler(void)                            //TIM7中斷
  131. {
  132.         if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否
  133.         {
  134.                 TIM_ClearITPendingBit(TIM5, TIM_IT_Update);   //清除TIMx的中斷待處理位
  135.                
  136.                 Get_Motor_Speed(&FleftSpeedNow ,&FrightSpeedNow,&BleftSpeedNow,&BrightSpeedNow);//計算電機速度
  137.                                           
  138.                                           
  139.         }
  140. }
復(fù)制代碼


PID - 全車.7z

194.4 KB, 下載次數(shù): 19

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

使用道具 舉報

沙發(fā)
ID:785191 發(fā)表于 2021-2-22 00:00 | 只看該作者
我的建議是冷靜把步驟一步步認(rèn)真分析一遍,一般來說各個部分沒問題,那就出現(xiàn)在控制算法上了,要不找一個成功案例程序,先分析一下成功案例的思想,然后比較不足,

評分

參與人數(shù) 1黑幣 +30 收起 理由
云中落羽 + 30

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:420836 發(fā)表于 2021-2-22 05:59 | 只看該作者
應(yīng)該首先更正:Pid_Ctrl里的Pid_Which(&Bpid_Task_Letf, &Fpid_Task_Right);
應(yīng)該是Pid_Which(&Bpid_Task_Letf, &Bpid_Task_Right);

評分

參與人數(shù) 1黑幣 +30 收起 理由
云中落羽 + 30

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:883242 發(fā)表于 2021-2-22 13:05 | 只看該作者
沒硬件無法分析,你可以打斷點到關(guān)鍵的行號上,看看PID算法給出的數(shù)據(jù)是什么。

評分

參與人數(shù) 2黑幣 +50 收起 理由
admin + 20 回帖助人的獎勵!
云中落羽 + 30

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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