diff --git a/app/MDK-ARM/app.uvguix.h_zha b/app/MDK-ARM/app.uvguix.h_zha index 21a9c6b..d538a75 100644 --- a/app/MDK-ARM/app.uvguix.h_zha +++ b/app/MDK-ARM/app.uvguix.h_zha @@ -93,8 +93,8 @@ 2 3 - -32000 - -32000 + -1 + -1 -1 @@ -102,8 +102,8 @@ 14 - 375 - 1475 + 376 + 1476 1000 @@ -111,7 +111,7 @@ 0 738 - 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000004000000000000000100000059443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C626F6172645C68617264776172652E637070000000000C68617264776172652E63707000000000C5D4F200FFFFFFFF71443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C696269666C79746F705F6D6963726F5C73746D33325C62617369635C73746D33325F68616C2E637070000000000D73746D33325F68616C2E63707000000000FFDC7800FFFFFFFF70443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C6C6E63756261746F725F74656D70657261747572655F636F6E74726F6C5F736572766963652E63707000000000296C6E63756261746F725F74656D70657261747572655F636F6E74726F6C5F736572766963652E63707000000000BECEA100FFFFFFFF66443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C7372635C69635C746D6334333631412E687070000000000C746D6334333631412E68707000000000F0A0A100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000FC010000660000009006000042020000 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000004000000020000000100000059443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C626F6172645C68617264776172652E637070000000000C68617264776172652E63707000000000C5D4F200FFFFFFFF71443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C696269666C79746F705F6D6963726F5C73746D33325C62617369635C73746D33325F68616C2E637070000000000D73746D33325F68616C2E63707000000000FFDC7800FFFFFFFF70443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C6C6E63756261746F725F74656D70657261747572655F636F6E74726F6C5F736572766963652E63707000000000296C6E63756261746F725F74656D70657261747572655F636F6E74726F6C5F736572766963652E63707000000000BECEA100FFFFFFFF66443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C7372635C69635C746D6334333631412E687070000000000C746D6334333631412E68707000000000F0A0A100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000FC010000660000009006000042020000 @@ -1822,7 +1822,7 @@ Build 966 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000036170709600000000000000010003617070000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000002001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000036170709600000000000000010003617070000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 583 @@ -1838,7 +1838,7 @@ Debug 2373 - 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 898 @@ -3603,12 +3603,12 @@ 0 100 - 0 + 2 ..\..\src\board\hardware.cpp 0 - 372 - 396 + 1 + 1 1 0 diff --git a/src/board/fan_state_monitor.cpp b/src/board/fan_state_monitor.cpp index 0574794..b98d172 100644 --- a/src/board/fan_state_monitor.cpp +++ b/src/board/fan_state_monitor.cpp @@ -28,9 +28,9 @@ void FanStateMonitor::doFanStateCheckPeriodicJob() { GPIO_PinState pinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin); if (HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin) != m_lastPinState) { m_fanFBCount++; + m_count++; m_lastPinState = pinState; } - /** * @brief 电机工作超过2秒,且2秒内没有反馈信号,判断电机不工作 */ diff --git a/src/board/fan_state_monitor.hpp b/src/board/fan_state_monitor.hpp index e8eeeb9..45f2c5a 100644 --- a/src/board/fan_state_monitor.hpp +++ b/src/board/fan_state_monitor.hpp @@ -14,6 +14,7 @@ class FanStateMonitor { bool m_lastFanState; // 上次风扇状态,用来实现捕获风扇打开事件 bool m_fanError; // 风扇故障标志位 + uint32_t m_count; // 总计数,不清零 public: FanStateMonitor(/* args */){}; @@ -29,9 +30,9 @@ class FanStateMonitor { * @return true * @return false */ - bool getFanError() { return m_fanError; } - void clearFanError() { m_fanError = false; } - + bool getFanError() { return m_fanError; } + void clearFanError() { m_fanError = false; } + uint32_t getCount() { return m_count; } /******************************************************************************* * 周期性调度任务 * *******************************************************************************/ @@ -39,7 +40,6 @@ class FanStateMonitor { * @brief 周期性调度任务,需要上层代码尽可能的频繁调度 */ void periodicJob(); - private: void doFanStateCheckPeriodicJob(); }; diff --git a/src/board/hardware.cpp b/src/board/hardware.cpp index bee4d44..794361a 100644 --- a/src/board/hardware.cpp +++ b/src/board/hardware.cpp @@ -2,8 +2,8 @@ #include "i2c.h" using namespace iflytop; -#define TAG "hardware" -#define ENABLE_CAN 1 +#define TAG "hardware" +#define TEST_TMC_ENCODER_DIRECTION 0 extern "C" { int fputc(int ch, FILE *stream) { uint8_t c = ch; @@ -18,148 +18,124 @@ void Hardware::registerListener(HardwareListener *listener) { m_listenerNum++; } } - void Hardware::hardwareinit() { STM32_HAL::regListener(this); - - m_canOnRxDataFlag = false; - - /******************************************************************************* - * 调试指示灯初始化 * - *******************************************************************************/ debug_light_init(); - - /******************************************************************************* - * CANSLAVEService初始化 * - *******************************************************************************/ - IflytopCanSlave::iflytop_can_slave_config_t *config = canSlaveService.createDefaultConfig(DEVICE_ID); - canSlaveService.initialize(this, config); - canSlaveService.activateRxIT(); - canSlaveService.registerListener(this); - /******************************************************************************* - * 帕尔贴初始化 * - *******************************************************************************/ + can_init(); + temperature_init(); + fan_init(1000); peltier_init(); - /******************************************************************************* - * 温度传感器初始化 * - *******************************************************************************/ - tmp117[0].initializate(&hi2c1, TMP117::ID0); - tmp117[1].initializate(&hi2c1, TMP117::ID1); - tmp117[2].initializate(&hi2c1, TMP117::ID2); - tmp117[3].initializate(&hi2c1, TMP117::ID3); - - /******************************************************************************* - * 电机初始化 * - *******************************************************************************/ tmc_init(); - tmc_extern_clk_enable(); - // 4361初始化 - TMC4361A::TMC4361AConfig_t *tmc4361aconfig = TMC4361A::createDeafultTMC4361AConfig(this); - tmc4361aconfig->encoder_config.diff_enc_in_disable = false; - tmc4361aconfig->encoder_config.invert_enc_dir = true; // 如果编码器方向和期望方向相反,设置为true - tmc4361aconfig->encoder_config.enc_in_res = 4000; - tmc4361aconfig->close_loop_config.enable_closed_loop = false; - - tmc4361motor1.initialize(MOTOR_1_TMC4361A_CHANNEL, TMC4361A::IC_TMC2160, tmc4361aconfig); - tmc4361motor1.setMaximumAcceleration(300000); - tmc4361motor1.setMaximumDeceleration(300000); - - HAL_Delay(100); - // 使能电机 - tmc4361motor1.enableIC(true); - /** - * @brief 通过读取Version寄存器来判断芯片是否正常 - */ - int32_t ic4361Version = tmc4361motor1.readICVersion(); - int32_t ic2160Version = tmc4361motor1.read2160ICVersion(); - ZLOGI(TAG, "TMC4361Version:%x TMC2160VERSION:%x", ic4361Version, ic2160Version); - if (ic4361Version != 2) { - ZLOGE(TAG, "TMC4361 or TMC2160 is not normal"); - } - // 期望 4361Version:2 ic2160Version:30 - // tmc4361motor1.stop(); - // 测试编码器方向 - // tmc4361motor1.rotate(-300000); - // while (true) { - // HAL_Delay(100); - // ZLOGI(TAG, "TMC4361A: XACTUAL:%d ENC_POS:%d DIFF:%d", tmc4361motor1.getXACTUAL(), tmc4361motor1.getENC_POS(), tmc4361motor1.getENC_POS_DEV()); - // } - - /******************************************************************************* - * 风扇初始化 * - *******************************************************************************/ - fanInit(1000); - /** - * @brief 风扇反馈初始化 - * - * FAN0_FB_INT PC1 - * FAN1_FB_INT PC4 - * FAN2_FB_INT PC5 - * FAN3_FB_INT PC6 - * FAN4_FB_INT PC7 - * FAN5_FB_INT PC10 - */ - m_fanStateMonitor[0].initialize(this, GPIOC, GPIO_PIN_1, fanGetPowerState(0)); - m_fanStateMonitor[1].initialize(this, GPIOC, GPIO_PIN_4, fanGetPowerState(1)); - m_fanStateMonitor[2].initialize(this, GPIOC, GPIO_PIN_5, fanGetPowerState(2)); - m_fanStateMonitor[3].initialize(this, GPIOC, GPIO_PIN_6, fanGetPowerState(3)); - m_fanStateMonitor[4].initialize(this, GPIOC, GPIO_PIN_7, fanGetPowerState(4)); - m_fanStateMonitor[5].initialize(this, GPIOC, GPIO_PIN_10, fanGetPowerState(5)); -} -int32_t Hardware::port_tmc4361_get_version(uint8_t channel) { - int value; - uint8_t data[5]; - data[0] = 0x7f; - tmc_motor_spi_write_and_read(channel, &data[0], 5); - value = ((uint32_t)data[1] << 24) | ((uint32_t)data[2] << 16) | (data[3] << 8) | data[4]; - return value; + testHardwareFlag = true; } void Hardware::periodicJob() { -#if 0 - /** - * @brief 风扇状态监控服务周期调度 - */ - for (size_t i = 0; i < ZARRAY_SIZE(m_fanStateMonitor); i++) { - m_fanStateMonitor[i].periodicJob(); - } -#endif - do_debug_light_state(); -#if ENABLE_CAN - // testCanSlaveTxAndRx(); -#endif + debug_light_periodicJob(); + can_periodicJob(); + temperature_periodicJob(); + fan_periodicJob(); + peltier_periodicJob(); + tmc_periodicJob(); } -void Hardware::do_debug_light_state() { +/******************************************************************************* + * 测试指示灯 * + *******************************************************************************/ +void Hardware::debug_light_init() { + STM32_HAL::gpioInit(DEBUG_LIGHT_PORT, DEBUG_LIGHT_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); +} + +void Hardware::debug_light_periodicJob() { static uint32_t lastprocess = 0; if (sys_haspassedms(lastprocess) > 300) { lastprocess = HAL_GetTick(); HAL_GPIO_TogglePin(DEBUG_LIGHT_PORT, DEBUG_LIGHT_PIN); } } -void Hardware::TMC4361APort_setResetPinState(uint16_t channel, bool state) { tmc_nRESET_pin_set_state(channel, state); } -void Hardware::TMC4361APort_setFREEZEPinState(uint16_t channel, bool state) { tmc_nFREEZE_pin_set_state(channel, state); } -void Hardware::TMC4361APort_setENNPinState(uint16_t channel, bool state) { tmc_ENN_pin_set_state(channel, state); } -bool Hardware::TMC4361APort_getTargetReachedPinState(uint16_t channel) { return false; } -void Hardware::TMC4361APort_sleepus(int32_t us) { sleepus(us); } -void Hardware::TMC4361APort_readWriteArray(uint8_t *data, size_t length) { tmc_motor_spi_write_and_read(0, data, length); } -void Hardware::TMC4361APort_setSubICENNPinState(uint16_t channel, bool state) { tmc_subic_ENN_pin_set_state(channel, state); } -void Hardware::STM32_HAL_onGPIO_EXTI_Callback(uint16_t gpioNum) { +/******************************************************************************* + * CAN * + *******************************************************************************/ +void Hardware::can_init() { + m_can.m_canOnRxDataFlag = false; + + IflytopCanSlave::iflytop_can_slave_config_t *config = m_can.canSlaveService.createDefaultConfig(DEVICE_ID); + m_can.canSlaveService.initialize(this, config); + m_can.canSlaveService.activateRxIT(); + m_can.canSlaveService.registerListener(this); +} +void Hardware::can_periodicJob() { + if (testHardwareFlag) { + static uint32_t lastcall; + static uint8_t tx[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + if (hasPassedMS(lastcall) > 1000) { + lastcall = getTicket(); + // canSlaveService.translate(0x01, tx, 8, 2); + m_can.canSlaveService.sendReport(1, 2, 3, 100); + if (m_can.canSlaveService.getLastTransmitStatus() == HAL_OK) { + ZLOGI(TAG, "send ok"); + } else { + ZLOGI(TAG, "send fail"); + } + } + } /** - * @brief 赋予盘零位光电触发 + * @brief 接收CAN消息 */ - if (gpioNum == TMC_HOME_REF_GPIO_PIN) { - if (STM32_HAL_GPIO_IS_THIS_PIN_TRIGGER_IRQ(TMC_HOME_REF_GPIO)) { + if (m_can.m_canOnRxDataFlag) { + m_can.m_canOnRxDataFlag = false; + static CAN_RxHeaderTypeDef packetHeader; + static uint8_t packetData[8]; + static IflytopCanSlave::packet_t packet; + while (m_can.canSlaveService.getRxPacket(&packet)) { + if (testHardwareFlag) { + ZLOGI(TAG, "rx packet:"); + ZLOGI(TAG, "\ttype:%01x, targetId:%01x, sourceId:%02x, seq:%02x, regAdd:%02x, regValue:%04x", // + packet.type, packet.targetId, packet.sourceId, packet.seq, packet.regAdd, packet.regValue); + } for (size_t i = 0; i < m_listenerNum; i++) { - m_listener[i]->Hardware_onHomeRefSwitchISR(); + m_listener[i]->Hardware_OnCanRxData(&packet); } } + m_can.canSlaveService.activateRxIT(); } } - -void Hardware::debug_light_init() { - STM32_HAL::gpioInit(DEBUG_LIGHT_PORT, DEBUG_LIGHT_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); +/******************************************************************************* + * 温度 * + *******************************************************************************/ +void Hardware::temperature_init() { + m_temperature.tmp117[0].initializate(&hi2c1, TMP117::ID0); + m_temperature.tmp117[1].initializate(&hi2c1, TMP117::ID1); + m_temperature.tmp117[2].initializate(&hi2c1, TMP117::ID2); + m_temperature.tmp117[3].initializate(&hi2c1, TMP117::ID3); } - -void Hardware::fanInit(int freq) { +TMP117 *Hardware::temperature_get_tmp117(int off) { + if (off < 0 || off > 3) { + ZASSERT(0); + return NULL; + } + return &m_temperature.tmp117[off]; +} +void Hardware::temperature_periodicJob() { + if (testHardwareFlag) { + /** + * @brief 周期打印温度 + */ + static uint32_t lastcall; + if (hasPassedMS(lastcall) > 1000) { + lastcall = getTicket(); + for (size_t i = 0; i < 4; i++) { + float temp = m_temperature.tmp117[i].getTemperature(); + if (m_temperature.tmp117[i].getLastCallStatus() == HAL_OK) { + ZLOGI(TAG, "tmp117_%d:%f", i, temp); + } else { + ZLOGI(TAG, "tmp117_%d:read fail", i); + } + } + } + } +} +/******************************************************************************* + * 风扇 * + *******************************************************************************/ +void Hardware::fan_init(int freq) { STM32_HAL::setPWMFreq(&htim2, freq); // fan0->fan3 STM32_HAL::setPWMFreq(&htim4, freq); // fan4 STM32_HAL::setPWMFreq(&htim8, freq); // fan5 @@ -170,6 +146,23 @@ void Hardware::fanInit(int freq) { STM32_HAL::gpioInit(GPIOC, GPIO_PIN_2, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); // fan5 STM32_HAL::gpioInit(GPIOC, GPIO_PIN_3, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); + + /** + * @brief 风扇反馈初始化 + * + * FAN0_FB_INT PC1 + * FAN1_FB_INT PC4 + * FAN2_FB_INT PC5 + * FAN3_FB_INT PC6 + * FAN4_FB_INT PC7 + * FAN5_FB_INT PC10 + */ + m_fan.fanStateMonitor[0].initialize(this, GPIOC, GPIO_PIN_1, fanGetPowerState(0)); + m_fan.fanStateMonitor[1].initialize(this, GPIOC, GPIO_PIN_4, fanGetPowerState(1)); + m_fan.fanStateMonitor[2].initialize(this, GPIOC, GPIO_PIN_5, fanGetPowerState(2)); + m_fan.fanStateMonitor[3].initialize(this, GPIOC, GPIO_PIN_6, fanGetPowerState(3)); + m_fan.fanStateMonitor[4].initialize(this, GPIOC, GPIO_PIN_7, fanGetPowerState(4)); + m_fan.fanStateMonitor[5].initialize(this, GPIOC, GPIO_PIN_10, fanGetPowerState(5)); } void Hardware::fanSetDutyCycle(int fanIndex, uint16_t dutyCycle) { @@ -181,10 +174,10 @@ void Hardware::fanSetDutyCycle(int fanIndex, uint16_t dutyCycle) { if (fanIndex <= 3) { STM32_HAL::setPWMDuty(&htim2, TIM_CHANNEL_2, dutyCycle); - m_fanState[0] = dutyCycle > 0; - m_fanState[1] = dutyCycle > 0; - m_fanState[2] = dutyCycle > 0; - m_fanState[3] = dutyCycle > 0; + m_fan.m_fanState[0] = dutyCycle > 0; + m_fan.m_fanState[1] = dutyCycle > 0; + m_fan.m_fanState[2] = dutyCycle > 0; + m_fan.m_fanState[3] = dutyCycle > 0; if (dutyCycle > 0) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); @@ -194,7 +187,7 @@ void Hardware::fanSetDutyCycle(int fanIndex, uint16_t dutyCycle) { } else if (fanIndex == 4) { STM32_HAL::setPWMDuty(&htim4, TIM_CHANNEL_3, dutyCycle); - m_fanState[4] = dutyCycle > 0; + m_fan.m_fanState[4] = dutyCycle > 0; if (dutyCycle > 0) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); @@ -203,7 +196,7 @@ void Hardware::fanSetDutyCycle(int fanIndex, uint16_t dutyCycle) { } } else if (fanIndex == 5) { STM32_HAL::setPWMDuty(&htim8, TIM_CHANNEL_3, dutyCycle); - m_fanState[5] = dutyCycle > 0; + m_fan.m_fanState[5] = dutyCycle > 0; if (dutyCycle > 0) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET); @@ -218,14 +211,53 @@ bool *Hardware::fanGetPowerState(int fanIndex) { ZLOGE(TAG, "fanIndex is out of range!"); } } - return &m_fanState[fanIndex]; + return &m_fan.m_fanState[fanIndex]; } void Hardware::fanSetState0to3(uint16_t dutyCycle) { fanSetDutyCycle(0, dutyCycle); } void Hardware::fanSetState4(uint16_t dutyCycle) { fanSetDutyCycle(4, dutyCycle); } void Hardware::fanSetState5(uint16_t dutyCycle) { fanSetDutyCycle(5, dutyCycle); } +void Hardware::fan_periodicJob() { + /** + * @brief 风扇状态监控服务周期调度 + */ + for (size_t i = 0; i < ZARRAY_SIZE(m_fan.fanStateMonitor); i++) { + m_fan.fanStateMonitor[i].periodicJob(); + } + + /** + * @brief 风扇测试 + */ + if (testHardwareFlag) { + static uint32_t lastcall; + static int duty = 0; + if (hasPassedMS(lastcall) > 1000) { + lastcall = getTicket(); + duty += 10; + if (duty > 100) duty = 0; + fanSetState0to3(duty); + fanSetState4(duty); + fanSetState5(duty); + /** + * @brief DUYT大于零 FANPowerState为1 + */ + ZLOGI(TAG, "Duty:%d,FANState:%d,%d,%d,%d,%d,%d", duty, *fanGetPowerState(0), // + *fanGetPowerState(1), // + *fanGetPowerState(2), // + *fanGetPowerState(3), // + *fanGetPowerState(4), // + *fanGetPowerState(5)); // + ZLOGI(TAG, "FANCount:%d,%d,%d,%d,%d,%d", m_fan.fanStateMonitor[0].getCount(), // + m_fan.fanStateMonitor[1].getCount(), // + m_fan.fanStateMonitor[2].getCount(), // + m_fan.fanStateMonitor[3].getCount(), // + m_fan.fanStateMonitor[4].getCount(), // + m_fan.fanStateMonitor[5].getCount()); + } + } +} /******************************************************************************* - * 帕尔贴驱动电路 * + * 帕尔贴 * *******************************************************************************/ void Hardware::peltier_cold_ctr_pwm(int pwm) { __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm); @@ -278,6 +310,20 @@ void Hardware::peltier_set_pwm(int pwm) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/ } } +void Hardware::peltier_periodicJob() { + if (testHardwareFlag) { + static uint32_t lastcall; + static int duty = 0; + if (hasPassedMS(lastcall) > 1000) { + lastcall = getTicket(); + duty += 10; + if (duty > 100) duty = 0; + peltier_set_pwm(duty); + ZLOGI(TAG, "paltier set pwm:%d", duty); + } + } +} + /******************************************************************************* * tmc芯片驱动相关 * *******************************************************************************/ @@ -288,6 +334,48 @@ void Hardware::tmc_init() { GPIOE, GPIO_PIN_12, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_SET); STM32_HAL::gpioInit( // GPIOE, GPIO_PIN_11, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_SET); + + /** + * @brief TMC使用的外部时钟在stm32cubemx中已经进行配置,输出时钟为16MHZ + * 配置可以参考https://iflytop1.feishu.cn/wiki/wikcnog3hFm6dGFLMRksnhLb7Aw + */ + + // 4361初始化 + TMC4361A::TMC4361AConfig_t *tmc4361aconfig = TMC4361A::createDeafultTMC4361AConfig(this); + tmc4361aconfig->encoder_config.diff_enc_in_disable = false; + tmc4361aconfig->encoder_config.invert_enc_dir = true; // 如果编码器方向和期望方向相反,设置为true + tmc4361aconfig->encoder_config.enc_in_res = 4000; + tmc4361aconfig->close_loop_config.enable_closed_loop = false; +#if TEST_TMC_ENCODER_DIRECTION + // 测试编码器方式时关闭闭环控制 + tmc4361aconfig->close_loop_config.enable_closed_loop = false; +#endif + + m_tmc.tmc4361motor1.initialize(MOTOR_1_TMC4361A_CHANNEL, TMC4361A::IC_TMC2160, tmc4361aconfig); + m_tmc.tmc4361motor1.setMaximumAcceleration(300000); + m_tmc.tmc4361motor1.setMaximumDeceleration(300000); + + HAL_Delay(100); + // 使能电机 + m_tmc.tmc4361motor1.enableIC(true); + // 通过读取Version寄存器来判断芯片是否正常 + int32_t ic4361Version = m_tmc.tmc4361motor1.readICVersion(); + int32_t ic2160Version = m_tmc.tmc4361motor1.read2160ICVersion(); + ZLOGI(TAG, "TMC4361Version:%x TMC2160VERSION:%x", ic4361Version, ic2160Version); + if (ic4361Version != 2) { + ZLOGE(TAG, "TMC4361 or TMC2160 is not normal"); + } + m_tmc.tmc4361motor1.rotate(300000); + +#if TEST_TMC_ENCODER_DIRECTION + while (true) { + HAL_Delay(100); + ZLOGI(TAG, "TMC4361A: XACTUAL:%d ENC_POS:%d DIFF:%d", // + m_tmc.tmc4361motor1.getXACTUAL(), // + m_tmc.tmc4361motor1.getENC_POS(), // + m_tmc.tmc4361motor1.getENC_POS_DEV()); + } +#endif } void Hardware::tmc_motor_spi_select(int channel, bool state) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, state ? GPIO_PIN_SET : GPIO_PIN_RESET); } @@ -299,14 +387,6 @@ void Hardware::tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t l tmc_motor_spi_select(channel, true); } } -void Hardware::tmc_extern_clk_enable() { -#if 1 - /** - * @brief TMC使用的外部时钟在stm32cubemx中已经进行配置,输出时钟为16MHZ - * 配置可以参考https://iflytop1.feishu.cn/wiki/wikcnog3hFm6dGFLMRksnhLb7Aw - */ -#endif -} void Hardware::tmc_nFREEZE_pin_set_state(uint8_t channel, bool state) { if (channel == MOTOR_1_TMC4361A_CHANNEL) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, state ? GPIO_PIN_SET : GPIO_PIN_RESET); @@ -319,66 +399,40 @@ void Hardware::tmc_subic_ENN_pin_set_state(uint8_t channel, bool state) { } } void Hardware::tmc_nRESET_pin_set_state(uint8_t channel, bool state) {} -void Hardware::home_ref_switch_init() { // +void Hardware::tmc_home_ref_switch_init() { // STM32_HAL::gpioInitAsEXIT(TMC_HOME_REF_GPIO_PORT, TMC_HOME_REF_GPIO_PIN, GPIO_NOPULL, TMC_HOME_REF_GPIO_IRQ_MODE); } -bool Hardware::home_ref_switch_get_state() { return (HAL_GPIO_ReadPin(TMC_HOME_REF_GPIO_PORT, TMC_HOME_REF_GPIO_PIN) == TMC_HOME_REF_GPIO_USEFUL_STATE); } -/******************************************************************************* - * 硬件测试 * - *******************************************************************************/ -void Hardware::testTmp117() { - static uint32_t lastcall; - if (hasPassedMS(lastcall) > 1000) { - lastcall = getTicket(); - for (size_t i = 0; i < 4; i++) { - float temp = tmp117[i].getTemperature(); - if (tmp117[i].getLastCallStatus() == HAL_OK) { - ZLOGI(TAG, "tmp117_%d:%f", i, temp); - } else { - ZLOGI(TAG, "tmp117_%d:read fail", i); - } - } - } +bool Hardware::tmc_home_ref_switch_get_state() { return (HAL_GPIO_ReadPin(TMC_HOME_REF_GPIO_PORT, TMC_HOME_REF_GPIO_PIN) == TMC_HOME_REF_GPIO_USEFUL_STATE); } +int32_t Hardware::tmc_tmc4361_get_version(uint8_t channel) { + int value; + uint8_t data[5]; + data[0] = 0x7f; + tmc_motor_spi_write_and_read(channel, &data[0], 5); + value = ((uint32_t)data[1] << 24) | ((uint32_t)data[2] << 16) | (data[3] << 8) | data[4]; + return value; } +void Hardware::tmc_periodicJob() { m_tmc.tmc4361motor1.periodicJob(getTicket()); } -/** - * @brief 测试CAN的发送和接收 - */ -void Hardware::testCanSlaveTxAndRx() { - { - static uint32_t lastcall; - static uint8_t tx[8] = {1, 2, 3, 4, 5, 6, 7, 8}; - if (hasPassedMS(lastcall) > 1000) { - lastcall = getTicket(); - // canSlaveService.translate(0x01, tx, 8, 2); - canSlaveService.sendReport(1, 2, 3, 100); - if (canSlaveService.getLastTransmitStatus() == HAL_OK) { - ZLOGI(TAG, "send ok"); - } else { - ZLOGI(TAG, "send fail"); - } - } - } +/******************************************************************************* + * TMC4361APort * + *******************************************************************************/ +void Hardware::TMC4361APort_setResetPinState(uint16_t channel, bool state) { tmc_nRESET_pin_set_state(channel, state); } +void Hardware::TMC4361APort_setFREEZEPinState(uint16_t channel, bool state) { tmc_nFREEZE_pin_set_state(channel, state); } +void Hardware::TMC4361APort_setENNPinState(uint16_t channel, bool state) { tmc_ENN_pin_set_state(channel, state); } +bool Hardware::TMC4361APort_getTargetReachedPinState(uint16_t channel) { return false; } +void Hardware::TMC4361APort_sleepus(int32_t us) { sleepus(us); } +void Hardware::TMC4361APort_readWriteArray(uint8_t *data, size_t length) { tmc_motor_spi_write_and_read(0, data, length); } +void Hardware::TMC4361APort_setSubICENNPinState(uint16_t channel, bool state) { tmc_subic_ENN_pin_set_state(channel, state); } +void Hardware::STM32_HAL_onGPIO_EXTI_Callback(uint16_t gpioNum) { /** - * @brief 接收CAN消息 + * @brief 赋予盘零位光电触发 */ - if (m_canOnRxDataFlag) { - m_canOnRxDataFlag = false; - static CAN_RxHeaderTypeDef packetHeader; - static uint8_t packetData[8]; - // while (canSlaveService.getRxMessage(&packetHeader, packetData)) { - // ZLOGI(TAG, "rx packet:"); - // ZLOGI(TAG, "\tid:%x len:%d", packetHeader.StdId, packetHeader.DLC); - // ZLOGI_HEX(TAG, packetData, packetHeader.DLC); - // } - - static IflytopCanSlave::packet_t packet; - while (canSlaveService.getRxPacket(&packet)) { - ZLOGI(TAG, "rx packet:"); - ZLOGI(TAG, "\ttype:%01x, targetId:%01x, sourceId:%02x, seq:%02x, regAdd:%02x, regValue:%04x", // - packet.type, packet.targetId, packet.sourceId, packet.seq, packet.regAdd, packet.regValue); + if (gpioNum == TMC_HOME_REF_GPIO_PIN) { + if (STM32_HAL_GPIO_IS_THIS_PIN_TRIGGER_IRQ(TMC_HOME_REF_GPIO)) { + for (size_t i = 0; i < m_listenerNum; i++) { + m_listener[i]->Hardware_onHomeRefSwitchISR(); + } } - canSlaveService.activateRxIT(); } } diff --git a/src/board/hardware.hpp b/src/board/hardware.hpp index a97cee4..21c404f 100644 --- a/src/board/hardware.hpp +++ b/src/board/hardware.hpp @@ -18,6 +18,7 @@ namespace iflytop { class HardwareListener { public: virtual void Hardware_OnHardwareException(){}; + virtual void Hardware_OnCanRxData(IflytopCanSlave::packet_t *packet){}; virtual void Hardware_onHomeRefSwitchISR(){}; }; @@ -29,20 +30,30 @@ class Hardware : public IflytopCanSlaveListener, // /* data */ public: - /*motor*/ - TMC4361A tmc4361motor1; - /*temperature*/ - TMP117 tmp117[4]; - /*fan*/ - FanStateMonitor m_fanStateMonitor[6]; - /*can*/ - IflytopCanSlave canSlaveService; - bool m_canOnRxDataFlag; - /* data */ - bool m_fanState[6]; + struct tmc_res_t { + TMC4361A tmc4361motor1; + }; + struct can_res_t { + IflytopCanSlave canSlaveService; + bool m_canOnRxDataFlag; + }; + struct fan_res_t { + FanStateMonitor fanStateMonitor[6]; + bool m_fanState[6]; + }; + struct temperature_res_t { + TMP117 tmp117[4]; + }; + struct peltier_res_t {}; + + tmc_res_t m_tmc; + can_res_t m_can; + fan_res_t m_fan; + temperature_res_t m_temperature; HardwareListener *m_listener[MAX_HARDWARE_LISTENER_NUM]; int m_listenerNum; + bool testHardwareFlag; public: public: @@ -50,54 +61,70 @@ class Hardware : public IflytopCanSlaveListener, // * ListenerImpl * *******************************************************************************/ virtual void OnIflytopCanSlaveOnCanRxData() { - m_canOnRxDataFlag = true; - canSlaveService.deactivateRxIT(); + m_can.m_canOnRxDataFlag = true; + m_can.canSlaveService.deactivateRxIT(); } + /******************************************************************************* + * OVERRIDE STM32_HAL_LISTENER * + *******************************************************************************/ + virtual void STM32_HAL_onGPIO_EXTI_Callback(uint16_t GPIO_Pin); public: Hardware(/* args */){}; ~Hardware(){}; - void registerListener(HardwareListener *listener); - void hardwareinit(); void periodicJob(); - - int32_t port_tmc4361_get_version(uint8_t channel); - TMC4361A *getMotor1() { return &tmc4361motor1; } - + /******************************************************************************* + * 测试指示灯 * + *******************************************************************************/ void debug_light_init(); + void debug_light_periodicJob(); + /******************************************************************************* + * CAN * + *******************************************************************************/ + void can_init(); + void can_periodicJob(); + /******************************************************************************* + * 温度 * + *******************************************************************************/ + void temperature_init(); + TMP117 *temperature_get_tmp117(int off); + void temperature_periodicJob(); - void fanInit(int freq); + /******************************************************************************* + * 风扇 * + *******************************************************************************/ + void fan_init(int freq); void fanSetDutyCycle(int fanIndex, uint16_t dutyCycle); void fanSetState0to3(uint16_t dutyCycle); void fanSetState4(uint16_t dutyCycle); void fanSetState5(uint16_t dutyCycle); bool *fanGetPowerState(int fanIndex); - + void fan_periodicJob(); + /******************************************************************************* + * 帕尔贴 * + *******************************************************************************/ + void peltier_init(); void peltier_cold_ctr_pwm(int pwm); void peltier_hot_ctr_pwm(int pwm); - void peltier_init(); void peltier_set_pwm(int pwm); - - void tmc_init(); - void tmc_motor_spi_select(int channel, bool state); - void tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t length); - void tmc_extern_clk_enable(); - void tmc_nFREEZE_pin_set_state(uint8_t channel, bool state); - void tmc_ENN_pin_set_state(uint8_t channel, bool state); - void tmc_subic_ENN_pin_set_state(uint8_t channel, bool state); - void tmc_nRESET_pin_set_state(uint8_t channel, bool state); - - void home_ref_switch_init(); - bool home_ref_switch_get_state(); - + void peltier_periodicJob(); /******************************************************************************* - * 测试 * + * TMC * *******************************************************************************/ - void testTmp117(); - void testCanSlaveTxAndRx(); - void do_debug_light_state(); + void tmc_init(); + TMC4361A *tmc_get_motor1() { return &m_tmc.tmc4361motor1; } + void tmc_motor_spi_select(int channel, bool state); + void tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t length); + void tmc_nFREEZE_pin_set_state(uint8_t channel, bool state); + void tmc_ENN_pin_set_state(uint8_t channel, bool state); + void tmc_subic_ENN_pin_set_state(uint8_t channel, bool state); + void tmc_nRESET_pin_set_state(uint8_t channel, bool state); + int32_t tmc_tmc4361_get_version(uint8_t channel); + void tmc_home_ref_switch_init(); + bool tmc_home_ref_switch_get_state(); + void tmc_periodicJob(); public: /******************************************************************************* @@ -120,11 +147,6 @@ class Hardware : public IflytopCanSlaveListener, // virtual uint32_t getNowMS() { return HAL_GetTick(); }; virtual void sleepus(uint32_t us) { sys_delay_us(&DELAY_US_TIMER, us); } - /******************************************************************************* - * OVERRIDE STM32_HAL_LISTENER * - *******************************************************************************/ - virtual void STM32_HAL_onGPIO_EXTI_Callback(uint16_t GPIO_Pin); - public: }; diff --git a/src/lncubator_rotating_control_service.cpp b/src/lncubator_rotating_control_service.cpp index 79cc7e0..ecf06fc 100644 --- a/src/lncubator_rotating_control_service.cpp +++ b/src/lncubator_rotating_control_service.cpp @@ -24,7 +24,7 @@ LncubatorRotatingControlService::LncubatorRotatingControlService() { LncubatorRotatingControlService::~LncubatorRotatingControlService() {} void LncubatorRotatingControlService::initialize(Hardware* hardware) { // m_hardware = hardware; - m_motor = m_hardware->getMotor1(); + m_motor = m_hardware->tmc_get_motor1(); m_os = m_hardware; m_workfinished = false; m_dowhat = kidle; @@ -77,7 +77,7 @@ int32_t LncubatorRotatingControlService::normalizePosition(int32_t position) { } void LncubatorRotatingControlService::tmc_moveBy(int32_t relativePosition, uint32_t velocity) { m_motor->moveBy(relativePosition, velocity); } -bool LncubatorRotatingControlService::hardware_isHomeRefSwitchTriggered() { return m_hardware->home_ref_switch_get_state(); } +bool LncubatorRotatingControlService::hardware_isHomeRefSwitchTriggered() { return m_hardware->tmc_home_ref_switch_get_state(); } /******************************************************************************* * JobBasic * diff --git a/src/lncubator_temperature_control_service.cpp b/src/lncubator_temperature_control_service.cpp index 3b4e80b..06a8500 100644 --- a/src/lncubator_temperature_control_service.cpp +++ b/src/lncubator_temperature_control_service.cpp @@ -63,10 +63,10 @@ void LncubatorTemperatureControlService::setPidParameters(float kp, float ki, fl } float LncubatorTemperatureControlService::getTemperature() { float temperature[4]; - temperature[0] = m_hardware->tmp117[0].getTemperature(); - temperature[1] = m_hardware->tmp117[1].getTemperature(); - temperature[2] = m_hardware->tmp117[2].getTemperature(); - temperature[3] = m_hardware->tmp117[3].getTemperature(); + temperature[0] = m_hardware->temperature_get_tmp117(0)->getTemperature(); + temperature[1] = m_hardware->temperature_get_tmp117(1)->getTemperature(); + temperature[2] = m_hardware->temperature_get_tmp117(2)->getTemperature(); + temperature[3] = m_hardware->temperature_get_tmp117(3)->getTemperature(); float temperature_median = 0; // 取温度的中位数 diff --git a/src/umain.cpp b/src/umain.cpp index 747dee6..e3ec566 100644 --- a/src/umain.cpp +++ b/src/umain.cpp @@ -39,8 +39,8 @@ void Main::main(int argc, char const *argv[]) { m_hardware.hardwareinit(); while (true) { m_hardware.periodicJob(); - // m_hardware.testCanSlaveTxAndRx(canOnRxDataFlag); - // m_hardware.testTmp117(); + // m_hardware.can_test_periodicJob(canOnRxDataFlag); + // m_hardware.temperature_test_periodicJob(); } }