小车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);

}

小车PID算法跑直线,布布扣,bubuko.com

时间: 2024-12-25 18:19:31

小车PID算法跑直线的相关文章

PID 算法理解

PID 算法 使用环境:受到外界的影响不能按照理想状态发展.如小车的速度不稳定的调节,尽快达到目标速度. 条件:闭环系统->有反馈 要求:快准狠 分类:位置式.增量式 增量式 输入:前次速度.前前次速度.前前前次速度 输出:pwm的增加值或减少值 位置式 输入: 输出: 公式 或 Kp 比例放大系数     Ti  积分时间    Td 微分时间 Kp比例放大系数  Ki 积分系数  Kd 微分系数

形象解释PID算法

形象解释PID算法+PID算法源代码 小明接到这样一个任务: 有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水. 小明接到任务后就一直守在水缸旁边,时间长就觉得无聊,就跑到房里看小说了,每30分钟来检查一次水面高度.水漏得太快,每次小明来检查时,水都快漏完了,离要求的高度相差很远,小明改为每3分钟来检查一次,结果每次来水都没怎么漏,不需要加水,来得太频繁做的是无用功.几次试验后,确定每10分钟来检查一次.这个检查时间就

PID算法(C语言)

/************ PID算法(C语言) ************/ #include <stdio.h> #include<math.h> struct _pid { int pv; /*integer that contains the process value*/ int sp; /*integer that contains the set point*/ float integral; float pgain; float igain; float dgain;

模糊PID控温算法的具体实现(一):参数自整定模糊PID算法概念

上个学期已经基本上实现了PID的温控算法,为了撰写小论文,这个学期最先要做的事情就是实现模糊PID的温控算法. 模糊控制系统的构成与与常规的反馈控制系统的主要区别在于控制器主要是由模糊化,模糊推理机和精确化三个功能模块和知识库(包括数据库和规则库)构成的.具体实现过程如下所示: (1)预处理: 输入数据往往是通过测量设备测量得到的一个具体数据,预处理就是在它们进入控制器前对这些数据进行分类,或性质程度的定义.预处理过程也是量化过程,它是在离散空间中把输入数据划分为若干个数字级别.例如,假设一个反

mwc飞控PID算法解析

0.说明 基于mwc2.3的pid算法解析,2.3中增加了一种新的pid算法,在此分别解析. P:比例 I:积分 D:微分 1.老版PID代码 代码大概在MultiWii.cpp的1350行上下. 1 if ( f.HORIZON_MODE ) prop = min(max(abs(rcCommand[PITCH]),abs(rcCommand[ROLL])),512); 2 3 // PITCH & ROLL 4 for(axis = 0; axis < 2; axis++) { 5 rc

线性控制原理——PID算法应用

使用控制系统(PID)控制被控对象 PID控制的三要素:控制器,被控对象,反馈器.控制器就是一个数学模型,就PID来说,等同于PID算法.是对反馈量的一个处理与输出.通俗的说就是对于每个被控的量,我的输出量通过什么函数式算出,或者说,我如何描述我的输出量.现在我给定一个描述性的传递函数.从数学角度来看:它的自变量是反馈值,当这个函数的对应关系确定了之后,输出量就是个定值了.我的希望是:这个描述函数是一个透明的空箱--它既能反映系统外部特性,又可以看到其内部结构. 就拿比赛来说:假设我现在要构建这

《图形学》实验五:改进的Bresenham算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE ProBresenham(100,100,400,400); //画直线 8 9 #pr

《图形学》实验四:中点Bresenham算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE1 MidpointBresenham(100,200,200,100); //画直线 8

《图形学》实验三:DDA算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用DDA算法画直线. 实验结果: 代码: 1 #include <gl/glut.h> 2 #include <math.h> 3 4 #define WIDTH 500 //窗口宽度 5 #define HEIGHT 500 //窗口高度 6 7 #define DRAWLINE1 DDALine(100,200,200,100); //画直线 8 #define DRAWLINE2 DDALine(200,100,450,