標(biāo)題:
四旋翼源碼第7版軟啟動(dòng)+藍(lán)牙源碼(串級(jí)PID控制)
[打印本頁(yè)]
作者:
hou123123
時(shí)間:
2018-5-12 11:21
標(biāo)題:
四旋翼源碼第7版軟啟動(dòng)+藍(lán)牙源碼(串級(jí)PID控制)
這是我們調(diào)小四軸的源碼。主要用的串級(jí)PID控制。
$$YQ[M}}Y9C(FHBPGIC~WZG.jpg
(3.25 MB, 下載次數(shù): 46)
下載附件
2018-5-12 11:21 上傳
STM32-DMP移植單片機(jī)源程序如下:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "anbt_dmp_fun.h"
#include "anbt_i2c.h"
#include "anbt_dmp_mpu6050.h"
#include "anbt_dmp_driver.h"
#include "debug.h"
#include "PWM.h"
#define BYTE0(dwTemp) (*(char *)(&dwTemp))
#define BYTE1(dwTemp) (*((char *)(&dwTemp) + 1))
#define BYTE2(dwTemp) (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp) (*((char *)(&dwTemp) + 3))
#define q30 1073741824.0f
void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel);
void Send_Data(int16_t *Gyro,int16_t *Accel);
static void DMP_Delay ( __IO uint32_t nCount )
{
for ( ; nCount != 0; nCount -- );
}
int main(void)
{
int a = 0;
float error_pitch=0.0;
static float Pitch_I_out=0.0;
float error_pitch_old=0.0;
static float Pitch_I_shell_out=0.0;
float error_pitch_shell=0.0;
float pitch_shell_out=0.0;
float pitch_out=0.0;
float error_roll=0.0;
static float roll_I_out=0.0;
float error_roll_old=0.0;
static float roll_I_shell_out=0.0;
float error_roll_shell=0.0;
float roll_shell_out=0.0;
float roll_out=0.0;
static float yaw_I_out=0.0;
float error_yaw=0.0;
float error_yaw_old=0.0;
float yaw_out=0.0;
int i=1000000;
float m1=0,m2=0,m3=0,m4=0,m5=0.0;
unsigned long sensor_timestamp;
short gyro[3], accel[3], sensors;//陀螺儀存放數(shù)組,加速度存放數(shù)組,返回狀態(tài)量
unsigned char more;
long quat[4];//四元數(shù)存放數(shù)組
float Yaw=0.00,Roll,Pitch;//歐拉角
float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;//計(jì)算姿態(tài)過(guò)程用到的變量
////
pitch_SET = 7;
P_pitch_shell =-25;//-55
P_pitch = -0.72; //-1.2
I_pitch= -0.015;// -0.032
D_pitch=-0.85;//-1.2
I_pitch_shell =-0.00012;//-0.0002
roll_SET = 9;
P_roll_shell= -25;//-55
P_roll = 0.72;//1.2
I_roll= 0.015;//0.032
D_roll= 0.85;//1.2
I_roll_shell = 0.00012;//0.0002
NVIC_Configuration();//設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200); //串口初始化為115200
//引用圓點(diǎn)博士的I2C程序,這里跟我們平常沒(méi)有什么區(qū)別
PWM_Init();
ANBT_I2C_Configuration(); //IIC初始化
// delay_ms(30);
DMP_Delay (300);//
AnBT_DMP_MPU6050_Init(); //6050DMP初始化
//TIM2_Int_Init(4999,7199);//10Khz的計(jì)數(shù)頻率,計(jì)數(shù)到5000為500ms
DMP_Delay (300);
while(i--)
{
TIM_SetCompare3(TIM3,200);
TIM_SetCompare4(TIM3,200);
TIM_SetCompare3(TIM4,200);
TIM_SetCompare4(TIM4,200);
}
//a = ReceiveOneByte[0];
while(1)
{
error_pitch_old = error_pitch;
error_roll_old = error_roll;
error_yaw_old = error_yaw;
dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);
if ( sensors & INV_WXYZ_QUAT )
{
q0=quat[0] / q30;
q1=quat[1] / q30;
q2=quat[2] / q30;
q3=quat[3] / q30;
Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; //感覺(jué)沒(méi)有價(jià)值,注掉
// if(Pitch>15||Pitch<-15||Roll>15||Roll<-15)//stop
// {
// TIM_SetCompare3(TIM3,0);
// TIM_SetCompare4(TIM3,0);
// TIM_SetCompare3(TIM4,0);
// TIM_SetCompare4(TIM4,0);
// while(1);
// }
//////////////////Pitch外環(huán)(PI)/////////////
error_pitch_shell = Pitch-pitch_SET;
Pitch_I_shell_out+=error_pitch_shell;
if(Pitch_I_shell_out>500)
{
Pitch_I_shell_out = 500;
}
if(Pitch_I_shell_out<-500)
{
Pitch_I_shell_out = -500;
}
pitch_shell_out = P_pitch_shell*error_pitch_shell+I_pitch_shell*Pitch_I_shell_out;
//------------Pitch內(nèi)環(huán)PID gyro[1]---------------//
error_pitch = gyro[1]-pitch_shell_out;
Pitch_I_out+=error_pitch;
if(Pitch_I_out>500)
{
Pitch_I_out = 500;
}
if(Pitch_I_out<-500)
{
Pitch_I_out = -500;
}
pitch_out = P_pitch*error_pitch+I_pitch*Pitch_I_out+D_pitch*(error_pitch-error_pitch_old);
m1=pitch_out;
//////////////////roll外環(huán)(PI)gyro[0]/////////////
error_roll_shell = Roll - roll_SET;
roll_I_shell_out+=error_roll_shell;
if(roll_I_shell_out>1000)
{
roll_I_shell_out = 1000;
}
if(roll_I_shell_out<-1000)
{
roll_I_shell_out = -1000;
}
roll_shell_out = P_roll_shell*error_roll_shell+I_roll_shell*roll_I_shell_out;
//////////////////roll內(nèi)環(huán)PID/////////
error_roll = gyro[0]-roll_shell_out;
roll_I_out+=error_roll;
if(roll_I_out>1000)
{
roll_I_out = 1000;
}
if(roll_I_out<-1000)
{
roll_I_out = -1000;
}
roll_out = P_roll*error_roll+I_roll*roll_I_out+D_roll*(error_roll-error_roll_old);
m2 = roll_out;
////////////////gyro[2] PD//////////
error_yaw = gyro[2];
yaw_out = 1.8*error_yaw+2.5*(error_yaw_old-error_yaw);
m3 = yaw_out;
/////////////////////yaw///////////
// error_yaw = Yaw;
// yaw_I_out+=error_yaw;
// if(yaw_I_out>200)
// {
// yaw_I_out = 200;
// }
// if(yaw_I_out<-200)
// {
// yaw_I_out = -200;
// }
// m4 = 0.0000025*error_yaw+0.000000025*yaw_I_out;
TIM_SetCompare3(TIM3,2500+m1+m2+m3+m4+m5);
TIM_SetCompare4(TIM3,2500+m1-m2-m3-m4+m5);
TIM_SetCompare3(TIM4,2500-m1-m2+m3+m4+m5);
TIM_SetCompare4(TIM4,2500-m1+m2-m3-m4+m5);
Push(1,(int)pitch_out);
Push(2,(int)Pitch);
Push(3,(int)gyro[0]);
Push(4,(int)gyro[1]);
Push(5,(int)gyro[2]);
Push(6,(int)Yaw);
SendDataToScope();
}
}
}
/*函數(shù)功能:根據(jù)匿名最新上位機(jī)協(xié)議寫(xiě)的顯示姿態(tài)的程序
*具體原理看匿名的講解視頻
發(fā)送基本信息(姿態(tài)、鎖定狀態(tài))
*/
void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel)
{
unsigned char i=0;
unsigned char _cnt=0,sum = 0;
unsigned int _temp;
u8 data_to_send[50];
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0x01;
data_to_send[_cnt++]=0;
_temp = (int)(Roll*100);
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = 0-(int)(Pitch*100);
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
_temp = (int)(Yaw*100);
data_to_send[_cnt++]=BYTE1(_temp);
data_to_send[_cnt++]=BYTE0(_temp);
data_to_send[3] = _cnt-4;
//和校驗(yàn)
for(i=0;i<_cnt;i++)
sum+= data_to_send[i];
data_to_send[_cnt++]=sum;
//串口發(fā)送數(shù)據(jù)
for(i=0;i<_cnt;i++)
AnBT_Uart1_Send_Char(data_to_send[i]);
}
//發(fā)送傳感器數(shù)據(jù)
void Send_Data(int16_t *Gyro,int16_t *Accel)
{
unsigned char i=0;
unsigned char _cnt=0,sum = 0;
// unsigned int _temp;
u8 data_to_send[50];
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
第7版軟啟動(dòng)+藍(lán)牙.rar
(396.1 KB, 下載次數(shù): 58)
2018-5-13 00:43 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
JIANGJING520
時(shí)間:
2018-11-30 17:22
下載試試看,最近在學(xué)
作者:
liht1634
時(shí)間:
2019-8-29 12:57
最近在玩軟啟動(dòng),了解一下。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1