test4
Dependencies: mbed BufferedSerial LS7366LIB2 FastPWM
main.cpp
- Committer:
- lsh3146
- Date:
- 2020-12-08
- Revision:
- 4:bf278ddb8504
- Parent:
- 2:14b52dee1c35
File content as of revision 4:bf278ddb8504:
#include "mbed.h" #include "main.h" #define sleep_duty 7 int Analysis_limit=2000;// change motor sleep void initial_position(); void begin_pid(); void command_init(); void pid_info(); void Menual_Position_PID(); void test(); int cnt=0; int m_cnt=0; int menual=false; double speed_sleep[6]={0,0,0,0,0,0}; int Analysis_data[400]={0}; int Analysis_cnt=0; int Analysis_total=0; int Analysis_sleep_cnt=0; int stay_cnt=0; double speed_0p5sec[6]={0,}; void input_data_Analysis() { for(int i=0;i<6;i++) { speed_0p5sec[i]=speed_0p5sec[i]*0.99 + dif_encoder_data[i]*0.01; } if(boot_cnt>10000) { for(int i=0;i<6;i++) { if(filterd_dif_taget_speed[i]<0.01 && filterd_dif_taget_speed[i]>-0.01) { if(speed_0p5sec[i]<0.1 && speed_0p5sec[i]>-0.1) { speed_sleep[i]++; if(speed_sleep[i]>(100-sleep_duty)) speed_sleep[i]=(100-sleep_duty); motor_gain[i]=(100-speed_sleep[i])/100; } }else if(filterd_dif_taget_speed[i]>0.01 || filterd_dif_taget_speed[i]<-0.01) { speed_sleep[i]--; if(speed_sleep[i]<0) speed_sleep[i]=0; motor_gain[i]=(100-speed_sleep[i])/100; } } } //pc.printf("(%0.3f,%0.3f,%0.3f)",filterd_dif_taget_speed[0],filterd_dif_taget_speed[1],filterd_dif_taget_speed[2]); pc.printf("speed_sleep ( %d, %d, %d %d, %d, %d )",(int)(speed_sleep[0]),(int)(speed_sleep[1]),(int)(speed_sleep[2]),(int)(speed_sleep[3]),(int)(speed_sleep[4]),(int)(speed_sleep[5])); pc.printf("gain ( %d, %d, %d %d, %d, %d )",(int)(motor_gain[0]*100),(int)(motor_gain[1]*100),(int)(motor_gain[2]*100),(int)(motor_gain[3]*100),(int)(motor_gain[4]*100),(int)(motor_gain[5]*100)); pc.printf("0.2s (%0.3f,%0.3f,%0.3f)",speed_0p5sec[0],speed_0p5sec[1],speed_0p5sec[2]); pc.printf("duty(%d,%d,%d,%d,%d,%d)\r\n",(int)last_percent[0],(int)last_percent[1],(int)last_percent[2],(int)last_percent[3],(int)last_percent[4],(int)last_percent[5]); } int main() { board_init(); MCP23S17_Init(); Segment_Init(); Button_Init(); printf("READ Gain pgain : %ld, input : %ld\r\n", Button_Read_Flash(0), Button_Read_Flash(4)); encoder_check2(); find_limit(); command_init(); pc.printf("PID LOOP_START\r\n"); pid_info(); int a_cnt=0; while(1) { Button_Detection(); comunication(); // 모터의 위치 값을 받음 taget_position_cal((double)cmd_roll,(double)cmd_pitch,(double)cmd_heave,(double)cmd_sway,(double)cmd_surge,(double)cmd_yaw); encoder_read(); Position_PID(); Speed_PID(); int encoder_error[6] = {-1,-1,-1,-1,1,1}; for(int i=0; i<6; i++) { if(encoder_data[i]==encoder_error[i]) motor_power(i,motor_offset[i]); else motor_power(i,Speed_PID_OUTPUT[i]); } if(filter_dif_encoder_data[4]<=2 && filter_dif_encoder_data[4]>=-2) { if(Speed_PID_OUTPUT[4]>motor_offset[4]) motor_offset[4]+=0.2; else if(Speed_PID_OUTPUT[4]<motor_offset[4]) motor_offset[4]-=0.2; } if(filter_dif_encoder_data[5]<=2 && filter_dif_encoder_data[5]>=-2) { if(Speed_PID_OUTPUT[5]>motor_offset[5]) motor_offset[5]+=0.2; else if(Speed_PID_OUTPUT[5]<motor_offset[5]) motor_offset[5]-=0.2; } //pc.printf("%d,%d,%d,%d,%d,%d\r\n",(int)filter_dif_encoder_data[4],(int)filter_dif_encoder_data[5],(int)motor_offset[4],(int)motor_offset[5],(int)Speed_PID_OUTPUT[4],(int)Speed_PID_OUTPUT[5]); if(encoder_data[0]==-1 && encoder_data[1]==-1 && encoder_data[2]==-1 && encoder_data[3]==-1 && encoder_data[4]==1 && encoder_data[5]==1) { while(1) { pc.printf("while(1)\r\n"); pc.printf("%d,%d,%d,%d\r\n",(int)motor_offset[4],(int)motor_offset[5],(int)Speed_PID_OUTPUT[4],(int)Speed_PID_OUTPUT[5]); encoder_data[0] = encoder1.read(); if(encoder_data[0]!=-1) { NVIC_SystemReset(); } wait_us(2500); } } a_cnt++; if(a_cnt>9) { a_cnt=0; input_data_Analysis(); } A_ex_cmd_roll=cmd_roll; A_ex_cmd_pitch=cmd_pitch; A_ex_cmd_heave=cmd_heave; A_ex_cmd_sway=cmd_sway; A_ex_cmd_surge=cmd_surge; A_ex_cmd_yaw=cmd_yaw; } } void command_init() { cmd_roll = 32768; cmd_pitch = 32768; cmd_heave = 32768; cmd_sway = 32768; cmd_surge = 32768; cmd_yaw = 32768; } void pid_info() { pc.printf(" Speed_Pgain Speed_Igain position_Pgain Position_input_filter Speed_I_input_filter offset\r\n"); for(int i = 0; i < 6; i++) { pc.printf("%2d. %6.3f %6.3f %6.3f %6.3f %6.3f %4d\r\n", i + 1, Speed_Pgain[i], Speed_Igain[i], position_Pgain[i], Position_input_filter[i], Speed_I_input_filter[i], (int)offset[i]); } pc.printf("\n\n\n"); } void Menual_Position_PID() { for(int i=0; i<6; i++) { taget_speed[i]=button_offset_posion[i]/5; } }