diff --git a/README.md b/README.md index 9d8ad7b..ec1e52f 100644 --- a/README.md +++ b/README.md @@ -40,28 +40,10 @@ 1. 前往灯哥开源[FOCgit](https://gitee.com/ream_d/Deng-s-foc-controller)下载Arduino开发环境(~~也可自行下载Arduino并安装SimpleFOC~~)并打开本项目内的Arduino内的main,烧录程序到ESP32。 2. 打开本项目内的`python_gui`内的`可执行文件_main`内的**main.exe**并连接上WIFI:ESP32。点击设置开始调参。 +![Image text](image/tiaocan.gif) +3. K值可以用滑块调整,拖动滑块就会发送参数命令,但是调整到合适值之后需要自行在Arduino的main中修改再烧录一次 -3. 第一次使用需要把在初始化中读取eeprom的数据给注释掉。因为在程序初始的时候eeprom是没有数据的,就导致读取时候是NAN。然后wifi发送NAN会有问题,就无法通过上位机发数据给esp32了。 - -![Image text](image/frist.png) - -4. 输入一些初始值到eeprom中: - -| 参数命令 | 说明 | -| ---------------- |---------------------- | -|TA89.3|角度| -|SV1.8|摇摆电压| -|SA20|摇摆角度| -|VI120|平衡前FOC速度环的I为20| -|VP10.5|平衡前FOC速度环的P为0.5| -|VI210|平衡后FOC速度环的I为10| -|VP20.2|平衡后FOC速度环的P为0.2| - -![调参](image/tiaocan.gif) - -5. K值可以用滑块调整,拖动滑块就会发送参数命令,但是调整到合适值之后需要自行在Arduino的main中修改再烧录一次 - -6. 滑条:最左边输入框为滑块下限,右边是滑块上限,滑条等分成**200**份,命令是**字符串**,滑动滑块发送**字符串** + **数值** +4. 滑条:最左边输入框为滑块下限,右边是滑块上限,滑条等分成**200**份,命令是**字符串**,滑动滑块发送**字符串** + **数值** 比如让平衡角度为90度,则输入:TA90,并且会存入eeprom的位置0中 注:wifi发送**命令不能过快**,因为每次都会保存进eeprom,K参数没有保存到EEPROM所以可以使用滑条调整。 diff --git a/arduino/main/main.ino b/arduino/main/main.ino index cb17984..fa718a8 100644 --- a/arduino/main/main.ino +++ b/arduino/main/main.ino @@ -103,7 +103,7 @@ void do_K22(char* cmd) { comm.scalar(&LQR_K2_2, cmd); } void do_K23(char* cmd) { comm.scalar(&LQR_K2_3, cmd); } #else void do_vp1(char* cmd) { comm.scalar(&v_p_1, cmd); EEPROM.writeFloat(12, v_p_1);} -void do_vi1(char* cmd) { comm.scalar(&v_i_1, cmd);EEPROM.writeFloat(16, v_p_1); } +void do_vi1(char* cmd) { comm.scalar(&v_i_1, cmd);EEPROM.writeFloat(16, v_i_1); } void do_vp2(char* cmd) { comm.scalar(&v_p_2, cmd); EEPROM.writeFloat(20, v_p_2);} void do_vi2(char* cmd) { comm.scalar(&v_i_2, cmd);EEPROM.writeFloat(24, v_i_2); } void do_tv(char* cmd) { comm.scalar(&target_velocity, cmd); } @@ -134,24 +134,47 @@ void setup() { delay(1000); ESP.restart(); } - +// eeprom 读取 +float nan = EEPROM.readFloat(0); +if(isnan(nan)) + { + Serial.println("frist write"); + EEPROM.writeFloat(0, target_angle); + EEPROM.writeFloat(4, swing_up_voltage); + EEPROM.writeFloat(8, swing_up_angle); + EEPROM.writeFloat(12, v_p_1); + EEPROM.writeFloat(16, v_i_1); + EEPROM.writeFloat(20, v_p_2); + EEPROM.writeFloat(24, v_i_2); + EEPROM.commit(); + } + else + { + target_angle = EEPROM.readFloat(0); + swing_up_voltage = EEPROM.readFloat(4); + swing_up_angle = EEPROM.readFloat(8); + v_p_1 = EEPROM.readFloat(12); + v_i_1 = EEPROM.readFloat(16); + v_p_2 = EEPROM.readFloat(20); + v_i_2 = EEPROM.readFloat(24); + motor.PID_velocity.P = v_p_1; + motor.PID_velocity.I = v_i_1; + } //命令设置 comm.add("TA",do_TA); - comm.add("START",do_START); - comm.add("MOTOR",do_MOTOR); - comm.add("SV",do_SV); - comm.add("SA",do_SA); - target_angle = EEPROM.readFloat(0); -swing_up_voltage = EEPROM.readFloat(4); -swing_up_angle = EEPROM.readFloat(8); -#if FLAG_V + comm.add("START",do_START); + comm.add("MOTOR",do_MOTOR); + comm.add("SV",do_SV); + comm.add("SA",do_SA); + +#if FLAG_V //电压模式 comm.add("K11",do_K11); comm.add("K12",do_K12); comm.add("K13",do_K13); comm.add("K21",do_K21); comm.add("K22",do_K22); comm.add("K23",do_K23); -#else +#else //速度模式 comm.add("VP1",do_vp1); comm.add("VI1",do_vi1); comm.add("VP2",do_vp2); @@ -163,12 +186,6 @@ swing_up_angle = EEPROM.readFloat(8); comm.add("K41",do_K41); comm.add("K42",do_K42); comm.add("K43",do_K43); - v_p_1 = EEPROM.readFloat(12); - v_i_1 = EEPROM.readFloat(16); - v_p_2 = EEPROM.readFloat(20); - v_i_2 = EEPROM.readFloat(24); - motor.PID_velocity.P = v_p_1; - motor.PID_velocity.I = v_i_1; #endif // kalman mpu6050 init Wire.begin(19, 18,400000);// Set I2C frequency to 400kHz @@ -337,7 +354,7 @@ if (abs(pendulum_angle) < swing_up_angle) // if angle small enough stabilize 0.5 } #endif -#if 0 +#if 1 //Serial.print(gyroZangle);Serial.print("\t"); Serial.print(kalAngleZ);Serial.print("\t");