最近準備TI 杯電子設計大賽練習了15年國賽的風力擺控制系統,
游客,本帖隱藏的內容需要積分高于 1 才可瀏覽,您當前積分為 0 兩篇帖子后將此題做得基本符合要求,stm32代碼在附件中,可參考
風力擺控制系統 最終測試版.7z
(418.13 KB, 下載次數: 44)
2019-8-3 17:29 上傳
點擊文件名下載附件
單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
- #include "lcd.h"
- #include "mpu6050.h"
- #include "inv_mpu.h"
- #include "inv_mpu_dmp_motion_driver.h"
- #include "math.h"
- #include "pwm.h"
- #include "outputdata.h"
- //#include "timer.h"
- //顯示屏短屏長度250左右,長屏長度320左右
- #define PI 3.14159265358979323846
- typedef signed int u32_t;
- //全局變量
- double pitch_temp,roll_temp;
- double pitch_temp1,pitch_temp2,roll_temp1,roll_temp2;
- u8 key,flag;
- float R=0,H=87,angle=0,Speed=0;
- float M1_PWM=0.0,M2_PWM=0.0;
- u32 MoveTime=0;
- double set_x=0.0 , set_y=0.0;
- int str[3]={0};
- int str_cur ,motor_flag;
- int init_flag=0;
- const float priod=659; //單擺周期 1660/2.5=664 659
- float A=0.0;
- float Normalization=0.0;
- double Omega=0.0;
- extern u32 count;
- //MPU初始化成功顯示
- void mpu_ok_Init(void){
- while(mpu_dmp_init())
- {
- LCD_ShowString(30,250,200,16,16,"MPU6050 Error");
- delay_ms(200);
-
- LCD_Fill(30,250,239,130+16,WHITE);
- delay_ms(200);
- }
- LCD_ShowString(30,270,200,16,16,"MPU6050 OK");
- }
- //
- void show_angle(void){
- POINT_COLOR=BLUE;//設置字體為藍色
- LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
- LCD_ShowString(30,200,200,16,16," Temp: . C");
- LCD_ShowString(30,220,200,16,16,"Pitch: . C");
- LCD_ShowString(30,240,200,16,16," Roll: . C");
- }
- //獲取角度
- void Get_angle(void){
- u8 t=0,report=1; //默認開啟上報
- int i;
- float pitch,roll,yaw; //歐拉角
- float pitch_sum,roll_sum;
- short temp; //溫度
- key=KEY_Scan(0);
- if(key==KEY0_PRES)
- {
- report=!report;
- if(report)LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
- else LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");
- }
- pitch_temp2=pitch_temp1;
- pitch_temp1=pitch_temp;
- roll_temp2=roll_temp1;
- roll_temp1=roll_temp;
- if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
- {
- temp=MPU_Get_Temperature(); //得到溫度值
- for(i=0;i<5;i++)
- {
- mpu_dmp_get_data(&pitch,&roll,&yaw);
- pitch_sum +=pitch;
- roll_sum +=roll;
- }
- pitch_temp=(pitch_sum/5);
- roll_temp=(roll_sum/5);
- pitch_sum=0;
- roll_sum=0;
- if((t%10)==0)
- {
- if(temp<0)
- {
- LCD_ShowChar(30+48,200,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,200,' ',16,0); //去掉負號
- LCD_ShowNum(30+48+8,200,temp/100,3,16); //顯示整數部分
- LCD_ShowNum(30+48+40,200,temp%10,1,16); //顯示小數部分
- temp=pitch_temp*10;
- if(temp<0)
- {
- LCD_ShowChar(30+48,220,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,220,' ',16,0); //去掉負號
- LCD_ShowNum(30+48+8,220,temp/10,3,16); //顯示整數部分
- LCD_ShowNum(30+48+40,220,temp%10,1,16); //顯示小數部分
- temp=roll_temp*10;
- if(temp<0)
- {
- LCD_ShowChar(30+48,240,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,240,' ',16,0); //去掉負號
- LCD_ShowNum(30+48+8,240,temp/10,3,16); //顯示整數部分
- LCD_ShowNum(30+48+40,240,temp%10,1,16); //顯示小數部分
- t=0;
- LED0=!LED0;//LED閃爍
- }
- }
- t++;
- }
- //設置角度
- int a=0;
- void Set_angle(void){
- key=KeyScan();
- switch(key){
- case 1 : str[str_cur++]=1; break ;
- case 2 : str[str_cur++]=2; break ;
- case 3 : str[str_cur++]=3; break ;
- case 4 : str[str_cur++]=4; break ;
- case 5 : str[str_cur++]=5; break ;
- case 6 : str[str_cur++]=6; break ;
- case 7 : str[str_cur++]=7; break ;
- case 8 : str[str_cur++]=8; break ;
- case 9 : str[str_cur++]=9; break ;
- case 10 : str[str_cur++]=0; break ;
- case 11 : {
- angle=str[0]*100+str[1]*10+str[2];
- str[0]=0;str[1]=0;str[2]=0;str_cur = 0;
- a=1;
- }
- break ;
- default: break;
- }
- LCD_ShowNum(60+48,100,str[0],1,24);
- LCD_ShowNum(60+48+12,100,str[1],1,24);
- LCD_ShowNum(60+48+24,100,str[2],1,24);
- LCD_ShowString(80,50,200,16,16,"setting angle");
- }
- //設置半徑
- void Set_R(void){
- key=KeyScan();
- switch(key){
- case 1 : str[str_cur++]=1; break ;
- case 2 : str[str_cur++]=2; break ;
- case 3 : str[str_cur++]=3; break ;
- case 4 : str[str_cur++]=4; break ;
- case 5 : str[str_cur++]=5; break ;
- case 6 : str[str_cur++]=6; break ;
- case 7 : str[str_cur++]=7; break ;
- case 8 : str[str_cur++]=8; break ;
- case 9 : str[str_cur++]=9; break ;
- case 10 : str[str_cur++]=0; break ;
- case 11 : {
- R=str[0]*10+str[1];
- str[0]=0;str[1]=0;str_cur = 0;
- a=1;
- }
- break ;
- default: break;
- }
- LCD_ShowNum(60+48,100,str[0],1,24);
- LCD_ShowNum(60+48+12,100,str[1],1,24);
- LCD_ShowString(80,50,200,16,16,"setting R");
- }
- //PID調節
- float PID_Adjust(float Point,float Cur_p,float Ki,float Kp,float Kd){
- float error,error1,error2;
- error=Point-Cur_p;
- Speed=Ki*error+Kp*(error-error1)+Kd*(error-2*error1+error2);
- error2=error1;
- error1=error;
- return Speed; //角度轉換成占空比
- }
- //輸出占空比
- void MotorMove(u32_t M1_PWM,u32_t M2_PWM ){
- if((pitch_temp-pitch_temp1<=0)&&(pitch_temp1-pitch_temp2<=0)&&(pitch_temp>=0)){ //**********motor 1 &&(MoveTime%659>=165)&&(MoveTime%659<=329)
- if(set_x>pitch_temp){
- TIM_SetCompare1(TIM3,0);
- TIM_SetCompare2(TIM3,abs(M1_PWM)*0.74);
- OutData[2]=abs(M1_PWM)*0.74;
- }
- else if(set_x<pitch_temp){
- TIM_SetCompare1(TIM3,abs(M1_PWM)*0.18);
- TIM_SetCompare2(TIM3,0);
- OutData[2]=-abs(M1_PWM)*0.18; //0.1942
- }
- else {
- TIM_SetCompare1(TIM3,0);
- TIM_SetCompare2(TIM3,0);
- OutData[2]=0;
- }
- }
- else if((pitch_temp-pitch_temp1>=0)&&(pitch_temp1-pitch_temp2>=0)&&(pitch_temp<=0)){ //&&(MoveTime%659>=495)&&(MoveTime%659<=659)
- if(set_x<pitch_temp){
- TIM_SetCompare1(TIM3,abs(M1_PWM));
- TIM_SetCompare2(TIM3,0);
- OutData[2]=-abs(M1_PWM);
- }
- else if(set_x>pitch_temp){
- TIM_SetCompare1(TIM3,0);
- TIM_SetCompare2(TIM3,abs(M1_PWM)*0.18*0.74);//*0.25
- OutData[2]=abs(M1_PWM)*0.18*0.74;
- }
- else {
- TIM_SetCompare1(TIM3,0);
- TIM_SetCompare2(TIM3,0);
- OutData[2]=0;
- }
- }
- else {
- TIM_SetCompare1(TIM3,0);
- TIM_SetCompare2(TIM3,0);
- OutData[2]=0;
- }
- //*****************************************************************************************motor 2
- if((roll_temp-roll_temp1<=0)&&(roll_temp1-roll_temp2<=0)&&(roll_temp>=0)){ //***********motor 2
- if(set_y>roll_temp){
- TIM_SetCompare3(TIM3,0);
- TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708);
- OutData[1]=abs(M2_PWM)*0.708;
- }else if(set_y<roll_temp){
- TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65*0.18);
- TIM_SetCompare4(TIM3,0);
- OutData[1]=-abs(M2_PWM)*0.18;
- }
- else {
- TIM_SetCompare3(TIM3,0);
- TIM_SetCompare4(TIM3,0);
- OutData[1]=0;
- }
- }
- else if((roll_temp-roll_temp1>=0)&&(roll_temp1-roll_temp2>=0)&&(roll_temp<=0)){
- if(set_y<roll_temp){
- TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65);
- TIM_SetCompare4(TIM3,0);
- OutData[1]=-abs(M2_PWM)*0.65;
- }else if(set_y>roll_temp){
- TIM_SetCompare3(TIM3,0);
- TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708*0.18);
- OutData[1]=abs(M2_PWM)*0.18*0.708;
- }
- else {
- TIM_SetCompare3(TIM3,0);
- TIM_SetCompare4(TIM3,0);
- OutData[1]=0;
- }
- }
- else {
- TIM_SetCompare3(TIM3,0);
- TIM_SetCompare4(TIM3,0);
- OutData[1]=0;
- }
- }
- //第四個任務輸出占空比
- void MotorMove2(u32_t M1_PWM,u32_t M2_PWM ){
- if(set_x>pitch_temp){
- TIM_SetCompare1(TIM3,0);
- TIM_SetCompare2(TIM3,abs(M1_PWM)*0.74);
- OutData[2]=abs(M1_PWM)*0.74;
- }
- else if(set_x<pitch_temp){
- TIM_SetCompare1(TIM3,abs(M1_PWM));
- TIM_SetCompare2(TIM3,0);
- OutData[2]=-abs(M1_PWM); //0.1942
- }
- //*****************************************************************************************motor 2
- if(set_y>roll_temp){
- TIM_SetCompare3(TIM3,0);
- TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708);
- OutData[1]=abs(M2_PWM)*0.708;
- }else if(set_y<roll_temp){
- TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65);
- TIM_SetCompare4(TIM3,0);
- OutData[1]=-abs(M2_PWM)*0.65;
- }
- }
- //任務一
- void Mode_1(void){ //R=25,H=87.8
- MoveTime=MoveTime+5;
- Normalization=MoveTime/priod;
- if(pitch_temp<=0.5&&pitch_temp>=-0.5&&pitch_temp-pitch_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
- else {Omega=2.0*PI*Normalization;motor_flag=0;}
- A=atan((R/H))*57.2958;
- set_x=A*sin(Omega);
- M1_PWM = PID_Adjust(set_x,pitch_temp,475,0,0); //470
- M2_PWM = PID_Adjust(0,roll_temp,500,0.2525,0);
-
- if(M1_PWM > 3000) M1_PWM = 3000;
- if(M1_PWM < -3000) M1_PWM = -3000;
- if(M2_PWM > 3000) M2_PWM = 3000;
- if(M2_PWM < -3000) M2_PWM = -3000;
-
- MotorMove(M1_PWM,M2_PWM);
-
- OutData[0]=set_x*100;
- OutData[1]=pitch_temp*100;
- // OutData[2]=set_y*100;
- // OutData[3]=roll_temp*100;
- OutPut_Data();
- }
- //任務三
- void Mode_2(void){ //R=25,H=87.8,angle=0,Speed=0;
- int flag=0;
- float Ax=0.0,Ay=0.0;
- MoveTime=MoveTime+5;
- Normalization=MoveTime/priod;
- if(angle>=180) angle=angle-180;
- if(angle==30) angle=32;
- if(angle==60) angle=65;
- if(angle==0) flag=1;
- else if(angle==90) flag=2;
- else flag=3;
- if(flag==1){
- if(pitch_temp<=0.5&&pitch_temp>=-0.5&&pitch_temp-pitch_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
- else {Omega=2.0*PI*Normalization;motor_flag=0;}
- }else if(flag==3){
- if(((pitch_temp<0.5&&pitch_temp>-0.5&&pitch_temp-pitch_temp1>0)&&(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0))&&count>659*2) {MoveTime=0;motor_flag=1;} //((pitch_temp<0.5&&pitch_temp>-0.5&&pitch_temp-pitch_temp1>0)||(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0)) 1977
- else {Omega=2.0*PI*Normalization;motor_flag=0;}
- }else if(flag==2){
- if(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
- else {Omega=2.0*PI*Normalization;motor_flag=0;}
- }
- A=atan((25/H))*57.2958;
- Ax=A*cos((u32)angle*0.017453);
- Ay=A*sin((u32)angle*0.017453);
- set_x=Ax*sin(Omega);
- set_y=Ay*sin(Omega);
- M1_PWM = PID_Adjust(set_x,pitch_temp,500,0.0,0);
- M2_PWM = PID_Adjust(set_y,roll_temp,500,0.25,0);
-
- if(M1_PWM > 3000) M1_PWM = 3000;
- if(M1_PWM < -3000) M1_PWM = -3000;
- if(M2_PWM > 3000) M2_PWM = 3000;
- if(M2_PWM < -3000) M2_PWM = -3000;
-
- MotorMove(M1_PWM,M2_PWM);
-
- OutData[0]=set_x*100;
- OutData[1]=pitch_temp*100;
- // OutData[3]=motor_flag*1000;
- OutData[2]=set_y*100;
- OutData[3]=roll_temp*100;
- OutPut_Data();
- }
- //任務四
- void Mode_3(void){
- if((pitch_temp>-45&&pitch_temp<45)||(roll_temp>-45&&roll_temp<45)){
- M1_PWM = PID_Adjust(0,pitch_temp,175,0,0); // 150
- M2_PWM = PID_Adjust(0,roll_temp,175,0,0); //150
- if(M1_PWM > 3000) M1_PWM = 3000;
- if(M1_PWM < -3000) M1_PWM = -3000;
- if(M2_PWM > 3000) M2_PWM = 3000;
- if(M2_PWM < -3000) M2_PWM = -3000;
- }
- else {
- M1_PWM=0;
- M2_PWM=0;
- }
- MotorMove2(M1_PWM,M2_PWM);
- OutData[0]=pitch_temp*100;
- OutData[3]=roll_temp*100;
- OutPut_Data();
- }
- //任務五
- void Mode_4(void){
- float phase;
- MoveTime=MoveTime+5;
- Normalization=MoveTime/priod;
- if((pitch_temp<0.5&&pitch_temp>-0.5&&pitch_temp-pitch_temp1>0)&&count>659*2) {MoveTime=0;motor_flag=1;} //||(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0)) &&(roll_temp<(A+2)&&roll_temp>(A-2))
- else { Omega=2.0*PI*Normalization; motor_flag=0; }
- A=atan((R/H))*57.2958;
- phase=PI/2.0;
- set_x=A*sin(Omega);
- set_y=A*sin(Omega+phase); //phase
- M1_PWM = PID_Adjust(set_x,pitch_temp,240,0,0); // 250
- M2_PWM = PID_Adjust(set_y,roll_temp,200,0.15,0); // 250 0.2525
-
- if(M1_PWM > 3000) M1_PWM = 3000;
- if(M1_PWM < -3000) M1_PWM = -3000;
- if(M2_PWM > 3000) M2_PWM = 3000;
- if(M2_PWM < -3000) M2_PWM = -3000;
-
- MotorMove(M1_PWM,M2_PWM);
- OutData[0]=set_x*100;
- OutData[1]=pitch_temp*100;
- // OutData[3]=motor_flag*1000;
- OutData[2]=set_y*100;
- OutData[3]=roll_temp*100;
- OutPut_Data();
- }
- //畫橢圓
- void Mode_5(void){
- float phase;
- MoveTime=MoveTime+5;
- Normalization=MoveTime/priod;
- if((pitch_temp<0.5&&pitch_temp>-0.5&&pitch_temp-pitch_temp1>0)&&count>659*2) {MoveTime=0;motor_flag=1;} //||(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0)) &&(roll_temp<(A+2)&&roll_temp>(A-2))
- else { Omega=2.0*PI*Normalization; motor_flag=0; }
- A=atan((20/H))*57.2958;
- phase=PI/4.0;
- set_x=A*sin(Omega);
- set_y=A*sin(Omega+phase); //phase
- M1_PWM = PID_Adjust(set_x,pitch_temp,340,0,0); // 340
- M2_PWM = PID_Adjust(set_y,roll_temp,340,0.2525,0); // 340
-
- if(M1_PWM > 3000) M1_PWM = 3000;
- if(M1_PWM < -3000) M1_PWM = -3000;
- if(M2_PWM > 3000) M2_PWM = 3000;
- if(M2_PWM < -3000) M2_PWM = -3000;
-
- MotorMove(M1_PWM,M2_PWM);
- OutData[0]=set_x*100;
- OutData[1]=pitch_temp*100;
- // OutData[3]=motor_flag*1000;
- OutData[2]=set_y*100;
- OutData[3]=roll_temp*100;
- OutPut_Data();
- }
- //界面
- void Menu(void){
- flag=0;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"MENU");
- LCD_ShowString(100,100,200,24,24,"mode1");
- LCD_ShowString(100,130,200,24,24,"mode2");
- LCD_ShowString(100,160,200,24,24,"mode3");
- LCD_ShowString(100,190,200,24,24,"mode4");
- switch(KeyScan()){
- case 12 : {
- LCD_ShowString(60,100,200,24,24,"->");
- delay_ms(1000);
- LCD_Clear(WHITE);
- while(1){
- Set_R();
- if(key==11) {
- LCD_Clear(WHITE);
- mpu_ok_Init();
- flag=1;
- //TIM_Cmd(TIM5,ENABLE); 使能定時器3 init_flag=1;
- init_flag=1;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode1");
- break;
- }
- }
- while(1){
- key=KeyScan();
- if(KEY_Scan(0)==WKUP_PRES)
- {
- TIM_Cmd(TIM5,ENABLE); //使能定時器3
- init_flag=1;
- }
- if(key==16){
- TIM_Cmd(TIM5,DISABLE); // 關閉定時器3 同時 init_flag==0
- init_flag=0;
- LCD_Clear(WHITE);
- break;
- }
- }
- } break ;
- case 13 : {
- LCD_ShowString(60,130,200,24,24,"->");
- delay_ms(1000);
- LCD_Clear(WHITE);
- while(1){
- Set_angle();
- if(key==11) {
- LCD_Clear(WHITE);
- mpu_ok_Init();
- flag=2;
- //TIM_Cmd(TIM5,ENABLE); 使能定時器3 init_flag=1;
- init_flag=1;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode2");
- break;
- }
- }
- while(1){
- key=KeyScan();
- if(KEY_Scan(0)==WKUP_PRES)
- {
- TIM_Cmd(TIM5,ENABLE); //使能定時器3
- init_flag=1;
- }
- if(key==16){
- TIM_Cmd(TIM5,DISABLE); // 關閉定時器3 同時 init_flag==0
- init_flag=0;
- LCD_Clear(WHITE);
- break;
- }
- }
- } break ;
- case 14 : {
- LCD_ShowString(60,160,200,24,24,"->");
- delay_ms(1000);
- LCD_Clear(WHITE);
- mpu_ok_Init();
- flag=3;
- //TIM_Cmd(TIM5,ENABLE); 使能定時器3 init_flag=1;
- init_flag=1;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode3");
- while(1){
- key=KeyScan();
- if(KEY_Scan(0)==WKUP_PRES)
- {
- TIM_Cmd(TIM5,ENABLE); //使能定時器3
- init_flag=1;
- }
- if(key==16){
- TIM_Cmd(TIM5,DISABLE); // 關閉定時器3 同時 init_flag==0
- init_flag=0;
- LCD_Clear(WHITE);
- break;
- }
- }
- } break ;
- case 15 : {
- LCD_ShowString(60,190,200,24,24,"->");
- delay_ms(1000);
- LCD_Clear(WHITE);
- while(1){
- Set_R();
- if(key==11) {
- LCD_Clear(WHITE);
- mpu_ok_Init();
- flag=4;
- //TIM_Cmd(TIM5,ENABLE); 使能定時器3 init_flag=1;
- init_flag=1;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode4");
- break;
- }
- }
- while(1){
- if(KEY_Scan(0)==WKUP_PRES)
- {
- TIM_Cmd(TIM5,ENABLE); //使能定時器3
- init_flag=1;
- }
- key=KeyScan();
- if(key==16){
- TIM_Cmd(TIM5,DISABLE); // 關閉定時器3 同時 init_flag==0
- init_flag=0;
- LCD_Clear(WHITE);
- break;
- }
- }
- } break ;
- default:break;
- }
- }
- //模式1
- void mode1(void){
- int key=0;
- LCD_Clear(WHITE);
- while(1){
- key=KeyScan();
- while(a==0){
- Set_R();
- }
- if(key==13){
- LCD_Clear(WHITE);
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode1");
- show_angle();
- flag=1;
- init_flag=1;
- }
- if(key==16){
- init_flag=0;
- a=0;
- LCD_Clear(WHITE);
- return;
- }
- }
- }
- //模式2
- void mode2(void){
- int key=0;
- LCD_Clear(WHITE);
- while(1){
- key=KeyScan();
- while(a==0){
- Set_angle();
- }
- if(key==13){
- LCD_Clear(WHITE);
- flag=2;
- init_flag=1;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode2");
- show_angle();
- init_flag=1;
- }
- if(key==16){
- init_flag=0;
- a=0;
- LCD_Clear(WHITE);
- return;
- }
- }
- }
- //模式3
- void mode3(void){
- int key=0;
- LCD_Clear(WHITE);
- while(1){
- key=KeyScan();
- flag=3;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode3");
- show_angle();
- init_flag=1;
- if(key==16){
- init_flag=0;
- LCD_Clear(WHITE);
- return;
- }
- }
- }
- //模式4
- void mode4(void){
- int key=0;
- LCD_Clear(WHITE);
- while(1){
- key=KeyScan();
- while(a==0){
- Set_R();
- }
- if(key==13){
- LCD_Clear(WHITE);
- flag=4;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode4");
- show_angle();
- init_flag=1;
- }
- if(key==16){
- init_flag=0;
- a=0;
- init_flag=0;
- LCD_Clear(WHITE);
- return;
- }
- }
- }
- //模式5
- void mode5(void){
- int key=0;
- LCD_Clear(WHITE);
- while(1){
- key=KeyScan();
- flag=5;
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"mode5");
- show_angle();
- init_flag=1;
- if(key==16){
- init_flag=0;
- LCD_Clear(WHITE);
- return;
- }
- }
- }
- //菜單
- void Menu1(void){
- int key=0,flag=0;
- while(1){
- key=KeyScan();
- if(key==12){
- LCD_Fill(60,100,100,250,WHITE);
- flag ++;
- if(flag==6) flag=1;
- }
- if(flag==1) LCD_ShowString(60,100,200,24,24,"->");
- else if(flag==2) LCD_ShowString(60,130,200,24,24,"->");
- else if(flag==3) LCD_ShowString(60,160,200,24,24,"->");
- else if(flag==4) LCD_ShowString(60,190,200,24,24,"->");
- else if(flag==5) LCD_ShowString(60,220,200,24,24,"->");
- if(key==11&&flag==1){
- mode1();
- }else if(key==11&&flag==2){
- mode2();
- }else if(key==11&&flag==3){
- mode3();
- }else if(key==11&&flag==4){
- mode4();
- }else if(key==11&&flag==5){
- mode5();
- }
- LCD_DrawRectangle(10, 10, 230, 310);
- LCD_ShowString(100,40,200,24,24,"MENU");
- LCD_ShowString(100,100,200,24,24,"mode1");
- LCD_ShowString(100,130,200,24,24,"mode2");
- LCD_ShowString(100,160,200,24,24,"mode3");
- LCD_ShowString(100,190,200,24,24,"mode4");
- LCD_ShowString(100,220,200,24,24,"mode5");
- }
- }
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
- delay_init(168); //初始化延時函數
- uart_init(115200); //初始化串口波特率為500000
- LED_Init(); //初始化LED
- KEY_Init(); //初始化按鍵
- KEY1_Init();
- LCD_Init(); //LCD初始化
- MPU_Init(); //初始化MPU6050
- POINT_COLOR=RED;//設置字體為紅色
- TIM3_PWM_Init(3000,0); //84M/84=1Mhz的計數頻率,重裝載值500,所以PWM頻率為 1M/500=2Khz.
- TIM5_Int_Init(1000-1,84-1);//定時器3初始化 計數頻率為1Mhz,PWM頻率為 1M/1000=1Khz. 1ms進一次中斷
- mpu_ok_Init();
- TIM_Cmd(TIM5,ENABLE); //使能定時器3
- while(1)
- {
- // if(KEY_Scan(0)==WKUP_PRES)
- // {
- // TIM_Cmd(TIM5,ENABLE); //使能定時器3
- // init_flag=1;
- // }
- Menu1();
- }
- }
復制代碼
|