標(biāo)題:
STM32平衡小車(chē)的代碼 PID參數(shù)的調(diào)節(jié)和陀螺儀原始數(shù)據(jù)的處理
[打印本頁(yè)]
作者:
133456789
時(shí)間:
2020-12-29 12:34
標(biāo)題:
STM32平衡小車(chē)的代碼 PID參數(shù)的調(diào)節(jié)和陀螺儀原始數(shù)據(jù)的處理
主要是PID參數(shù)的調(diào)節(jié)和陀螺儀原始數(shù)據(jù)的處理
遠(yuǎn)離DMP這種速度慢消耗大的方法,希望有點(diǎn)幫助
單片機(jī)源程序如下:
#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; //加速度傳感器原始數(shù)據(jù)
short gyrox,gyroy,gyroz; //陀螺儀原始數(shù)據(jù)
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(); //延時(shí)初始化
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); //得到加速度傳感器數(shù)據(jù)
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺儀數(shù)據(jù)
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); //上位機(jī)發(fā)送
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);
}
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
兩輪平衡車(chē).7z
(257.04 KB, 下載次數(shù): 56)
2020-12-30 03:38 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
yimaer
時(shí)間:
2024-7-30 14:07
請(qǐng)問(wèn),為什么主函數(shù)里有2個(gè)while(1)呢? switch (receive),receive變量沒(méi)給初值,怎么進(jìn)的case語(yǔ)句呢
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1