diff --git a/build/MDK/project.uvprojx b/build/MDK/project.uvprojx index b287fa9..52345fe 100644 --- a/build/MDK/project.uvprojx +++ b/build/MDK/project.uvprojx @@ -124,7 +124,7 @@ 0 - 1 + 0 1 1 1 @@ -359,7 +359,7 @@ 0 0 0 - 0 + 1 0 @@ -428,16 +428,36 @@ 1 ..\..\src\Driver\delay.c - - usart_debug.c - 1 - ..\..\src\Driver\usart_debug.c - stepper.c 1 ..\..\src\Driver\stepper.c + + e34.c + 1 + ..\..\src\Driver\e34.c + + + led.c + 1 + ..\..\src\Driver\led.c + + + ring_buffer.c + 1 + ..\..\src\Driver\ring_buffer.c + + + stepper_s.c + 1 + ..\..\src\Driver\stepper_s.c + + + usart.c + 1 + ..\..\src\Driver\usart.c + @@ -518,6 +538,11 @@ 1 ..\..\src\User\main.c + + shell.c + 1 + ..\..\src\User\shell.c + diff --git a/doc/测试数据.md b/doc/测试数据.md new file mode 100644 index 0000000..7a876c9 --- /dev/null +++ b/doc/测试数据.md @@ -0,0 +1,10 @@ +# 步进电机测试文档 + +## 电机规格 +42步进电机,步距角1.8° + +## 电机驱动频率: +arr 150~5000 +定时器配置:T(arr) =1/(84M/(prescale-1)) = 1us + +频率 = 1000000/arr = 200~6.666kHz \ No newline at end of file diff --git a/src/Driver/inc/stepper.h b/src/Driver/inc/stepper.h index 4407716..a674cd9 100644 --- a/src/Driver/inc/stepper.h +++ b/src/Driver/inc/stepper.h @@ -12,50 +12,66 @@ /* Includes ------------------------------------------------------------------*/ #include "bsp.h" /* Definition ----------------------------------------------------------------*/ +#define STEP_TIM TIM2 + #define STEP_EN GPIO_SetBits(GPIOB, GPIO_Pin_4) #define ANGEL_PER_STEP (1.8f) //步距角1.8° #define STEP_PER_CIRCLE (360 / ANGEL_PER_STEP) //电机转动一圈的步数 #define STEP_DIV (4) //电机驱动细分值 #define PUL_PER_CIRCLE (STEP_PER_CIRCLE * STEP_DIV) //电机转动一圈的脉冲数 -#define ACC_TIME 500 //整个加速(或减速)过程持续的时间,由用户指定,控制电机加减速的快慢,单位ms -#define ACC_TIME_DIV 100 //加速阶段离散的点的个数 -#define TIME_PER_DIV ACC_TIME/ACC_TIME_DIV //每个离散点持续的时间 +#define ACC_TIME 500 //整个加速(或减速)过程持续的时间,由用户指定,控制电机加减速的快慢,单位ms +#define ACC_TIME_DIV 100 //加速阶段离散的点的个数 +#define TIME_PER_DIV ACC_TIME / ACC_TIME_DIV //每个离散点持续的时间 + +#define STEP_MIN_FREQ 2000 //电机最小驱动频率 +#define STEP_MAX_FREQ 10000 //电机最大驱动频率 + +typedef enum { + acc, + avg, + dec +} STEP_STATE; //电机运行状态机 typedef struct { u8 id; //电机id u8 dir_pos; //电机正向方向(顺时针) u16 div; //电机驱动细分 - u8 running; //标记电机是否在运行 - - char en; - char dir; - long step; - int speed; - int target_speed; + + u8 running; //标记电机是否在运行 + u8 en; + u8 dir; + u32 step; +// u32 speed; +// u32 target_speed; u32 current_puase; //当前的脉冲数 u32 current_step; //当前的步数 u32 passed_puase; //走过的脉冲数 - u32 target_puase; //设置的目标步数 + u32 passed_step; //走过的步数 - u32 f_puase; //当前频率脉冲数(本算法S型加减速的过程是离散的,每个点(频率)运行一定步数) + u32 target_puase; //设置的目标步数 + + //u32 f_puase; //当前频率脉冲数(本算法S型加减速的过程是离散的,每个点(频率)运行一定步数) u16 f_index; //当前频率在表中所处位置() - u16 *table_step; //步数表 - u16 *table_time; //时间表(即当前频率电机一个脉冲所需时间,用于赋值定时器arr) + u32 avg_step; //匀速阶段步数 - u32 start_step; //启动阶段步数 - u16 start_f; //启动阶段的频率个数 - u32 stop_step; //停止阶段步数 + + u32 step_time; //在某一频率离散点持续的时间 + TIM_TypeDef *TIMx; //电机的驱动定时器 - + STEP_STATE state; } STEPPER; /* Exported ------------------------------------------------------------------*/ +extern STEPPER *pmotor; + extern STEPPER stepper; void stepper_tim_init(u16 arr, u16 psc); void stepper_pwm_init(u16 arr, u16 psc); void stepper_set_enable(u8 value); void stepper_set_dir(u8 value); +void Motor_PWM_Init(void); + #endif /*********************************END OF FILE**********************************/ diff --git a/src/Driver/stepper.c b/src/Driver/stepper.c index 73f281a..a603503 100644 --- a/src/Driver/stepper.c +++ b/src/Driver/stepper.c @@ -30,7 +30,7 @@ void stepper_gpio_init(void) GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PB3-PUL - // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能(如果是采用定时器PWM输出需要配制成AF模式) + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能(如果是采用定时器PWM输出需要配制成AF模式) GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10-DIR GPIO_Init(GPIOA, &GPIO_InitStructure); @@ -79,8 +79,7 @@ void stepper_pwm_init(u16 arr, u16 psc) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; stepper_gpio_init(); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //TIM2时钟使能 - + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //TIM2时钟使能 GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_TIM2); //GPIOB3复用为定时器2 TIM_TimeBaseStructure.TIM_Prescaler = psc - 1; //定时器分频 @@ -91,17 +90,16 @@ void stepper_pwm_init(u16 arr, u16 psc) //初始化TIM2 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2 - // TIM_OCInitStructure.TIM_Pulse = arr >> 1; + TIM_OCInitStructure.TIM_Pulse = (arr - 1) >> 1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 - // TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //?????? + // TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //高级定时器互补输出 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低 - TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1 + TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器 TIM_ARRPreloadConfig(TIM2, ENABLE); //ARPE使能 - // TIM_CCPreloadControl(TIM2, ENABLE); - // TIM_CtrlPWMOutputs(TIM4, ENABLE); - // TIM_Cmd(TIM2, DISABLE); //使能TIM2 + TIM_CCPreloadControl(TIM2, ENABLE); + TIM_CtrlPWMOutputs(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); //使能TIM2 } diff --git a/src/Driver/stepper_s.c b/src/Driver/stepper_s.c index f8e5f9e..37b762e 100644 --- a/src/Driver/stepper_s.c +++ b/src/Driver/stepper_s.c @@ -9,9 +9,16 @@ *******************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "stepper.h" +#include "shell.h" /* Definition ----------------------------------------------------------------*/ -STEPPER motor; +STEPPER motor = {.id = 1, .dir_pos = 1, .div = 4, .TIMx = STEP_TIM}; STEPPER *pmotor = &motor; +u16 table_time[ACC_TIME_DIV] = {4187, 4117, 4042, 3963, 3880, 3791, 3698, 3601, 3500, 3394, 3286, 3173, + 3058, 2941, 2822, 2702, 2581, 2461, 2341, 2222, 2104, 1990, 1878, 1769, 1663, 1562, 1465, 1372, 1284, 1200, + 1121, 1047, 977, 912, 851, 794, 742, 693, 648, 606, 568, 532, 500, 470, 443, 418, 395, 374, 355, 338, 322, 308, + 295, 283, 272, 262, 253, 245, 237, 231, 225, 219, 214, 210, 206, 202, 198, 195, 193, 190, 188, 186, 184, 182, 181, + 179, 178, 177, 176, 175, 174, 173, 173, 172, 172, 171, 171, 170, 170, 169, 169, 169, 169, 168, 168, 168, 168, 168, 167, 167}; + /* Functions -----------------------------------------------------------------*/ /******************************************************************************* * @brief 步进电机GPIO口初始化 @@ -21,16 +28,22 @@ STEPPER *pmotor = &motor; *******************************************************************************/ void Motor_GPIO_Init(void) { - // GPIO_InitTypeDef GPIO_InitStructure; - // RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; - // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - // GPIO_Init(GPIOA, &GPIO_InitStructure); - // GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4); + GPIO_InitTypeDef GPIO_InitStructure; + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE); //使能PORTA PORTB时钟 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PB4-EN + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 + GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PB3-PUL + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能(如果是采用定时器PWM输出需要配制成AF模式) + GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB3 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10-DIR + GPIO_Init(GPIOA, &GPIO_InitStructure); } -#if ADV_TIM_ENABLE +#if 0 //高级定时器 /******************************************************************************* * @brief 高级定时器驱动S型电机驱动 * @param None @@ -53,8 +66,8 @@ void Initial_PWM_Motor1(void) NVIC_InitStructure.NVIC_IRQChannelSubPriority = PWM1_SubPriority; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); - TIM_BaseInitStructure.TIM_Period = 1000; - TIM_BaseInitStructure.TIM_Prescaler = 5; + TIM_BaseInitStructure.TIM_Period = 1000-1; + TIM_BaseInitStructure.TIM_Prescaler = 84-1; TIM_BaseInitStructure.TIM_ClockDivision = 0; TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_BaseInitStructure.TIM_RepetitionCounter = 0; @@ -63,14 +76,14 @@ void Initial_PWM_Motor1(void) TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //信号输出到对应的输出引脚 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互补信号输出到对应的输出引脚 - TIM_OCInitStructure.TIM_Pulse = 50; //脉冲宽度 + TIM_OCInitStructure.TIM_Pulse = 500; //脉冲宽度 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //互补输出高电平有效 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互补输出高电平有效 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //输出空闲状态为1 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //互补输出空闲状态为0 - TIM_OC1Init(TIM1, &TIM_OCInitStructure); //OC1通道初始化 + TIM_OC2Init(TIM1, &TIM_OCInitStructure); //OC1通道初始化 - TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); + TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); //清中断,以免一启用中断后立即产生中断 @@ -95,6 +108,7 @@ void Motor_PWM_Init(void) TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_TIM2); //GPIOB3复用为定时器2 Motor_GPIO_Init(); TIM_DeInit(TIM2); //中断NVIC设置:允许中断,设置优先级 @@ -103,8 +117,8 @@ void Motor_PWM_Init(void) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断 NVIC_Init(&NVIC_InitStructure); - TIM_BaseInitStructure.TIM_Period = 1000; - TIM_BaseInitStructure.TIM_Prescaler = 5; + TIM_BaseInitStructure.TIM_Period = 160; + TIM_BaseInitStructure.TIM_Prescaler = 84 - 1; TIM_BaseInitStructure.TIM_ClockDivision = 0; TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_BaseInitStructure.TIM_RepetitionCounter = 0; @@ -113,21 +127,20 @@ void Motor_PWM_Init(void) TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //信号输出到对应的输出引脚 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互补信号输出到对应的输出引脚 - TIM_OCInitStructure.TIM_Pulse = 500; //脉冲宽度 + TIM_OCInitStructure.TIM_Pulse = 80; //脉冲宽度 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //互补输出高电平有效 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互补输出高电平有效 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //输出空闲状态为1 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //互补输出空闲状态为0 - TIM_OC1Init(TIM2, &TIM_OCInitStructure); //OC1通道初始化 + TIM_OC2Init(TIM2, &TIM_OCInitStructure); //OC1通道初始化 - TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); - TIM_ARRPreloadConfig(TIM2, ENABLE); - //清中断,以免一启用中断后立即产生中断 - TIM_ClearFlag(TIM2, TIM_FLAG_Update); - //使能TIM1中断源 + TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除溢出中断标志 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); - TIM_Cmd(TIM2, DISABLE); - //TIM_CtrlPWMOutputs(TIM2,ENABLE); //使能PWM输出 + TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器 + TIM_ARRPreloadConfig(TIM2, ENABLE); //ARPE使能 + TIM_CCPreloadControl(TIM2, ENABLE); + TIM_CtrlPWMOutputs(TIM2, ENABLE); + //TIM_Cmd(TIM2, ENABLE); //使能TIM2 } /******************************************************************************* @@ -152,72 +165,92 @@ void MOTOR_Init(void) /* 初始化电机参数 */ } +int test; /******************************************************************************* - * @brief 定时器2中断函数 + * @brief 定时器2中断函数 * @param None * @retval None * @Note None *******************************************************************************/ void TIM2_IRQHandler(void) { - TIM2->SR = (u16)~TIM_FLAG_Update; - if (1 == pmotor->en) + static int cnt = 0; + if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { - //位置计算 - if (pmotor->dir_pos == pmotor->dir) + TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); + if (1 == pmotor->en)//若电机使能 { - pmotor->current_puase++; - } - else - { - pmotor->current_puase--; - } - pmotor->current_step = pmotor->current_puase / pmotor->div; - - pmotor->passed_puase++; //总脉冲个数 - pmotor->f_puase++; //以该频率脉冲输出的脉冲个数 - - - - - //对称反转??? - // if (pmotor->RevetDot == pmotor->PulsesHaven) - // { - // pmotor->pulsecount = pmotor->Step_Table[pmotor->CurrentIndex]; - // } - if (pmotor->f_puase >= pmotor->table_step[pmotor->f_index]) //一个频率的步数走完 - { - if (pmotor->passed_puase <= pmotor->start_step) //如果是起步阶段 + //位置计算 + // if (pmotor->dir_pos == pmotor->dir) + // { + // pmotor->current_puase++; + // } + // else + // { + // pmotor->current_puase--; + // } + // pmotor->current_step = pmotor->current_puase / pmotor->div; + pmotor->step_time += table_time[pmotor->f_index]; + if (cnt++ > pmotor->div) // 步进电机每走一步 { - if (pmotor->f_index < pmotor->start_f - 1) + cnt = 0; + pmotor->passed_puase++; //总脉冲个数 + switch (pmotor->state) { - pmotor->f_index++; //进入下一个频率阶段 - pmotor->f_puase = 0; - if (pmotor->f_index >= pmotor->start_f) //启动阶段的步数没有走完,禁止进入下一阶段的频率 - pmotor->f_index = pmotor->start_f; + case acc: //加速阶段 + test = pmotor->step >> 1; + if (pmotor->passed_puase < test) + { + if (pmotor->step_time > TIME_PER_DIV * 1000) //一个频率的步数走完 + { + pmotor->f_index++; + //判断加速阶段是否结束 + if (pmotor->f_index > ACC_TIME_DIV - 2) + { + //规划平速运行阶段和减速运行阶段 + pmotor->avg_step = pmotor->step - pmotor->passed_puase * 2; + pmotor->state = avg; + } + else + { + TIM2->ARR = table_time[pmotor->f_index]; + test = table_time[pmotor->f_index] >> 1; + TIM_SetCompare2(TIM2, test); + pmotor->step_time = 0; + } + } + } + else //两段式 + { + pmotor->state = dec; //进入减速阶段 + } + break; + case avg: //匀速阶段 + pmotor->avg_step--; + if (pmotor->avg_step == 0) + pmotor->state = dec; + break; + case dec: //减速阶段 + if (pmotor->passed_puase < pmotor->step) + { + if (pmotor->step_time > TIME_PER_DIV * 1000) //一个频率的步数走完 + { + pmotor->f_index--; + TIM2->ARR = table_time[pmotor->f_index]; + test = table_time[pmotor->f_index] >> 1; + TIM_SetCompare2(TIM2, test); + pmotor->step_time = 0; + if (pmotor->f_index == 0) + pmotor->f_index = 1; //修正,防止减速阶段结束了,步数没走完 + } + } + else + { + TIM_Cmd(TIM2, DISABLE); //失能TIM2 + } + break; } } - if (pmotor->target_puase - pmotor->passed_puase <= pmotor->stop_step) //停止阶段 - { - // if (pmotor->f_index < pmotor->StartTableLength - 1) - // { - // pmotor->f_index = pmotor->StartTableLength + pmotor->StopTableLength - pmotor->CurrentIndex; - // } - // pmotor->f_index++; - // pmotor->f_puase = 0; - // if (pmotor->f_index >= pmotor->StartTableLength + pmotor->StopTableLength) - // pmotor->CurrentIndex = pmotor->StartTableLength + pmotor->StopTableLength - 1; - } - pmotor->TIMx->ARR = pmotor->table_time[pmotor->f_index]; //设置周期 - pmotor->TIMx->CCR1 = (pmotor->table_time[pmotor->f_index]) >> 1; //设置占空比 - } - //旋转预定脉冲数,停止,running=0,可以进行下一次旋转 - if (pmotor->passed_puase >= pmotor->target_puase && pmotor->passed_puase > 3) - { - pmotor->en = 0; - pmotor->running = 0; - pmotor->f_index = 0; - TIM_Cmd(pmotor->TIMx, DISABLE); //DISABLE } } } diff --git a/src/Driver/usart.c b/src/Driver/usart.c index 0505506..d6017d6 100644 --- a/src/Driver/usart.c +++ b/src/Driver/usart.c @@ -78,7 +78,7 @@ struct __FILE FILE __stdout; //定义_sys_exit()以避免使用半主机模式 -_sys_exit(int x) +void _sys_exit(int x) { x = x; } diff --git a/src/User/main.c b/src/User/main.c index e335f95..c2711ce 100644 --- a/src/User/main.c +++ b/src/User/main.c @@ -23,11 +23,20 @@ *******************************************************************************/ int main(void) { + int freq = 5000;//150可以直接启动,100需要一个启动过程 SysTick_init(); E34_Init(); - stepper_tim_init(50, 84); - // stepper_pwm_init(125, 84); + //stepper_tim_init(50, 84); + Motor_PWM_Init(); + //stepper_pwm_init(freq, 84); + //TIM_SetCompare2(TIM2,freq>>1); stepper_set_enable(0); + stepper_set_dir(0); + pmotor->en = 1; + pmotor->step_time = 0; + pmotor->state = acc; + pmotor->step = 5000; + TIM_Cmd(TIM2, ENABLE); //使能TIM2 while (1) { shell_loop(); diff --git a/tool/S_calc.py b/tool/S_calc.py new file mode 100644 index 0000000..cbb5d74 --- /dev/null +++ b/tool/S_calc.py @@ -0,0 +1,27 @@ +# encoding utf8 + +""" +计算步进电机S型加减速算法所需的S型曲线表 +""" + +import numpy as np +import matplotlib.pyplot as plt +import math + +np.set_printoptions(suppress=True) +# 电机运行最低频率 +step_min_freq = 200 +# 电机运行最高频率 +step_max_freq = 6000 + +x = np.arange(-5, 5, 0.1) +y = 1/(1+np.exp(-x)) + +time_table = (1000000/(step_min_freq+(step_max_freq-step_min_freq)*y)) +# plt.plot(x,y) +# plt.show() + +for data in time_table.tolist(): + print(int(data), end=',') + # print(data) +