小车PID算法跑直线

简介: 小车PID算法跑直线
#include<stm32f10x.h>
#include"sys.h"
extern unsigned char Rec_Dat_U1;
extern unsigned char Rec_String_U1[200];
extern int conut_flag_1;
#define in_1(x)    x?GPIO_ResetBits(GPIOC , GPIO_Pin_0): GPIO_SetBits(GPIOC , GPIO_Pin_0)
#define in_2(x)    x?GPIO_ResetBits(GPIOC , GPIO_Pin_1): GPIO_SetBits(GPIOC , GPIO_Pin_1)
#define in_3(x)    x?GPIO_ResetBits(GPIOB , GPIO_Pin_10): GPIO_SetBits(GPIOB , GPIO_Pin_10)
#define in_4(x)    x?GPIO_ResetBits(GPIOB , GPIO_Pin_11): GPIO_SetBits(GPIOB , GPIO_Pin_11)
#define key_1   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12) 
#define key_2   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13) 
#define key_3   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14) 
#define key_4   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15) 
float  Kp_l =                0.82  ; //比例常数
float  Ti_l =                0.09 ; //微分时间常数
float  Td_l =                0.015 ; //采样周期
float  Kp_r =                0.20  ; 
float  Ti_r =                0.09 ;
float  Td_r =                0.015 ;
#define T                  0.02 
#define Ki_l                Kp_l*(T/Ti_l)        // Kp Ki Kd 
#define Kd_l                Kp_l*(Td_l/T)
#define Ki_r                Kp_l*(T/Ti_l)        // Kp Ki Kd 
#define Kd_r                Kp_l*(Td_l/T)
#define left_b in_1(1); in_2(0);
#define left_f in_1(0); in_2(1);
#define right_f in_3(1); in_4(0);
#define right_b in_1(0); in_2(1);
extern float pwm_l;
extern float pwm_r;
void CAR_GPIO_INIT(void);
int main()
{
// int speed=50;
SYS_CONFIG();
CAR_GPIO_INIT();
pwm_init(TIM3_1);
pwm_init(TIM3_2);
TIM4_PWMINPUT_INIT(0xffff,31);  //1M速度采样率
TIM5_PWMINPUT_INIT(0xffff,31);
incPIDinit();
  PID_set(Kp_l,Ki_l,Kd_l,Kp_r,Ki_r,Kd_r);   
//void PID_set(float pp_1,float ii_1,float dd_1,float pp_2,float ii_2,float dd_2)
  right_f
left_f
// set_pwm_percent(TIM3_1,50) ;
// set_pwm_percent(TIM3_2,50) ;
PID_setpoint(&PID_l, 160);
PID_setpoint(&PID_r, 160);
while(1)
{
printf("%d\r\n",(int)pwm_l);
delay_ms(200);
}
}
void CAR_GPIO_INIT() 
{
  GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE); 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP; 
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);           
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;  
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  
GPIO_Init(GPIOB, &GPIO_InitStructure);        
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;    
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
GPIO_Init(GPIOC, &GPIO_InitStructure);          
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;  
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
GPIO_Init(GPIOC, &GPIO_InitStructure);         
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;   
GPIO_Init(GPIOD, &GPIO_InitStructure);          
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;  
GPIO_Init(GPIOD, &GPIO_InitStructure);     
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;   
GPIO_Init(GPIOD, &GPIO_InitStructure);          
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;  
GPIO_Init(GPIOD, &GPIO_InitStructure);   
}
相关文章
|
6月前
|
算法
经典控制算法——PID算法原理分析及优化
这篇文章介绍了PID控制算法,这是一种广泛应用的控制策略,具有简单、鲁棒性强的特点。PID通过比例、积分和微分三个部分调整控制量,以减少系统误差。文章提到了在大学智能汽车竞赛中的应用,并详细解释了PID的基本原理和数学表达式。接着,讨论了数字PID的实现,包括位置式、增量式和步进式,以及它们各自的优缺点。最后,文章介绍了PID的优化方法,如积分饱和处理和微分项优化,以及串级PID在电机控制中的应用。整个内容旨在帮助读者理解PID控制的原理和实际运用。
688 1
|
28天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
1月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
3月前
|
算法
PID算法原理分析及优化
今天为大家介绍一下经典控制算法之一的PID控制方法。PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。 在大学期间,参加的智能汽车竞赛中就使用到了PID经典控制算法,对于智能小车的调试更加的方便。 一、PID原理 PID控制方法将偏差的比例(proportional)、积分(integral)、微分(derivative)通过线性组合构成控制量,对被控对象进行控制。 常规的PID控制系统如图所示: 系统的输入r(t)为控制量的目标输出值,输出y(t)为控制量的实际输出值,e(t)为输出量目标值与实际值
|
3月前
|
算法
空间点与直线距离算法
空间点与直线距离算法
54 0
|
3月前
|
算法 C++
空间直线与球面相交算法
空间直线与球面相交算法
31 0
|
3月前
|
算法 Java 索引
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
36 0
|
5月前
|
算法
基于PSO粒子群优化的PID控制器参数整定算法matlab仿真
该文探讨了使用PSO(粒子群优化)算法优化PID控制器参数的方法。通过PSO迭代,不断调整PID控制器的Kp、Ki、Kd增益,以减小控制误差。文中提供了MATLAB2022a版本的核心代码,展示了参数优化过程及结果。系统仿真图像显示了参数随迭代优化的变化。PID控制器结合PSO算法能有效提升控制性能,适用于复杂系统的参数整定,未来研究可关注算法效率提升和应对不确定性。
|
5月前
|
算法 计算机视觉
图像处理之霍夫变换(直线检测算法)
图像处理之霍夫变换(直线检测算法)
51 0
|
6月前
|
算法
PID算法原理分析及优化
这篇文章介绍了PID控制方法,这是一种广泛应用的控制算法,具有结构简单、鲁棒性强等特点。PID通过比例、积分和微分三个部分调整控制量,以减少系统输出与目标值的偏差。文章详细阐述了PID的基本原理,包括比例、积分和微分调节的作用,并提到积分饱和和微分项振荡的问题以及对应的优化策略,如积分分离、变速积分和微分先行等。此外,还提到了数字PID的实现形式,如位置式、增量式和步进式,以及串级PID在电机控制等领域的应用。
226 10