Browse Source

enable can module

master
zhaohe 2 years ago
parent
commit
5e43a9d241
  1. 3
      .vscode/settings.json
  2. 2
      app/Core/Src/can.c
  3. 113
      app/MDK-ARM/app.uvguix.h_zha
  4. 46
      app/MDK-ARM/app.uvoptx
  5. 10
      app/MDK-ARM/app.uvprojx
  6. 2
      dep/libiflytop_micro
  7. 13
      src/port.cpp
  8. 60
      src/port.hpp
  9. 8
      src/project_board.hpp
  10. 153
      src/umain.cpp

3
.vscode/settings.json

@ -60,6 +60,7 @@
"streambuf": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp",
"can.h": "c"
"can.h": "c",
"deque": "cpp"
}
}

2
app/Core/Src/can.c

@ -47,7 +47,7 @@ void MX_CAN1_Init(void)
hcan1.Init.AutoBusOff = ENABLE;
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = ENABLE;
hcan1.Init.ReceiveFifoLocked = ENABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{

113
app/MDK-ARM/app.uvguix.h_zha
File diff suppressed because it is too large
View File

46
app/MDK-ARM/app.uvoptx

@ -806,7 +806,7 @@
<Group>
<GroupName>dep/libiflytop_micro</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -822,6 +822,30 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>34</FileNumber>
<FileType>8</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\dep\libiflytop_micro\stm32\basic\stm32_hal_res_manager.cpp</PathWithFileName>
<FilenameWithoutPath>stm32_hal_res_manager.cpp</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>35</FileNumber>
<FileType>8</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\dep\libiflytop_micro\stm32\component\iflytop_can_client_v1\iflytop_can_client.cpp</PathWithFileName>
<FilenameWithoutPath>iflytop_can_client.cpp</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -832,7 +856,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>36</FileNumber>
<FileType>8</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -844,7 +868,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>37</FileNumber>
<FileType>8</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -864,7 +888,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -876,7 +900,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -888,7 +912,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -900,7 +924,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -912,7 +936,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>42</FileNumber>
<FileType>8</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -924,7 +948,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -936,7 +960,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -948,7 +972,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>45</FileNumber>
<FileType>8</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

10
app/MDK-ARM/app.uvprojx

@ -1027,6 +1027,16 @@
<FileType>1</FileType>
<FilePath>..\..\dep\libiflytop_micro\stm32\basic\basic.c</FilePath>
</File>
<File>
<FileName>stm32_hal_res_manager.cpp</FileName>
<FileType>8</FileType>
<FilePath>..\..\dep\libiflytop_micro\stm32\basic\stm32_hal_res_manager.cpp</FilePath>
</File>
<File>
<FileName>iflytop_can_client.cpp</FileName>
<FileType>8</FileType>
<FilePath>..\..\dep\libiflytop_micro\stm32\component\iflytop_can_client_v1\iflytop_can_client.cpp</FilePath>
</File>
</Files>
</Group>
<Group>

2
dep/libiflytop_micro

@ -1 +1 @@
Subproject commit bf17a8fb71483b29390173bc035f135b33b58c6a
Subproject commit 59c26e1dcba6743ee3ed302bb14a110526c50aaf

13
src/port.cpp

@ -2,11 +2,14 @@
#include <stdio.h>
#include "libiflytop_micro/stm32/basic/basic.h"
#include "libtrinamic/src/ic/tmc2160.hpp"
#include "libtrinamic\src\ic\tmc4361A.hpp"
#include "main.h"
#include "project_board.hpp"
#include "spi.h"
#include "tim.h"
#include "usart.h"
/**
* @brief printf
*
@ -15,13 +18,14 @@
* @return int
*/
extern "C" {
int fputc(int ch, FILE* stream) {
int fputc(int ch, FILE *stream) {
uint8_t c = ch;
HAL_UART_Transmit(&DEBUG_UART, &c, 1, 100);
return ch;
}
}
namespace iflytop {
void port_do_debug_light_state() {
static uint32_t lastprocess = 0;
if (sys_haspassedms(lastprocess) > 300) {
@ -30,11 +34,10 @@ void port_do_debug_light_state() {
}
}
void port_delay_us(uint32_t us) { sys_delay_us(&DELAY_US_TIMER, us); }
void port_spi_cs_select(bool select) { //
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, select ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
void port_tmc_motor_spi_write_and_read(int channel, uint8_t* data, size_t length) {
void port_tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t length) {
//
if (channel == MOTOR_1_TMC4361A_CHANNEL) {
port_spi_cs_select(false);
@ -43,7 +46,6 @@ void port_tmc_motor_spi_write_and_read(int channel, uint8_t* data, size_t length
port_spi_cs_select(true);
}
}
void port_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);
@ -55,7 +57,6 @@ void port_tmc_ENN_pin_set_state(uint8_t channel, bool state) {
}
}
void port_tmc_nRESET_pin_set_state(uint8_t channel, bool state) {}
void port_tmc_extern_clk_enable() {
#if 1
/**
@ -129,3 +130,5 @@ void port_peltier_set_pwm(int pwm) {
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/
}
}
} // namespace iflytop

60
src/port.hpp

@ -1,22 +1,64 @@
#include <stdint.h>
#include <stdio.h>
#include "libiflytop_micro\stm32\basic\iflytop_micro_os.hpp"
namespace iflytop {
void port_do_debug_light_state();
void port_delay_us(uint32_t us);
/*******************************************************************************
* tmc芯片驱动相关 *
* IflytopMicroOS对接 *
*******************************************************************************/
void port_tmc_motor_spi_write_and_read(int channel, uint8_t* data, size_t length);
void port_tmc_extern_clk_enable();
void port_tmc_nFREEZE_pin_set_state(uint8_t channel, bool state);
void port_tmc_ENN_pin_set_state(uint8_t channel, bool state);
void port_tmc_nRESET_pin_set_state(uint8_t channel, bool state);
int32_t port_tmc4361_get_version(uint8_t channel);
class IflytopMicroOSImpl : public IflytopMicroOS {
public:
virtual void sleepMS(int ms) { HAL_Delay(ms); };
virtual uint32_t hasPassedMS(uint32_t ticket) { return sys_haspassedms(ticket); };
virtual uint32_t getTicket() { return HAL_GetTick(); };
virtual uint32_t getNowMS() { return HAL_GetTick(); };
};
/*******************************************************************************
* *
*******************************************************************************/
void port_peltier_set_pwm(int pwm);
/*******************************************************************************
* tmc芯片驱动相关 *
*******************************************************************************/
void port_tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t length);
void port_tmc_extern_clk_enable();
void port_tmc_nFREEZE_pin_set_state(uint8_t channel, bool state);
void port_tmc_ENN_pin_set_state(uint8_t channel, bool state);
void port_tmc_nRESET_pin_set_state(uint8_t channel, bool state);
int32_t port_tmc4361_get_version(uint8_t channel);
/**
* @brief TMC4361和硬件的接口
*/
class TMC4361AImpl : public TMC4361A {
protected:
virtual void setResetPinState(bool state) { port_tmc_nRESET_pin_set_state(m_channel, state); };
virtual void setFREEZEPinState(bool state) { port_tmc_nFREEZE_pin_set_state(m_channel, state); };
virtual void setENNPinState(bool state) { port_tmc_ENN_pin_set_state(m_channel, state); };
virtual bool getTargetReachedPinState() { return false; };
virtual void sleepus(int32_t us) { port_delay_us(us); };
virtual void readWriteArray(uint8_t *data, size_t length) { //
port_tmc_motor_spi_write_and_read(m_channel, data, length);
};
};
/**
* @brief TMC2160和硬件的接口
*/
class TMC2160Impl : public TMC2160 {
TMC4361A *m_tmc4361;
public:
void initialize(uint8_t channel, TMC4361A *tmc4361) {
m_tmc4361 = tmc4361;
TMC2160::initialize(channel);
}
protected:
virtual void setENNPinState(bool state) { port_tmc_ENN_pin_set_state(m_channel, state); };
virtual void sleepus(int32_t us) { port_delay_us(us); };
virtual void readWriteArray(uint8_t *data, size_t length) { m_tmc4361->readWriteCover(data, length); };
};
} // namespace iflytop

8
src/project_board.hpp

@ -1,6 +1,8 @@
#pragma once
#define VERSION "v1.0"
// 设备ID
#define DEVICE_ID 0x02
// 调试串口
#define DEBUG_UART huart1
@ -9,10 +11,10 @@
#define DEBUG_LIGHT_PORT GPIOE
#define DEBUG_LIGHT_PIN GPIO_PIN_8
//微秒延迟定时器,注意该延时定时器需要按照以下文档进行配置
//http://192.168.1.3:3000/zwikipedia/iflytop_wikipedia/src/branch/master/doc/stm32cubemx_us_timer.md
// 微秒延迟定时器,注意该延时定时器需要按照以下文档进行配置
// http://192.168.1.3:3000/zwikipedia/iflytop_wikipedia/src/branch/master/doc/stm32cubemx_us_timer.md
#define DELAY_US_TIMER htim6
// 电机编号
#define MOTOR_1_TMC4361A_CHANNEL 1
#define MOTOR_1_TMC2160_CHANNEL 2
#define MOTOR_1_TMC2160_CHANNEL 2

153
src/umain.cpp

@ -6,102 +6,83 @@
#include "libtrinamic\src\ic\tmc4361A.hpp"
#include "port.hpp"
#include "project_board.hpp"
#define TAG "main"
//
// port_tmc_DRV_ENN_pin_set_state
#include "libiflytop_micro\common\zsignal.hpp"
#include "libiflytop_micro\stm32\component\iflytop_can_client_v1\iflytop_can_client.hpp"
#define TAG "main"
using namespace iflytop;
class TMC4361AImpl : public TMC4361A {
protected:
virtual void setResetPinState(bool state) { port_tmc_nRESET_pin_set_state(m_channel, state); };
virtual void setFREEZEPinState(bool state) { port_tmc_nFREEZE_pin_set_state(m_channel, state); };
virtual void setENNPinState(bool state) { port_tmc_ENN_pin_set_state(m_channel, state); };
virtual bool getTargetReachedPinState() { return false; };
virtual void sleepus(int32_t us) { port_delay_us(us); };
virtual void readWriteArray(uint8_t *data, size_t length) { //
port_tmc_motor_spi_write_and_read(m_channel, data, length);
};
};
class TMC2160Impl : public TMC2160 {
TMC4361A *m_tmc4361;
using namespace std;
class Main {
public:
void initialize(uint8_t channel, TMC4361A *tmc4361) {
m_tmc4361 = tmc4361;
TMC2160::initialize(channel);
TMC4361AImpl tmc4361motor1;
TMC2160Impl tmc2160motor1;
IflytopCanClient canClient;
IflytopMicroOSImpl os;
ZSLOT3(Main, onCanRxData, CAN_RxHeaderTypeDef *, uint8_t *, uint8_t);
void onCanRxData(CAN_RxHeaderTypeDef *rxMegHeader, uint8_t *data, uint8_t len) {
ZLOGI(TAG, "onCanRxData:");
ZLOGI_HEX(TAG, data, len);
}
protected:
virtual void setENNPinState(bool state) { port_tmc_ENN_pin_set_state(m_channel, state); };
virtual void sleepus(int32_t us) { port_delay_us(us); };
virtual void readWriteArray(uint8_t *data, size_t length) { m_tmc4361->readWriteCover(data, length); };
};
static TMC4361AImpl tmc4361motor1;
static TMC2160Impl tmc2160motor1;
void initmotor() {
port_tmc_extern_clk_enable();
// tmc4361motor1.init();
TMC4361AImpl::TMC4361AConfig_t *tmc4361aconfig = TMC4361AImpl::createDeafultTMC4361AConfig();
tmc4361aconfig->base_config.fs_per_rev = 200;
tmc4361aconfig->encoder_config.diff_enc_in_disable = false;
tmc4361aconfig->encoder_config.enc_in_res = 4000;
tmc4361aconfig->close_loop_config.enable_closed_loop = true;
tmc4361motor1.initialize(MOTOR_1_TMC4361A_CHANNEL, TMC4361A::IC_TMC2160, tmc4361aconfig);
tmc2160motor1.initialize(MOTOR_1_TMC2160_CHANNEL, &tmc4361motor1);
// 2160初始化
tmc2160motor1.setMaximumCurrent(3);
HAL_Delay(100);
tmc4361motor1.enableIC(true);
tmc2160motor1.enableIC(true);
/**
* @brief
* PPS = 1000000
* RPS = 1000000/200/256
* RPM = 1000000/200/256*60
*/
void motorInitialize() {
port_tmc_extern_clk_enable();
TMC4361AImpl::TMC4361AConfig_t *tmc4361aconfig = TMC4361AImpl::createDeafultTMC4361AConfig();
tmc4361aconfig->base_config.fs_per_rev = 200;
tmc4361aconfig->encoder_config.diff_enc_in_disable = false;
tmc4361aconfig->encoder_config.enc_in_res = 4000;
tmc4361aconfig->close_loop_config.enable_closed_loop = true;
tmc4361motor1.initialize(MOTOR_1_TMC4361A_CHANNEL, TMC4361A::IC_TMC2160, tmc4361aconfig);
tmc2160motor1.initialize(MOTOR_1_TMC2160_CHANNEL, &tmc4361motor1);
// 2160初始化
tmc2160motor1.setMaximumCurrent(3);
HAL_Delay(100);
tmc4361motor1.enableIC(true);
tmc2160motor1.enableIC(true);
/**
* @brief Version寄存器来判断芯片是否正常
*/
int32_t ic4361Version = tmc4361motor1.readICVersion();
int32_t ic2160Version = tmc2160motor1.readICVersion();
// 期望 4361Version:2 ic2160Version:30
ZLOGI(TAG, "TMC4361Version:%x TMC2160VERSION:%x", ic4361Version, ic2160Version);
tmc4361motor1.setMaximumAcceleration(300000);
tmc4361motor1.setMaximumDeceleration(300000);
}
/**
* @brief Version寄存器来判断芯片是否正常
*/
int32_t ic4361Version = tmc4361motor1.readICVersion();
int32_t ic2160Version = tmc2160motor1.readICVersion();
// 期望 4361Version:2 ic2160Version:30
ZLOGI(TAG, "TMC4361Version:%x TMC2160VERSION:%x", ic4361Version, ic2160Version);
void main(int argc, char const *argv[]) {
sys_loggger_enable(true);
ZLOGI(TAG, "VERSION:%s", VERSION);
// port_peltier_set_pwm(0);
IflytopCanClient::iflytop_can_client_config_t *config = canClient.createDefaultConfig(DEVICE_ID);
canClient.initialize(&os, config);
canClient.onCanRxData.connect(this, &Main::onCanRxData);
while (true) {
port_do_debug_light_state();
#if 0
static uint8_t tx[8] = {1, 2, 3, 4, 5, 6, 7, 8};
canClient.translate(0x01, tx, 8, 2);
if (canClient.getLastTransmitStatus() == HAL_OK) {
ZLOGI(TAG, "send ok");
} else {
ZLOGI(TAG, "send fail");
}
HAL_Delay(1000);
#endif
}
}
};
tmc4361motor1.setMaximumAcceleration(300000);
tmc4361motor1.setMaximumDeceleration(300000);
tmc4361motor1.moveTo(8000000, 1000000);
}
static Main mainObject;
extern "C" {
int umain(int argc, char const *argv[]) {
#if 1
sys_loggger_enable(true);
ZLOGI(TAG, "VERSION:%s", VERSION);
// port_peltier_set_pwm(30);
port_peltier_set_pwm(0);
while (true) {
port_do_debug_light_state();
// HAL_Delay(30);
// 打印电机当前位置
// int32_t encpos = tmc4361motor1.getENC_POS();
// int32_t xactual = tmc4361motor1.getXACTUAL();
// ZLOGI(TAG, "encpos:%d xactual:%d %d", encpos, xactual, tmc4361motor1.getENC_POS_DEV());
}
#endif
mainObject.main(argc, argv);
return 0;
}
}
Loading…
Cancel
Save