Compare commits

8 Commits

Author SHA1 Message Date
bmy
742e3f75b1 Merge branch 'master' of https://git.brisky.space/btl143/BC2D-POS-firmware 2024-06-09 07:54:41 +08:00
bmy
930c49e3cf pref: 关闭 IIC 配置 2024-06-09 07:54:38 +08:00
bmy
11ad46b73d pref: 提高复位速度 2024-06-06 12:23:05 +08:00
bmy
cbb2803d81 feat: 增加复位动作 2024-05-20 12:20:21 +08:00
bmy
e38a025201 fix: 修复位置设置指令错误 2024-05-20 12:10:23 +08:00
bmy
5831580e55 feat: 增加上电回零 2024-05-12 09:26:34 +08:00
bmy
82e5f25e3a feat: 增加距离控制 2024-05-10 12:17:54 +08:00
bmy
1c83cbc70a [BC2D-POS] initial commit 2024-05-10 10:54:06 +08:00
13 changed files with 313 additions and 89 deletions

View File

@@ -0,0 +1,29 @@
{
"version": 5,
"beforeBuildTasks": [],
"afterBuildTasks": [],
"global": {
"$float-abi-type": "softfp",
"output-debug-info": "enable",
"misc-control": "--specs=nosys.specs --specs=nano.specs"
},
"c/cpp-compiler": {
"language-c": "c11",
"language-cpp": "c++11",
"optimization": "level-debug",
"warnings": "all-warnings",
"one-elf-section-per-function": true,
"one-elf-section-per-data": true,
"C_FLAGS": "",
"CXX_FLAGS": ""
},
"asm-compiler": {
"ASM_FLAGS": ""
},
"linker": {
"output-format": "elf",
"remove-unused-input-sections": true,
"LD_FLAGS": "",
"LIB_FLAGS": "-lm"
}
}

View File

@@ -0,0 +1,31 @@
##########################################################################################
# Append Compiler Options For Source Files
#
# syntax:
# <your matcher expr>: <your compiler command>
#
# examples:
# 'main.cpp': --cpp11 -Og ...
# 'src/*.c': -gnu -O2 ...
# 'src/lib/**/*.cpp': --cpp11 -Os ...
# '!Application/*.c': -O0
# '**/*.c': -O2 -gnu ...
#
# For more syntax, please refer to: https://www.npmjs.com/package/micromatch
#
##########################################################################################
version: '1.0'
#
# for source files with filesystem paths
#
files:
# './test/**/*.c': --c99
#
# for source files with virtual paths
#
virtualPathFiles:
# 'virtual_folder/**/*.c': --c99

View File

@@ -1,24 +0,0 @@
{
"version": 4,
"beforeBuildTasks": [],
"afterBuildTasks": [],
"global": {
"use-microLIB": true,
"output-debug-info": "enable"
},
"c/cpp-compiler": {
"optimization": "level-0",
"one-elf-section-per-function": true,
"c99-mode": true,
"C_FLAGS": "--diag_suppress=1 --diag_suppress=1295",
"CXX_FLAGS": "--diag_suppress=1 --diag_suppress=1295",
"warnings": "all-warnings"
},
"asm-compiler": {},
"linker": {
"output-format": "elf",
"xo-base": "",
"ro-base": "0x08000000",
"rw-base": "0x20000000"
}
}

View File

@@ -1,5 +1,5 @@
{
"name": "BC2D",
"name": "BC2D-POS",
"type": "ARM",
"dependenceList": [],
"srcDirs": [
@@ -89,7 +89,7 @@
"uid": "9d909db3024271625a98879e53e2d396"
},
"targets": {
"BC2D": {
"BC2D-POS": {
"excludeList": [],
"toolchain": "GCC",
"compileConfig": {
@@ -131,7 +131,6 @@
"libraries/cmsis/cm4/device_support",
"project/inc",
".cmsis/include",
"project/MDK_V5/RTE/_BC2D",
".eide/deps",
"3rd-part/dwt_delay",
"3rd-part/PID-Library",

View File

@@ -1,3 +1,3 @@
{
"sonarlint.pathToCompileCommands": "${workspaceFolder}\\build\\BC2D\\compile_commands.json"
"sonarlint.pathToCompileCommands": "${workspaceFolder}\\build\\BC2D-POS\\compile_commands.json"
}

View File

@@ -54,6 +54,11 @@
<ModeSub name="Multi-Channels" value="Encoder_Mode"/>
<ModeSub name="Activated" value="TRUE"/>
</Mode>
<Parameters>
<ParametersSub name="EncoderMode" value="TMR_ENCODER_MODE_B"/>
<ParametersSub name="IC1Filter" value="7"/>
<ParametersSub name="IC2Filter" value="7"/>
</Parameters>
</TMR2>
<TMR3>
<Mode>
@@ -66,7 +71,7 @@
<ModeSub name="Activated" value="TRUE"/>
</Mode>
<Parameters>
<ParametersSub name="DividerValue" value="999"/>
<ParametersSub name="DividerValue" value="1999"/>
<ParametersSub name="Period" value="1999"/>
</Parameters>
</TMR4>
@@ -134,7 +139,7 @@
<PinSub pinname="PB6" signalname="GPIO_Input" signaltype="3"/>
</PINInfo>
<ProjectInfomation>
<ProjectName>BC2D</ProjectName>
<ProjectName>BC2D-POS</ProjectName>
<ProjectLocation>C:/Users/ForgotDoge/Desktop/BC2024/firmware</ProjectLocation>
<ToolchainIDE>MDK_V5</ToolchainIDE>
<KeepUserCode>true</KeepUserCode>

View File

@@ -31,7 +31,7 @@
"titleBar.activeForeground": "#FAFAFE"
},
"EIDE.OpenOCD.ExePath": "D:/Program Files (x86)/at32_OpenOCD_V2.0.2/bin/openocd.exe",
"cortex-debug.variableUseNaturalFormat": true
"cortex-debug.variableUseNaturalFormat": false
},
"extensions": {
}

View File

@@ -8,76 +8,151 @@
#define DRV_ENABLE() gpio_bits_set(GPIOB, GPIO_PINS_15)
#define DRV_DISABLE() gpio_bits_reset(GPIOB, GPIO_PINS_15)
#define MU (2.854f) // speed = \mu * speed_in_pulse
by_motor_param param_m1;
by_motor_param param_m2;
PID_TypeDef pid_m1;
PID_TypeDef pid_m2;
uint8_t motion_enable_flag;
uint8_t motion_busy_flag;
uint8_t motion_reset_flag;
int16_t time_via;
float position_abs;
void by_motion_set_pwm_m1(int32_t pwm_duty)
{
pwm_duty = clip_s32(pwm_duty, -449, 449); // 不可以拉满哦
pwm_duty = clip_s32(pwm_duty, -440, 440); // 不可以拉满哦
pwm_duty += 499;
// 互补 pwm 输出499 为中值
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, pwm_duty);
}
void by_motion_set_pwm_m2(int32_t pwm_duty)
{
pwm_duty = clip_s32(pwm_duty, -449, 449); // 不可以拉满哦
pwm_duty += 499;
// void by_motion_set_pwm_m2(int32_t pwm_duty)
// {
// pwm_duty = clip_s32(pwm_duty, -440, 440); // 不可以拉满哦
// pwm_duty += 499;
// 互补 pwm 输出499 为中值
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_2, pwm_duty);
}
// // 互补 pwm 输出499 为中值
// tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_2, pwm_duty);
// }
int16_t by_motion_get_speed_m1(void)
{
#define alpha (0.1f)
static float last_speed = 0.0f;
param_m1.real_speed = alpha * last_speed + (1.0f - alpha) * (float)(-1 * (int16_t)tmr_counter_value_get(TMR2));
last_speed = param_m1.real_speed;
param_m1.real_speed = alpha * last_speed + (1.0f - alpha) * (float)(+1 * (int16_t)tmr_counter_value_get(TMR2));
last_speed = param_m1.real_speed;
tmr_counter_value_set(TMR2, 0);
return (int16_t)param_m1.real_speed;
#undef alpha
}
int16_t by_motion_get_speed_m2(void)
{
#define alpha (0.1f)
static float last_speed = 0.0f;
param_m2.real_speed = alpha * last_speed + (1.0f - alpha) * (float)(-1 * (int16_t)tmr_counter_value_get(TMR3));
last_speed = param_m2.real_speed;
tmr_counter_value_set(TMR3, 0);
return (int16_t)param_m2.real_speed;
#undef alpha
}
// int16_t by_motion_get_speed_m2(void)
// {
// #define alpha (0.1f)
// static float last_speed = 0.0f;
// param_m2.real_speed = alpha * last_speed + (1.0f - alpha) * (float)(-1 * (int16_t)tmr_counter_value_get(TMR3));
// last_speed = param_m2.real_speed;
// tmr_counter_value_set(TMR3, 0);
// return (int16_t)param_m2.real_speed;
// #undef alpha
// }
void by_motion_set_speed_m1(int16_t speed)
{
param_m1.target_speed = speed;
}
void by_motion_set_speed_m2(int16_t speed)
// void by_motion_set_speed_m2(int16_t speed)
// {
// param_m2.target_speed = speed;
// }
void by_motion_set_distance(float distance, int16_t speed)
{
param_m2.target_speed = speed;
// TODO 验证距离是否超限
if (motion_busy_flag) {
return;
}
if (speed < 0) {
speed = -speed;
}
position_abs += distance;
if (distance < 0.0f) {
by_motion_set_speed_m1(-1 * speed);
distance = -distance;
} else {
by_motion_set_speed_m1(speed);
}
motion_busy_flag = 1;
time_via = (int16_t)(distance * 50.0f / ((float)speed * MU)); // 控制频率为 50Hz控制值单位为 s
// lwprintf("time_via = %d\r\n", time_via);
LOGD("position_abs = %f\r\n", position_abs);
}
void by_motion_set_distance2(float distance, int16_t speed)
{
// TODO 验证距离是否超限
if (motion_busy_flag) {
return;
}
if (speed < 0) {
speed = -speed;
}
if (distance < 0.0f) {
distance = -distance;
}
distance = distance - position_abs;
position_abs += distance;
if (5.0 >= position_abs) {
position_abs = 0;
by_motion_set_speed_m1(-10);
motion_busy_flag = 1;
motion_reset_flag = 1;
LOGD("RESET position_abs = %f\r\n", position_abs);
return;
}
if (distance < 0.0f) {
distance = -distance;
by_motion_set_speed_m1(-1 * speed);
} else {
by_motion_set_speed_m1(speed);
}
motion_busy_flag = 1;
time_via = (int16_t)(distance * 50.0f / ((float)speed * MU)); // 控制频率为 50Hz控制值单位为 s
LOGD("position_abs = %f\r\n", position_abs);
// lwprintf("time_via = %d\r\n", time_via);
}
void by_motion_init(void)
{
motion_enable_flag = 0;
motion_busy_flag = 0;
time_via = 0;
position_abs = 0.0f; // TODO 待添加复位操作
by_motion_set_pwm_m1(0);
by_motion_set_pwm_m2(0);
// by_motion_set_pwm_m2(0);
/* set default parameters */
param_m1.Kp = BY_MOTION_DEFAULT_KP_M1;
param_m1.Ki = BY_MOTION_DEFAULT_KI_M1;
param_m1.Kd = BY_MOTION_DEFAULT_KD_M1;
param_m2.Kp = BY_MOTION_DEFAULT_KP_M2;
param_m2.Ki = BY_MOTION_DEFAULT_KI_M2;
param_m2.Kd = BY_MOTION_DEFAULT_KD_M2;
// param_m2.Kp = BY_MOTION_DEFAULT_KP_M2;
// param_m2.Ki = BY_MOTION_DEFAULT_KI_M2;
// param_m2.Kd = BY_MOTION_DEFAULT_KD_M2;
/* load parameters form ee */
// TODO
@@ -87,47 +162,91 @@ void by_motion_init(void)
PID_SetSampleTime(&pid_m1, 10);
PID_SetOutputLimits(&pid_m1, -400, 400);
PID(&pid_m2, &param_m2.real_speed, &param_m2.out_pwm, &param_m2.target_speed, param_m2.Kp, param_m2.Ki, param_m2.Kd, _PID_P_ON_E, _PID_CD_DIRECT);
PID_SetMode(&pid_m2, _PID_MODE_AUTOMATIC);
PID_SetSampleTime(&pid_m2, 10);
PID_SetOutputLimits(&pid_m2, -400, 400);
// PID(&pid_m2, &param_m2.real_speed, &param_m2.out_pwm, &param_m2.target_speed, param_m2.Kp, param_m2.Ki, param_m2.Kd, _PID_P_ON_E, _PID_CD_DIRECT);
// PID_SetMode(&pid_m2, _PID_MODE_AUTOMATIC);
// PID_SetSampleTime(&pid_m2, 10);
// PID_SetOutputLimits(&pid_m2, -400, 400);
motion_enable_flag = 1;
DRV_ENABLE();
// 上电回零
by_motion_set_speed_m1(-10);
while (SET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_3)) {
// 等待复位
}
by_motion_set_speed_m1(0);
}
void by_motion_run(void)
{
if (motion_enable_flag) {
by_motion_get_speed_m1();
by_motion_get_speed_m2();
// by_motion_get_speed_m2();
PID_Compute(&pid_m1);
PID_Compute(&pid_m2);
// PID_Compute(&pid_m2);
by_motion_set_pwm_m1((int32_t)param_m1.out_pwm);
by_motion_set_pwm_m2((int32_t)param_m2.out_pwm);
// by_motion_set_pwm_m2((int32_t)param_m2.out_pwm);
}
}
void by_motion_can_handle(uint16_t stdd_id, const uint8_t *data, uint8_t len)
{
#define BC2D_MODEL1
if (0x01 == stdd_id) {
#if defined(BC2D_MODEL1)
int16_t speed_m1_temp = (int16_t)(data[0] | (data[1] << 8));
int16_t speed_m2_temp = (int16_t)(data[2] | (data[3] << 8));
by_motion_set_speed_m1(speed_m1_temp);
by_motion_set_speed_m2(speed_m2_temp);
#elif defined(BC2D_MODEL2)
int16_t speed_m1_temp = (int16_t)(data[4] | (data[5] << 8));
int16_t speed_m2_temp = (int16_t)(data[6] | (data[7] << 8));
by_motion_set_speed_m1(speed_m1_temp);
by_motion_set_speed_m2(speed_m2_temp);
#endif
if (0x08 == stdd_id) {
uint8_t mode = data[0];
int16_t speed = (int16_t)data[1];
// float distance = (float)(data[2] | (data[3] << 8) | (data[4] << 16) | (data[5] << 24));
float distance;
memcpy(&distance, &data[2], 4);
if (0 == mode) {
by_motion_set_distance2(distance, speed);
} else if (1 == mode) {
by_motion_set_distance(distance, speed);
}
}
// #define BC2D_MODEL1
// if (0x01 == stdd_id) {
// #if defined(BC2D_MODEL1)
// int16_t speed_m1_temp = (int16_t)(data[0] | (data[1] << 8));
// int16_t speed_m2_temp = (int16_t)(data[2] | (data[3] << 8));
// by_motion_set_speed_m1(speed_m1_temp);
// by_motion_set_speed_m2(speed_m2_temp);
// #elif defined(BC2D_MODEL2)
// int16_t speed_m1_temp = (int16_t)(data[4] | (data[5] << 8));
// int16_t speed_m2_temp = (int16_t)(data[6] | (data[7] << 8));
// by_motion_set_speed_m1(speed_m1_temp);
// by_motion_set_speed_m2(speed_m2_temp);
// #endif
// }
LOGD("m1:%f,%f,%f", param_m1.real_speed, param_m1.target_speed, param_m1.out_pwm);
LOGD("m2:%f,%f,%f", param_m2.real_speed, param_m2.target_speed, param_m2.out_pwm);
}
void by_motion_tmr_handle(void)
{
if (!motion_busy_flag) {
return;
}
if (motion_reset_flag) {
if (!gpio_input_data_bit_read(GPIOB, GPIO_PINS_3)) {
motion_reset_flag = 0;
motion_busy_flag = 0;
by_motion_set_speed_m1(0);
}
return;
}
if (time_via > 0) {
time_via--;
} else {
by_motion_set_speed_m1(0);
motion_busy_flag = 0;
}
}

View File

@@ -12,9 +12,9 @@ typedef struct by_motor_param {
float out_pwm;
} by_motor_param;
#define BY_MOTION_DEFAULT_KP_M1 (5.0f)
#define BY_MOTION_DEFAULT_KI_M1 (100.0f)
#define BY_MOTION_DEFAULT_KD_M1 (0.0f)
#define BY_MOTION_DEFAULT_KP_M1 (10.0f)
#define BY_MOTION_DEFAULT_KI_M1 (80.0f)
#define BY_MOTION_DEFAULT_KD_M1 (0.08f)
#define BY_MOTION_DEFAULT_KP_M2 (5.0f)
#define BY_MOTION_DEFAULT_KI_M2 (100.0f)
#define BY_MOTION_DEFAULT_KD_M2 (0.0f)
@@ -28,6 +28,7 @@ extern int16_t by_motion_get_speed_m2(void);
extern void by_motion_set_speed_m1(int16_t speed);
extern void by_motion_set_speed_m2(int16_t speed);
extern void by_motion_can_handle(uint16_t stdd_id, const uint8_t *data, uint8_t len);
extern void by_motion_tmr_handle(void);
extern by_motor_param param_m1;
extern by_motor_param param_m2;

View File

@@ -55,6 +55,65 @@ extern "C" {
/* add user code end exported macro */
/* add user code begin dma define */
/* user can only modify the dma define value */
//#define DMA1_CHANNEL1_BUFFER_SIZE 0
//#define DMA1_CHANNEL1_MEMORY_BASE_ADDR 0
//#define DMA1_CHANNEL1_PERIPHERAL_BASE_ADDR 0
//#define DMA1_CHANNEL2_BUFFER_SIZE 0
//#define DMA1_CHANNEL2_MEMORY_BASE_ADDR 0
//#define DMA1_CHANNEL2_PERIPHERAL_BASE_ADDR 0
//#define DMA1_CHANNEL3_BUFFER_SIZE 0
//#define DMA1_CHANNEL3_MEMORY_BASE_ADDR 0
//#define DMA1_CHANNEL3_PERIPHERAL_BASE_ADDR 0
//#define DMA1_CHANNEL4_BUFFER_SIZE 0
//#define DMA1_CHANNEL4_MEMORY_BASE_ADDR 0
//#define DMA1_CHANNEL4_PERIPHERAL_BASE_ADDR 0
//#define DMA1_CHANNEL5_BUFFER_SIZE 0
//#define DMA1_CHANNEL5_MEMORY_BASE_ADDR 0
//#define DMA1_CHANNEL5_PERIPHERAL_BASE_ADDR 0
//#define DMA1_CHANNEL6_BUFFER_SIZE 0
//#define DMA1_CHANNEL6_MEMORY_BASE_ADDR 0
//#define DMA1_CHANNEL6_PERIPHERAL_BASE_ADDR 0
//#define DMA1_CHANNEL7_BUFFER_SIZE 0
//#define DMA1_CHANNEL7_MEMORY_BASE_ADDR 0
//#define DMA1_CHANNEL7_PERIPHERAL_BASE_ADDR 0
//#define DMA2_CHANNEL1_BUFFER_SIZE 0
//#define DMA2_CHANNEL1_MEMORY_BASE_ADDR 0
//#define DMA2_CHANNEL1_PERIPHERAL_BASE_ADDR 0
//#define DMA2_CHANNEL2_BUFFER_SIZE 0
//#define DMA2_CHANNEL2_MEMORY_BASE_ADDR 0
//#define DMA2_CHANNEL2_PERIPHERAL_BASE_ADDR 0
//#define DMA2_CHANNEL3_BUFFER_SIZE 0
//#define DMA2_CHANNEL3_MEMORY_BASE_ADDR 0
//#define DMA2_CHANNEL3_PERIPHERAL_BASE_ADDR 0
//#define DMA2_CHANNEL4_BUFFER_SIZE 0
//#define DMA2_CHANNEL4_MEMORY_BASE_ADDR 0
//#define DMA2_CHANNEL4_PERIPHERAL_BASE_ADDR 0
//#define DMA2_CHANNEL5_BUFFER_SIZE 0
//#define DMA2_CHANNEL5_MEMORY_BASE_ADDR 0
//#define DMA2_CHANNEL5_PERIPHERAL_BASE_ADDR 0
//#define DMA2_CHANNEL6_BUFFER_SIZE 0
//#define DMA2_CHANNEL6_MEMORY_BASE_ADDR 0
//#define DMA2_CHANNEL6_PERIPHERAL_BASE_ADDR 0
//#define DMA2_CHANNEL7_BUFFER_SIZE 0
//#define DMA2_CHANNEL7_MEMORY_BASE_ADDR 0
//#define DMA2_CHANNEL7_PERIPHERAL_BASE_ADDR 0
/* add user code end dma define */
/* exported functions ------------------------------------------------------- */
/* system clock config. */
void wk_system_clock_config(void);

View File

@@ -237,6 +237,7 @@ void TMR4_GLOBAL_IRQHandler(void)
/* add user code begin TMR4_GLOBAL_IRQ 0 */
if (SET == tmr_interrupt_flag_get(TMR4, TMR_OVF_FLAG)) {
by_motion_run();
by_motion_tmr_handle();
tmr_flag_clear(TMR4, TMR_OVF_FLAG);
}
/* add user code end TMR4_GLOBAL_IRQ 0 */

View File

@@ -461,16 +461,16 @@ void wk_tmr2_init(void)
tmr_input_struct.input_channel_select = TMR_SELECT_CHANNEL_1;
tmr_input_struct.input_mapped_select = TMR_CC_CHANNEL_MAPPED_DIRECT;
tmr_input_struct.input_polarity_select = TMR_INPUT_RISING_EDGE;
tmr_input_struct.input_filter_value = 0;
tmr_input_struct.input_filter_value = 7;
tmr_input_channel_init(TMR2, &tmr_input_struct, TMR_CHANNEL_INPUT_DIV_1);
tmr_input_struct.input_channel_select = TMR_SELECT_CHANNEL_2;
tmr_input_struct.input_mapped_select = TMR_CC_CHANNEL_MAPPED_DIRECT;
tmr_input_struct.input_polarity_select = TMR_INPUT_RISING_EDGE;
tmr_input_struct.input_filter_value = 0;
tmr_input_struct.input_filter_value = 7;
tmr_input_channel_init(TMR2, &tmr_input_struct, TMR_CHANNEL_INPUT_DIV_1);
tmr_encoder_mode_config(TMR2, TMR_ENCODER_MODE_A, TMR_INPUT_RISING_EDGE, TMR_INPUT_RISING_EDGE);
tmr_encoder_mode_config(TMR2, TMR_ENCODER_MODE_B, TMR_INPUT_RISING_EDGE, TMR_INPUT_RISING_EDGE);
tmr_counter_enable(TMR2, TRUE);
@@ -564,7 +564,7 @@ void wk_tmr4_init(void)
/* add user code end tmr4_init 1 */
/* configure counter settings */
tmr_base_init(TMR4, 1999, 999);
tmr_base_init(TMR4, 1999, 1999);
tmr_cnt_dir_set(TMR4, TMR_COUNT_UP);
tmr_clock_source_div_set(TMR4, TMR_CLOCK_DIV1);
tmr_period_buffer_enable(TMR4, FALSE);

View File

@@ -68,10 +68,10 @@
/* add user code end 0 */
/**
* @brief main function.
* @param none
* @retval none
*/
* @brief main function.
* @param none
* @retval none
*/
int main(void)
{
/* add user code begin 1 */
@@ -124,8 +124,12 @@ int main(void)
LOGI("init done");
/* add user code end 2 */
while (1) {
while(1)
{
/* add user code begin 3 */
// lwprintf("pwm value: %f\r\n", param_m1.out_pwm);
// lwprintf("mot speed: %f\r\n", param_m1.real_speed);
// lwprintf("%f,%f,%f\r\n", param_m1.real_speed, param_m1.target_speed, param_m1.out_pwm);
/* add user code end 3 */
}
}