#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#define PI 3.141593
#define Vx y[1]
#define Vy y[2]
#define X y[3]//水平
#define Y y[4]//高度
#define f1(y1,y2,y3,y4,t) (-0.1109*y1)//Vx(Vr)
#define f2(y1,y2,y3,y4,t) (-0.1109*y2-9.81)//Vy(Vh)
#define f3(y1,y2,y3,y4,t) (y1)//X(r)
#define f4(y1,y2,y3,y4,t) (y2)//Y(h)
//ALIENTEK 探索者STM32F407开发板 实验13
//LCD显示实验-库函数版本
//技术支持:
www.openedv.com
//淘宝店铺:
http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEK
int main(void)
{
int i,j,V,m=4,n=151;
double F,t,d,A[150],Db[150],Dc[150],B[150],C[150],G[150],M[150],r[150],R[150],y[150],y0[150],k1[150],k2[150],k3[150],k4[150]; //B[151],C[151],G[151]对应论文中X,Y,Z
B[0]=0;//目标初始位置不变
C[0]=100;
G[0]=100;
M[0]=0;//目标速度Vx
M[1]=0;//Vy
M[2]=-10;//Vz
V=120;//弹丸初速120,对应整体中v[0]
d=0.01; //积分步长对应整体中h ,步长是关键,还未确定步长
t=0;
delay_init(168); //初始化延时函数
LCD_Init(); //初始化LCD FSMC接口
POINT_COLOR=RED; //画笔颜 {MOD}:红 {MOD}
LCD_ShowString(30,40,210,24,24,"Angle:");
B[1]=B[0]+M[0]*t;//X(B[1])不断变化
C[1]=C[0]+M[1]*t;
G[1]=G[0]+M[2]*t;//目标z方向速度,
r[1]=sqrt(B[1]*B[1]+G[1]*G[1]);
R[1]=sqrt(r[1]*r[1]+C[1]*C[1]);
A[1]=atan(C[1]/r[1]);//弹丸射角
A[1]=A[1]*180/PI;//弧度化角度,程序中均为弧度,返回值A也为弧度,故化为角度,180度=π弧度 ,1度=π/180 弧度 ( ≈0.017453弧度 )
A[1]=cos(A[1]*PI/180);//输入必须为弧度
y0[1]=V*A[1];//弹丸初始条件
A[1]=atan(C[1]/r[1]);//弹丸射角
A[1]=A[1]*180/PI;//弧度化为度
A[1]=sin(A[1]*PI/180);//输入必须为弧度
y0[2]=V*A[1];
y0[3]=0;
y0[4]=0;
for(j=1;j<=m;j++)//赋值,但不知道为什么这样赋值
y[j]=y0[j];
for(i=1;i<n;i++)
{
for(j=1;j<=m;j++)
{
if(j==1)
k1[j]=d*f1((y[j]),(y[j+1]),(y[j+2]),(y[j+3]),t);
else if(j==2)
k1[j]=d*f2((y[j-1]),(y[j]),(y[j+1]),(y[j+2]),t);
else if(j==3)
k1[j]=d*f3((y[j-2]),(y[j-1]),(y[j]),(y[j+1]),t);
else if(j==4)
k1[j]=d*f4((y[j-3]),(y[j-2]),(y[j-1]),(y[j]),t);
}
for(j=1;j<=m;j++)
{
if(j==1)
k2[j]=d*f1((y[j]+0.5*k1[j]),(y[j+1]+0.5*k1[j+1]),(y[j+2]+0.5*k1[j+2]),(y[j+3]+0.5*k1[j+3]),(t+0.5*d));
else if(j==2)
k2[j]=d*f2((y[j-1]+0.5*k1[j-1]),(y[j]+0.5*k1[j]),(y[j+1]+0.5*k1[j+1]),(y[j+2]+0.5*k1[j+2]),(t+0.5*d));
else if(j==3)
k2[j]=d*f3((y[j-2]+0.5*k1[j-2]),(y[j-1]+0.5*k1[j-1]),(y[j]+0.5*k1[j]),(y[j+1]+0.5*k1[j+1]),(t+0.5*d));
else if(j==4)
k2[j]=d*f4((y[j-3]+0.5*k1[j-3]),(y[j-2]+0.5*k1[j-2]),(y[j-1]+0.5*k1[j-1]),(y[j]+0.5*k1[j]),(t+0.5*d));
}
for(j=1;j<=m;j++)
{
if(j==1)
k3[j]=d*f1((y[j]+0.5*k2[j]),(y[j+1]+0.5*k2[j+1]),(y[j+2]+0.5*k2[j+2]),(y[j+3]+0.5*k2[j+3]),(t+0.5*d));
else if(j==2)
k3[j]=d*f2((y[j-1]+0.5*k2[j-1]),(y[j]+0.5*k2[j]),(y[j+1]+0.5*k2[j+1]),(y[j+2]+0.5*k2[j+2]),(t+0.5*d));
else if(j==3)
k3[j]=d*f3((y[j-2]+0.5*k2[j-2]),(y[j-1]+0.5*k2[j-1]),(y[j]+0.5*k2[j]),(y[j+1]+0.5*k2[j+1]),(t+0.5*d));
else if(j==4)
k3[j]=d*f4((y[j-3]+0.5*k2[j-3]),(y[j-2]+0.5*k2[j-2]),(y[j-1]+0.5*k2[j-1]),(y[j]+0.5*k2[j]),(t+0.5*d));
}
for(j=1;j<=m;j++)
{
if(j==1)
k4[j]=d*f1((y[j]+k3[j]),(y[j+1]+k3[j+1]),(y[j+2]+k3[j+2]),(y[j+3]+k3[j+3]),(t+d));
else if(j==2)
k4[j]=d*f2((y[j-1]+k3[j-1]),(y[j]+k3[j]),(y[j+1]+k3[j+1]),(y[j+2]+k3[j+2]),(t+d));
else if(j==3)
k4[j]=d*f3((y[j-2]+k3[j-2]),(y[j-1]+k3[j-1]),(y[j]+k3[j]),(y[j+1]+k3[j+1]),(t+d));
else if(j==4)
k4[j]=d*f4((y[j-3]+k3[j-3]),(y[j-2]+k3[j-2]),(y[j-1]+k3[j-1]),(y[j]+k3[j]),(t+d));
}
for(j=1;j<=m;j++)
y[j]=y[j]+((k1[j]+2.0*k2[j]+2.0*k3[j]+k4[j])/6.0);
t=i*d;
Db
=X-r;
Dc=Y-C;//误差选择5m
//传递t不断更新预测初值
B[i+1]=B[0]+M[0]*t;//X(B[1])不断变化,故需要数组,按照论文2,位置变化是初始值加上速度*时间
C[i+1]=C[0]+M[1]*t;
G[i+1]=G[0]+M[2]*t;//目标z方向速度,
r[i+1]=sqrt(B[i+1]*B[i+1]+G[i+1]*G[i+1]);
R[i+1]=sqrt(r[i+1]*r[i+1]+C[i+1]*C[i+1]);
while((0<Db)&&(Db<=0.5))//只能保证一个误差,另一个相差很大,是不是步长的问题
{
A=atan(Y/X);//此时为弧度
A=A*180/PI;
F=A;
if(i%1==0)
POINT_COLOR=RED;
printf("F=%.1f
",F);
LCD_ShowxNum(30,50,F,10,24,0);
delay_ms(1000);
}
//修正射角,更新迭代初值
A[i+1]=asin(A);
A[i+1]=A[i+1]+Dc/R;
A[i+1]=A[i+1]*180/PI;
A[i+1]=cos(A[i+1]*PI/180);
y0[1]=V*A[i+1];
A[i+1]=asin(A);
A[i+1]=A[i+1]+Dc/R;
A[i+1]=A[i+1]*180/PI;
A[i+1]=sin(A[i+1]*PI/180);
y0[2]=V*A[i+1];
y0[3]=0;
y0[4]=0;
for(j=1;j<=m;j++);
y[j]=y0[j];
}
}
上面程序在vc++上运行良好,想移植到32f407上,鼓捣好几天了,总是不行,lcd驱动应该是可以的,因为是初学32所以是在tftlcd显示程序改的,没敢改内部函数,上一个帖子是想逐块实验找问题,遇到的问题,请高手帮忙看看,试过将数组改成A[15],也是不行,用double型简单显示,也可以显示
果然可以了,非常感谢
一周热门 更多>