久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
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://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
中文字幕专区
|
免费特级毛片
|
国内精品视频在线观看
|
成人黄色在线观看
|
岛国av噜噜噜久久久狠狠av
|
婷婷综合色
|
2018天天操
|
欧美日韩免费一区二区三区
|
久久av一区二区三区亚洲
|
黄色免费网站在线观看
|
九九九免费视频
|
欧美激情一区二区三区
|
国产浮力第一页
|
欧美成人精品一区二区三区
|
狠狠干天天
|
亚洲免费播放
|
国产乱国产乱300精品
|
欧美日韩在线一区二区
|
91成人小视频
|
天天综合影院
|
哦┅┅快┅┅用力啊┅aps
|
亚洲欧洲视频
|
国产一区二区三区久久
|
成人理论影院
|
av网站在线免费观看
|
国产精品国产成人国产三级
|
五月婷婷丁香
|
天堂中文在线视频
|
国产伦理一区二区
|
最近中文字幕在线
|
成人在线免费视频观看
|
亚洲天堂免费视频
|
亚洲精品视频免费在线观看
|
欧美在线免费观看视频
|
亚洲免费观看视频
|
国产美女自拍视频
|
逼逼操
|
aaa一级片
|
不卡的av
|
亚洲一级黄色片
|
久久综合国产
|