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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32四輪小車pid代碼求助 不論怎么設置初值,車輪總是全速轉動

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

單片機源程序如下:
  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);        //=====設置中斷分組
  24.         delay_init();          //=====延時函數初始化
  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參數初始化
  33.   uart_init(9600);
  34.         FrontmotorLeft=400;
  35.         //閉環速度控制
  36.         while(1)
  37.         {   
  38.                 //給速度設定值,想修改速度,就更該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.                 //執行PID控制函數
  51.                 Pid_Ctrl(&FrontmotorLeft ,&FrontmotorRight,&BackmotorLeft ,&BackmotorRight);
  52.                
  53.                 //根據PID計算的PWM數據進行設置PWM
  54.                 Set_Pwm_Front(FrontmotorLeft,FrontmotorRight);
  55.                 Set_Pwm_Back(BackmotorLeft,BackmotorRight);
  56.                 delay_ms(10);
  57.         }
  58. }

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

  60. void TIM5_IRQHandler(void)                            //TIM7中斷
  61. {
  62.         if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否
  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);        //=====設置中斷分組
  94.         delay_init();          //=====延時函數初始化
  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參數初始化
  103.   uart_init(9600);
  104.         FrontmotorLeft=400;
  105.         //閉環速度控制
  106.         while(1)
  107.         {   
  108.                 //給速度設定值,想修改速度,就更該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.                 //執行PID控制函數
  121.                 Pid_Ctrl(&FrontmotorLeft ,&FrontmotorRight,&BackmotorLeft ,&BackmotorRight);
  122.                
  123.                 //根據PID計算的PWM數據進行設置PWM
  124.                 Set_Pwm_Front(FrontmotorLeft,FrontmotorRight);
  125.                 Set_Pwm_Back(BackmotorLeft,BackmotorRight);
  126.                 delay_ms(10);
  127.         }
  128. }

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

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


PID - 全車.7z

194.4 KB, 下載次數: 19

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

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品亚洲精品国产欧美 | 羞羞视频在线观看 | 99免费在线视频 | 日韩视频一区 | 超碰最新在线 | 国产精品一区二区免费 | 亚洲国产精品一区二区第一页 | 久久国色 | 最近日韩中文字幕 | 日本色婷婷 | 91久久 | 国产精品免费视频一区 | 婷婷五月色综合 | 国产欧美精品一区二区 | 成人av电影在线 | 天天曰夜夜操 | 天堂资源最新在线 | av网站免费在线观看 | 欧美成人精品 | 精品日本久久久久久久久久 | 久操伊人 | 91亚洲视频在线 | 粉嫩一区二区三区国产精品 | 久久久久综合 | 国产精品福利在线 | 国产在线精品一区二区 | 久久久久久久久精 | 国产精品久久久久久久久免费高清 | 国产一区二区三区日韩 | 91视频88av | 区一区二在线观看 | 中文av字幕 | 成人在线精品 | 91欧美精品成人综合在线观看 | 久久久国产视频 | 久久久.com | 亚洲欧洲精品在线 | 国产馆| 午夜伦理影院 | 免费在线观看成人 | 日韩视频在线一区二区 |