Browse Source

V509 尝试修复移液枪BUG

master
zhaohe 1 year ago
parent
commit
a8417e02cc
  1. 4
      .settings/language.settings.xml
  2. 5
      sdk/components/pipette_module/pipette_ctrl_module_v2.cpp
  3. 145
      sdk/components/sensors/smtp2_v2/smtp2_v2.cpp
  4. 21
      sdk/components/sensors/smtp2_v2/smtp2_v2.hpp
  5. 16
      sdk/components/step_motor_ctrl_module/step_motor_ctrl_module.cpp
  6. 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="-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">
<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">
<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="-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">
<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">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

5
sdk/components/pipette_module/pipette_ctrl_module_v2.cpp

@ -622,7 +622,6 @@ int32_t PipetteModule::do_pipette_shake_up(int32_t ul, int32_t zmotor_v, int32_t
DO_IN_THREAD(m_smtp2.pump_aspirate(m_config.aspirate_distribut_pump_vel, ul));
while (true) {
if (!check_when_run()) break;
if (m_thread.getExitFlag()) break;
int32_t isbusy = 0;
DO_IN_THREAD(m_smtp2.pump_get_state(&isbusy));
@ -640,7 +639,6 @@ int32_t PipetteModule::do_pipette_shake_up(int32_t ul, int32_t zmotor_v, int32_t
if (zmotor_v != 0) submotor->moveBy(-dpos, zmotor_v);
while (true) {
if (!check_when_run()) return;
if (m_thread.getExitFlag()) return;
int32_t isbusy = 0;
bool motorIsReachTarget = false;
@ -652,7 +650,7 @@ int32_t PipetteModule::do_pipette_shake_up(int32_t ul, int32_t zmotor_v, int32_t
m_thread.sleep(10);
}
dotimes++;
if (dotimes >= times) {
if (dotimes >= times || m_thread.getExitFlag()) {
ZLOGI(TAG, "shake end ...")
break;
}
@ -663,7 +661,6 @@ int32_t PipetteModule::do_pipette_shake_up(int32_t ul, int32_t zmotor_v, int32_t
DO_IN_THREAD(m_smtp2.pump_aspirate(m_config.aspirate_distribut_pump_vel, ul));
while (true) {
if (!check_when_run()) return;
if (m_thread.getExitFlag()) return;
int32_t isbusy = 0;
bool motorIsReachTarget = false;

145
sdk/components/sensors/smtp2_v2/smtp2_v2.cpp

@ -11,11 +11,8 @@ using namespace smtp2;
#define TAG "SMTP2"
#define OVERTIME 100
#define DUMP_HEX 0
#define DUMP_HEX 1
#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;
@ -30,7 +27,7 @@ bool SMTP2V2::pump_ping() {
}
int32_t SMTP2V2::pump_get_state(int32_t* isbusy) {
size_t rxlen = 0;
int ret = sendcmd(false /*dump*/, 5 /*retry_times*/, "/1QR\r");
int ret = readstate(false, "/1QR\r");
if (ret != 0) return ret;
uint8_t errorcode = (uint8_t)m_rxbuf[2];
@ -43,7 +40,7 @@ int32_t SMTP2V2::pump_get_state(int32_t* isbusy) {
}
int32_t SMTP2V2::pump_get_state_as_int(int32_t state_index, int32_t* val) {
size_t rxlen = 0;
int ret = SEND_CMD_AUTO_RETRY(3, "?%d\r", state_index);
int ret = readstate(true, "/1?%d\r", state_index);
if (ret != 0) {
return ret;
}
@ -67,20 +64,20 @@ int32_t SMTP2V2::pump_get_motor_pos_ul(int32_t* ul) {
return ret;
}
int32_t SMTP2V2::pump_stop() { return sendcmd(true, 1, "/1TR\r"); }
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_stop() { return setstate(true, "/1TR\r"); }
int32_t SMTP2V2::pump_set_vstart(int32_t vel) { return setstate(true, "/1N2v%dR\r", vel * 319); }
int32_t SMTP2V2::pump_set_vstop(int32_t vel) { return setstate(true, "/1N2c%dR\r", vel * 319); }
int32_t SMTP2V2::pump_set_vmax(int32_t vel) { return setstate(true, "/1N2V%dR\r", vel * 319); }
int32_t SMTP2V2::pump_set_acc_and_dec(int32_t acc, int32_t dec) { return setstate(true, "/1L%d,%dR\r", acc, dec); }
int32_t SMTP2V2::pump_set_plld_start_delay(int32_t delay_ms) { return setstate(true, "/1T%dR\r", delay_ms); }
int32_t SMTP2V2::pump_put_tip() { return SEND_CMD("E1"); }
int32_t SMTP2V2::pump_init(int32_t v) { return SEND_CMD("N2V%dZ", v * 319); }
int32_t SMTP2V2::pump_put_tip() { return runaction(true, "/1E1R\r"); }
int32_t SMTP2V2::pump_init(int32_t v) { return runaction(true, "/1N2V%dZR\r", v * 319); }
int32_t SMTP2V2::pump_reset() {
_sendcmd(true, "/1!0R\r"); // 复位指令没有回执,所以这里只能使用方法_sendcmd
return 0;
}
#if 0
static int32_t Get1fromfloat(const float& val) {
float temp1 = val;
int32_t t1 = (uint32_t)(temp1 * 10) % 10;
@ -91,6 +88,7 @@ static int32_t Get1fromfloat(const float& val) {
}
return (int32_t)temp1;
}
#endif
int32_t SMTP2V2::pump_move_to_ul(int32_t v, int32_t ul) {
/**
@ -102,13 +100,23 @@ int32_t SMTP2V2::pump_move_to_ul(int32_t v, int32_t ul) {
*/
ZLOGI(TAG, "pump_move_to_ul %d", ul);
int stepNum = ul * 1000; //+0.5 是为了浮点数强转成正数时采用四舍五入的方式
return SEND_CMD("V%dA%d", v * 319, stepNum);
return pump_move_to_nl(v, ul * 1000);
}
int32_t SMTP2V2::pump_move_to_nl(int32_t v, int32_t nl) {
ZLOGI(TAG, "pump_move_to_nl %d", nl);
return runaction(true, "/1V%dA%dR\r", v * 319, nl);
}
int32_t SMTP2V2::pump_aspirate(int32_t v, int32_t ul) {
ZLOGI(TAG, "pump_aspirate %d", ul);
int stepNum = ul * 1000;
return SEND_CMD("V%dP%d", v * 319, stepNum);
int32_t nownl;
int32_t ret = pump_get_state_as_int(kstate_pump_pos_nl, &nownl);
if (ret != 0) return ret;
int targetnl = nownl + ul * 1000;
return pump_move_to_nl(v, targetnl);
}
int32_t SMTP2V2::pump_distribut(int32_t v, int32_t ul) {
ZLOGI(TAG, "pump_distribut %d", ul);
@ -118,19 +126,15 @@ int32_t SMTP2V2::pump_distribut(int32_t v, int32_t ul) {
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);
int targetnl = nownl - ul * 1000;
if (targetnl < 0) targetnl = 0;
return pump_move_to_nl(v, targetnl);
}
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 * 319, pressure_threshold);
return runaction(true, "/1V%dt%d,0R\r", pumpv * 319, pressure_threshold);
}
int32_t SMTP2V2::pump_distribut_plld_get_state(int32_t* detected) {
@ -146,7 +150,7 @@ int32_t SMTP2V2::pump_distribut_plld_get_state(int32_t* detected) {
int32_t SMTP2V2::pump_clld(int32_t c_threshold) { //
ZLOGI(TAG, "pump_clld %d", c_threshold);
return SEND_CMD("^%d", c_threshold);
return runaction(true, "/1^%dR\r", c_threshold);
}
int32_t SMTP2V2::pump_clld_get_state(int32_t* detected) {
int32_t isbusy;
@ -161,7 +165,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 * 319, c_threshold, pressure_threshold);
return runaction(true, "/1V%dB%d,%dR\r", pumpv * 319, c_threshold, pressure_threshold);
}
int32_t SMTP2V2::pump_distribut_mlld_get_state(int32_t* detected) {
int32_t isbusy;
@ -179,7 +183,7 @@ int32_t SMTP2V2::pump_distribut_mlld_get_state(int32_t* detected) {
***********************************************************************************************************************/
bool SMTP2V2::write_cmd(const char* cmd) {
int32_t ret = 0;
ret = sendcmd(true, 1, cmd);
ret = _sendcmd(true, cmd);
return ret == 0;
}
void SMTP2V2::getack(char* rx, int32_t* rxbufsize) {
@ -228,28 +232,96 @@ int32_t SMTP2V2::getAck0AsInt() {
int intval = atoi(&m_rxprocessbuf[3]);
return intval;
}
int32_t SMTP2V2::runaction(bool dump, const char* format, ...) {
static char cmdbuf[256];
va_list args;
va_start(args, format);
vsnprintf(cmdbuf, sizeof(cmdbuf), format, args);
va_end(args);
return _runaction(dump, cmdbuf);
}
int32_t SMTP2V2::sendcmd(bool dump, int auto_retry_times, const char* format, ...) {
static char buf[256];
int32_t SMTP2V2::_runaction(bool dump, const char* cmd) {
for (size_t i = 0; i < 3; i++) {
if (i != 0) {
ZLOGE(TAG, "resend cmd .......................................................");
osDelay(10);
}
if (!_sendcmd(dump, "/1T\r")) continue;
if (!_sendcmd(dump, "/1CR\r")) continue;
if (!_sendcmd(dump, cmd)) continue;
return getAckEcode();
}
return getAckEcode();
}
int32_t SMTP2V2::readstate(bool dump, const char* format, ...) {
static char cmdbuf[256];
va_list args;
va_start(args, format);
vsnprintf(cmdbuf, sizeof(cmdbuf), format, args);
va_end(args);
for (size_t i = 0; i < 3; i++) {
if (_sendcmd(dump, cmdbuf)) {
return getAckEcode();
}
osDelay(20);
}
return getAckEcode();
}
int32_t SMTP2V2::setstate(bool dump, const char* format, ...) {
static char cmdbuf[256];
va_list args;
va_start(args, format);
vsnprintf(buf, sizeof(buf), format, args);
vsnprintf(cmdbuf, sizeof(cmdbuf), format, args);
va_end(args);
sendcmd_auto_retry(dump, auto_retry_times, buf);
for (size_t i = 0; i < 3; i++) {
if (_sendcmd(dump, cmdbuf)) {
return getAckEcode();
}
osDelay(20);
}
return getAckEcode();
}
bool SMTP2V2::sendcmd_auto_retry(bool dump, int auto_retry_times, const char* cmd) {
#if 0
int32_t SMTP2V2::sendcmd(bool dump, int auto_retry_times, const char* format, ...) {
static char cmdbuf[256];
va_list args;
va_start(args, format);
vsnprintf(cmdbuf, sizeof(cmdbuf), format, args);
va_end(args);
for (size_t i = 0; i < auto_retry_times; i++) {
if (_sendcmd(dump, cmd)) {
if (_sendcmd(dump, cmdbuf)) {
return true;
}
osDelay(50);
m_rxNum = 0;
}
return false;
return getAckEcode();
}
int32_t SMTP2V2::send_action_cmd(bool dump, int auto_retry_times, const char* format, ...) {
static char cmdbuf[256];
va_list args;
va_start(args, format);
vsnprintf(cmdbuf, sizeof(cmdbuf), format, args);
va_end(args);
for (size_t i = 0; i < auto_retry_times; i++) {
if (_sendcmd(dump, cmdbuf)) {
return true;
}
ZLOGI(TAG, "send_action_cmd retry %d", i);
osDelay(10);
sendcmd(true, 2, "/1TR\r");
osDelay(20);
}
return getAckEcode();
}
#endif
static const char* hex2str(const char* hex, size_t len) {
static char buf[256];
@ -259,6 +331,7 @@ static const char* hex2str(const char* hex, size_t len) {
}
return buf;
}
bool SMTP2V2::_sendcmd(bool dump, const char* cmd) {
m_rxNum = 0;

21
sdk/components/sensors/smtp2_v2/smtp2_v2.hpp

@ -181,11 +181,12 @@ class SMTP2V2 {
/***********************************************************************************************************************
* ACTION *
***********************************************************************************************************************/
int32_t pump_init(int32_t v); // 泵机初始化(归零)
int32_t pump_reset(); // 泵机复位
int32_t pump_stop(); // 停止
int32_t pump_put_tip(); // 丢弃TIP
int32_t pump_init(int32_t v); // 泵机初始化(归零)
int32_t pump_reset(); // 泵机复位
int32_t pump_stop(); // 停止
int32_t pump_put_tip(); // 丢弃TIP
int32_t pump_move_to_ul(int32_t v, int32_t ul); //
int32_t pump_move_to_nl(int32_t v, int32_t nl); //
int32_t pump_distribut_plld(int32_t pumpv, int32_t pressure_threshold); // plld,分配探测
int32_t pump_distribut_plld_get_state(int32_t* detected);
@ -206,10 +207,18 @@ class SMTP2V2 {
void getack(char* rx, int32_t* rxbufsize);
private:
int32_t runaction(bool dump, const char* format, ...);
int32_t _runaction(bool dump, const char* cmd);
int32_t readstate(bool dump, const char* format, ...);
int32_t setstate(bool dump, const char* format, ...);
#if 0
int32_t sendcmd(bool dump, int auto_retry_times, const char* format, ...);
int32_t send_action_cmd(bool dump, int auto_retry_times, const char* format, ...);
bool sendcmd_auto_retry(bool dump, int auto_retry_times, const char* cmd);
bool _sendcmd(bool dump, const char* cmd);
bool _sendcmd_dma(const char* cmd);
#endif
bool _sendcmd(bool dump, const char* cmd);
bool _sendcmd_dma(const char* cmd);
int32_t getAckEcode();
int32_t getAck0AsInt();

16
sdk/components/step_motor_ctrl_module/step_motor_ctrl_module.cpp

@ -481,7 +481,7 @@ int32_t StepMotorCtrlModule::step_motor_easy_reciprocating_motion(int32_t startp
if (ecode != 0) return ecode;
int32_t x_startpos = startpos;
int32_t x_endpos = endpos;
int32_t x_endpos = endpos;
int32_t x_beginpos;
getnowpos(x_beginpos);
@ -499,19 +499,19 @@ int32_t StepMotorCtrlModule::step_motor_easy_reciprocating_motion(int32_t startp
ZLOGI(TAG, "reciprocating_motion move pos:%d", x_startpos);
moveTo(x_startpos, m_cfg.motor_default_velocity);
while (!m_stepM1->isReachTarget()) {
osDelay(50);
if (m_thread.getExitFlag()) break;
if (!check_when_run()) break;
vTaskDelay(5);
}
ZLOGI(TAG, "reciprocating_motion move pos:%d", x_endpos);
moveTo(x_endpos, m_cfg.motor_default_velocity);
while (!m_stepM1->isReachTarget()) {
osDelay(50);
if (m_thread.getExitFlag()) break;
if (!check_when_run()) break;
vTaskDelay(5);
}
}
@ -521,7 +521,7 @@ int32_t StepMotorCtrlModule::step_motor_easy_reciprocating_motion(int32_t startp
if (m_thread.getExitFlag()) break;
if (!check_when_run()) break;
vTaskDelay(5);
osDelay(50);
}
after_motor_move();
@ -542,7 +542,7 @@ int32_t StepMotorCtrlModule::do_step_motor_easy_rotate(int32_t direction) {
while (true) {
if (m_thread.getExitFlag()) break;
if (!check_when_run()) break;
vTaskDelay(5);
osDelay(50);
}
}
@ -565,7 +565,7 @@ int32_t StepMotorCtrlModule::do_step_motor_easy_move_to(int32_t tox) {
if (m_thread.getExitFlag()) break;
if (!check_when_run()) break;
vTaskDelay(5);
osDelay(50);
}
}

2
usrc/project_configs.h

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

Loading…
Cancel
Save