标题:
STM32平衡小车的代码 PID参数的调节和陀螺仪原始数据的处理
[打印本页]
作者:
133456789
时间:
2020-12-29 12:34
标题:
STM32平衡小车的代码 PID参数的调节和陀螺仪原始数据的处理
主要是PID参数的调节和陀螺仪原始数据的处理
远离DMP这种速度慢消耗大的方法,希望有点帮助
单片机源程序如下:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "oled.h"
#include "pwm.h"
#include "function.h"
#include "fuzzy.h"
#include "time.h"
#include "FTM.h"
#include "rtu.h"
char receive;
float result;
angle ress;
p_angle res;
speed_s spe_L;
speed_ss speed_L;
speed_s spe_R;
speed_ss speed_R;
out_b outt;
out_c out;
int ab;
float roll;
int ti=9;
float ta;
int ti_r;
int ti_l;
float CN_timer2;
float CN_timer3;
int time;
int32_t rtu_send[6];
int main(void)
{
float mm=0;
int P=64;
float I=0;
float D=0.005;
float i;
float d;
float e;
int integer,point;
float pitch,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
short temp; //温度
int m;
out=&outt;
res=&ress;
speed_L=&spe_L;
speed_R=&spe_R;
speed_L->speed_last=0;
speed_R->speed_last=0;
ta=0;
ti=80;
res->angle_sum=0;
res->angle_error=0;
res->angle_last=0;
res->angle_now=0;
m=0;
delay_init(); //延时初始化
OLED_Init();
pwm_init();
time1_init();
uart_init(115200);
Hardware_init();
ti=0;
ab=1000;
OLED_ShowString(40,2 ,"Stop");
while(1)
{
// if(ti<0)
// ti=0;
//
// if(ab>100)
// ab=100;
// ti=ab;
//
if(ti<0) ti=0;
if(ti>100) ti=100;
if(ab<0) ab=0;
if(ab>0) ab=100;
OLED_ShowString(0,0 ,"Direction:");
OLED_ShowString(0,4 ,"Speed:");
OLED_ShowNum(40,6,100-ti,3,24);
OLED_ShowString(96,6 ,"%");
// OLED_ShowNum(0,2,ta,3,32);
switch (receive)
{
case 'A':
ti+=5;
receive='p';
break;
case 'B':
ti-=5;
receive='p';
break;
case 'C':
forward();
OLED_Clear();
OLED_ShowString(40,2 ,"Forward");
receive='p';
break;
case 'D':
back();
OLED_Clear();
OLED_ShowString(40,2 ,"Back");
receive='p';
break;
case 'E' :
stop();
ti=0;;
OLED_Clear();
OLED_ShowString(40,2 ,"Stop");
receive='p';
break;
case 'F' :
left();
OLED_Clear();
OLED_ShowString(40,2 ,"Turn_left");
receive='p';
break;
case 'G' :
right();
OLED_Clear();
OLED_ShowString(40,2 ,"Turn_right");
receive='p';
break;
case 'H' :
up();
ti=50;
OLED_Clear();
OLED_ShowString(40,2 ,"up");
receive='p';
break;
case 'I' :
down();
ti=50;
OLED_Clear();
OLED_ShowString(40,2 ,"down");
receive='p';
break;
case 'J' :
ab-=5;
OLED_Clear();
receive='p';
break;
case 'K' :
ab+=5;
OLED_Clear();
receive='p';
break;
}
}
Hardware_init();
uart_init(115200);
//time4_init();
usart_init_();
time1_init();
Encoder_Init_TIM2();
Encoder_Init_TIM3();
while(mpu_dmp_init())
{
OLED_ShowString(0,2 ,"MPU6050 initting");
}
OLED_Clear();
res->angle_P=81;
res->angle_I=0.001;
res->angle_sum=0;
res->angle_D=18;
mm=0;
OLED_ShowString(0,2 ,"roll:");
OLED_ShowString(2,0 ,"L:");
OLED_ShowString(60,0 ,"R:");
OLED_ShowString(100,2 ,".");
OLED_ShowString(0,6 ,"P:");
OLED_ShowString(46,6,"I:");
OLED_ShowString(90,6 ,"D:");
while(1)
{
switch (receive)
{
case 'T':
ta=ta+1;
receive='p';
break;
case 'J':
ta-=1;
receive='p';
break;
case 'A':
res->angle_P+=1;
receive='p';
break;
case 'C':
res->angle_P-=1 ;
receive='p';
break;
case 'D':
res->angle_D+=1;
receive='p';
break;
case 'E':
res->angle_D-=1;
receive='p';
break;
case 'F' :
res->angle_I+=0.001;
receive = 'p';
break;
case 'B':
back();
res->angle_I-=0.001;
break;
case 'S':
stop();
receive = 'p';
break;
case 'M':
ti+=1;
receive = 'p';
break;
case 'N':
receive = 'p';
ti-=1;
break;
}
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据
temp=roll*10;
if(temp<0)
{
OLED_ShowString(50,2 ,"-");
temp=-temp;
} else
OLED_ShowString(50,2 ,"+");
integer = temp/10;
point = temp%10;
time=(2000-(res->angle_P*mm+res->angle_I*res->angle_sum-res->angle_D*res->angle_error));
if(time<1)
{
time=1;
}
if(res->angle_now<0)
{
forward();
mm=-res->angle_now;
}
else
{
back();
mm=res->angle_now;
}
OLED_ShowNum(60,2,integer,3,18);
OLED_ShowNum(108,2,point,1,8);
OLED_ShowNum(12,6,(res->angle_P),3,18);
OLED_ShowNum(60,6,(res->angle_I)*1000,3,18);
OLED_ShowNum(102,6,res->angle_D,3,18);
OLED_ShowNum(0,4,mm,3,18);
if(res->angle_error<0.5)
{
OLED_ShowString(68,4 ,"-");
OLED_ShowNum(76,4,-res->angle_error,4,20);
}
else
{
OLED_ShowString(68,4 ,"+");
OLED_ShowNum(76,4,res->angle_error,4,20);
}
// OLED_ShowNum(20,0,(int)((s16)(TIM2->CNT)),3,16);
// OLED_ShowNum(80,0,(int)((s16)(TIM3->CNT)),3,16); //显示左右轮位置
rtu_send[0]=res->angle_now*100;
rtu_send[1]=2000-time;
rtu_send_data(rtu_send,2);
rtu_send_data(rtu_send,2); //上位机发送
OLED_ShowNum(20,0,time,4,20); //显示左右论速度
OLED_ShowNum(80,0,time,4,20);
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
delay_ms(1000); //显示左右论速度
GPIO_SetBits(GPIOC,GPIO_Pin_13);
delay_ms(1000);
}
}
}
}
复制代码
所有资料51hei提供下载:
两轮平衡车.7z
(257.04 KB, 下载次数: 56)
2020-12-30 03:38 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
yimaer
时间:
2024-7-30 14:07
请问,为什么主函数里有2个while(1)呢? switch (receive),receive变量没给初值,怎么进的case语句呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1