找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3174|回复: 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 单片机教程网

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