Browse Source

V508 修复移液泵的BUG

master
zhaohe 1 year ago
parent
commit
940d302a1e
  1. 4
      .settings/language.settings.xml
  2. 8
      sdk/components/pipette_module/pipette_ctrl_module_v2.cpp
  3. 60
      sdk/components/sensors/smtp2_v2/smtp2_v2.cpp
  4. 2
      usrc/project_configs.h

4
.settings/language.settings.xml

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1459951324797802641" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-210824180916356061" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1472687181758918146" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-198088323955240556" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

8
sdk/components/pipette_module/pipette_ctrl_module_v2.cpp

@ -550,7 +550,7 @@ int32_t PipetteModule::do_pipette_distribut(int32_t ul, int32_t zmotor_v) {
DO_IN_THREAD(befor_run());
int32_t distribut_ul = ul;
if (distribut_ul == 0) distribut_ul = m_state.load_val_ul + 1;
if (distribut_ul == 0) distribut_ul = m_state.load_val_ul;
DO_IN_THREAD(m_smtp2.pump_distribut(m_config.aspirate_distribut_pump_vel, distribut_ul));
if (zmotor_v != 0) {
submotor->moveBy(-LLF_DPOS, zmotor_v);
@ -566,7 +566,7 @@ int32_t PipetteModule::do_pipette_distribut(int32_t ul, int32_t zmotor_v) {
m_thread.sleep(10);
}
},
[this]() { // exit fn
[this, ul]() { // exit fn
after_run();
m_smtp2.pump_stop();
m_zmotor->getMotor()->stop();
@ -575,6 +575,10 @@ int32_t PipetteModule::do_pipette_distribut(int32_t ul, int32_t zmotor_v) {
if (m_state.load_val_ul < 0) {
m_state.load_val_ul = 0;
}
if (ul == 0 && m_state.load_val_ul == 1) {
m_state.load_val_ul = 0;
}
m_state.lld_prepared = 0;
ZLOGI(TAG, "do_pipette_distribut finish, load_val_ul:%d", m_state.load_val_ul);

60
sdk/components/sensors/smtp2_v2/smtp2_v2.cpp

@ -16,7 +16,7 @@ using namespace smtp2;
#define SEND_CMD(fmt, ...) sendcmd(true, 1, "/1" fmt "R\r", ##__VA_ARGS__);
#define SEND_CMD_AUTO_RETRY(retry_times, fmt, ...) sendcmd(true, retry_times, "/1" fmt "R\r", ##__VA_ARGS__);
#define SEND_CMD_NLOG(fmt, ...) sendcmd(false, 1, "/1" fmt "R\r", ##__VA_ARGS__);
// 模式2
void SMTP2V2::initialize(UART_HandleTypeDef* uart, uint8_t id, DMA_HandleTypeDef* hdma_rx, DMA_HandleTypeDef* hdma_tx) {
m_uart = uart;
m_hdma_rx = hdma_rx;
@ -68,14 +68,14 @@ int32_t SMTP2V2::pump_get_motor_pos_ul(int32_t* ul) {
}
int32_t SMTP2V2::pump_stop() { return sendcmd(true, 1, "/1TR\r"); }
int32_t SMTP2V2::pump_set_vstart(int32_t vel) { return SEND_CMD("v%d", vel); }
int32_t SMTP2V2::pump_set_vstop(int32_t vel) { return SEND_CMD("c%d", vel); }
int32_t SMTP2V2::pump_set_vmax(int32_t vel) { return SEND_CMD("V%d", vel); }
int32_t SMTP2V2::pump_set_vstart(int32_t vel) { return SEND_CMD("N2v%d", vel * 319); }
int32_t SMTP2V2::pump_set_vstop(int32_t vel) { return SEND_CMD("N2c%d", vel * 319); }
int32_t SMTP2V2::pump_set_vmax(int32_t vel) { return SEND_CMD("N2V%d", vel * 319); }
int32_t SMTP2V2::pump_set_acc_and_dec(int32_t acc, int32_t dec) { return SEND_CMD("L%d,%d", acc, dec); }
int32_t SMTP2V2::pump_set_plld_start_delay(int32_t delay_ms) { return SEND_CMD("T%d", delay_ms); }
int32_t SMTP2V2::pump_put_tip() { return SEND_CMD("E1"); }
int32_t SMTP2V2::pump_init(int32_t v) { return SEND_CMD("V%dZ", v); }
int32_t SMTP2V2::pump_init(int32_t v) { return SEND_CMD("N2V%dZ", v * 319); }
int32_t SMTP2V2::pump_reset() {
_sendcmd(true, "/1!0R\r"); // 复位指令没有回执,所以这里只能使用方法_sendcmd
return 0;
@ -101,25 +101,36 @@ int32_t SMTP2V2::pump_move_to_ul(int32_t v, int32_t ul) {
* ul:0->1000
*/
ZLOGI(TAG, "pump_move_to_ul %d", ul);
int stepNum = ul / 0.319 + 0.5; //+0.5 是为了浮点数强转成正数时采用四舍五入的方式
return SEND_CMD("N%dV%dA%d", 0 /*模式*/, v, stepNum);
int stepNum = ul * 1000; //+0.5 是为了浮点数强转成正数时采用四舍五入的方式
return SEND_CMD("V%dA%d", v * 319, stepNum);
}
int32_t SMTP2V2::pump_aspirate(int32_t v, int32_t ul) {
ZLOGI(TAG, "pump_aspirate %d", ul);
int stepNum = ul / 0.319 + 0.5;
return SEND_CMD("N%dV%dP%d", 0 /*模式*/, v, stepNum);
int stepNum = ul * 1000;
return SEND_CMD("V%dP%d", v * 319, stepNum);
}
int32_t SMTP2V2::pump_distribut(int32_t v, int32_t ul) {
ZLOGI(TAG, "pump_distribut %d", ul);
int stepNum = ul / 0.319 + 0.5;
return SEND_CMD("N%dV%dD%d", 0 /*模式*/, v, stepNum);
int32_t nownl = 0;
int32_t ret = pump_get_state_as_int(kstate_pump_pos_nl, &nownl);
if (ret != 0) return ret;
int stepNum = ul * 1000;
if (stepNum > nownl) {
stepNum = nownl;
}
return SEND_CMD("V%dD%d", v * 319, stepNum);
}
int32_t SMTP2V2::pump_distribut_plld(int32_t pumpv, int32_t pressure_threshold) {
// M100V100t50,0R
ZLOGI(TAG, "pump_distribut_plld %d %d", pumpv, pressure_threshold);
return SEND_CMD("V%dt%d,0", pumpv, pressure_threshold);
return SEND_CMD("V%dt%d,0", pumpv * 319, pressure_threshold);
}
int32_t SMTP2V2::pump_distribut_plld_get_state(int32_t* detected) {
@ -150,7 +161,7 @@ int32_t SMTP2V2::pump_clld_get_state(int32_t* detected) {
// B<n1>,<n2>
int32_t SMTP2V2::pump_distribut_mlld(int32_t pumpv, int32_t c_threshold, int32_t pressure_threshold) {
ZLOGI(TAG, "pump_distribut_mlld %d %d %d", pumpv, c_threshold, pressure_threshold);
return SEND_CMD("V%dB%d,%d", pumpv, c_threshold, pressure_threshold);
return SEND_CMD("V%dB%d,%d", pumpv * 319, c_threshold, pressure_threshold);
}
int32_t SMTP2V2::pump_distribut_mlld_get_state(int32_t* detected) {
int32_t isbusy;
@ -234,11 +245,20 @@ bool SMTP2V2::sendcmd_auto_retry(bool dump, int auto_retry_times, const char* cm
if (_sendcmd(dump, cmd)) {
return true;
}
osDelay(10);
osDelay(50);
m_rxNum = 0;
}
return false;
}
static const char* hex2str(const char* hex, size_t len) {
static char buf[256];
memset(buf, 0, sizeof(buf));
for (size_t i = 0; i < len; i++) {
sprintf(buf + i * 2, "%02X", hex[i]);
}
return buf;
}
bool SMTP2V2::_sendcmd(bool dump, const char* cmd) {
m_rxNum = 0;
@ -252,7 +272,7 @@ bool SMTP2V2::_sendcmd(bool dump, const char* cmd) {
#if DUMP_HEX
if (dump) {
ZLOGI(TAG, "rx:%s", m_rxbuf);
ZLOGI(TAG, "rx:(%d) (%s) %s", m_rxNum, hex2str(m_rxbuf, m_rxNum), m_rxbuf);
}
#endif
@ -286,5 +306,15 @@ bool SMTP2V2::_sendcmd_dma(const char* cmd) {
return false;
}
m_rxNum = SMTP2_BUF_LEN - __HAL_DMA_GET_COUNTER(m_hdma_rx);
if (m_rxNum < 6) {
return false;
}
uint8_t errorcode = (uint8_t)m_rxbuf[2];
if (errorcode < '@') {
return false;
}
if (m_rxbuf[m_rxNum - 1] != '\n' || m_rxbuf[m_rxNum - 2] != '\r' || m_rxbuf[m_rxNum - 3] != 3) {
return false;
}
return true;
}

2
usrc/project_configs.h

@ -1,5 +1,5 @@
#pragma once
#define PC_VERSION 507
#define PC_VERSION 508
#define PC_MANUFACTURER "http://www.iflytop.com/"
#define PC_PROJECT_NAME "a8000_subboard"
#define PC_IFLYTOP_ENABLE_OS 1

Loading…
Cancel
Save