轻型步进,DcStep,水平垂直,初测版本

This commit is contained in:
REASEARCHER\18383 2025-08-20 15:57:03 +08:00
parent f38c744f13
commit a345b34dd0
5 changed files with 116 additions and 51 deletions

View File

@ -8,8 +8,8 @@
#ifdef PTZ_STEP_MOTOR #ifdef PTZ_STEP_MOTOR
#define DCSTEP_SPEED_LIMIT_HORI 3.3//19.8°以下不使用DCSTEP #define DCSTEP_SPEED_LIMIT_HORI 3.3//19.8°以下不使用DCSTEP
#define DCSTEP_SPEED_LIMIT_VERT 3.3//俯仰 #define DCSTEP_SPEED_LIMIT_VERT 3.3//俯仰
#define DCSTEP_HORI_EN 0 #define DCSTEP_HORI_EN 1
#define DCSTEP_VERT_EN 0 #define DCSTEP_VERT_EN 1
static BSP_OS_SEM ptz_ftm_mutex;//共享资源锁 static BSP_OS_SEM ptz_ftm_mutex;//共享资源锁
@ -81,8 +81,8 @@ static void ptz_hori_step_speed_task()
while(1) while(1)
{ {
// if ( GetHoriDcoStatus() )//DC0输出高电平 if ( GetHoriDcoStatus() )//DC0输出高电平
// { {
if(g_ptz.hori_start_stop_set == PTZ_HORI_START) if(g_ptz.hori_start_stop_set == PTZ_HORI_START)
{ {
g_ptz.hori_tmc2160.set_f = ptz_hori_step_v_to_f((g_ptz.hori_speed_set * PTZ_HORI_RATIO), g_ptz.hori_tmc2160.microstep_vlue);//g_ptz.hori_speed_set g_ptz.hori_tmc2160.set_f = ptz_hori_step_v_to_f((g_ptz.hori_speed_set * PTZ_HORI_RATIO), g_ptz.hori_tmc2160.microstep_vlue);//g_ptz.hori_speed_set
@ -152,7 +152,7 @@ static void ptz_hori_step_speed_task()
g_ptz.hori_speed_actual = 0; g_ptz.hori_speed_actual = 0;
g_ptz.hori_tmc2160.f = 0; g_ptz.hori_tmc2160.f = 0;
} }
// } }
// else // else
// { // {
// if(GetDcstepPulseFlag()) // if(GetDcstepPulseFlag())

View File

@ -11,12 +11,16 @@
#if DCSTEP_FUN_EN #if DCSTEP_FUN_EN
uint8_t g_dcStepVert = 1; uint8_t g_dcStepVert = 1;
uint8_t g_dcStepHori = 1;
uint8_t GetVertDcoStatus(void) uint8_t GetVertDcoStatus(void)
{ {
return g_dcStepVert; return g_dcStepVert;
} }
uint8_t GetHoriDcoStatus(void)
{
return g_dcStepVert;
}
#endif #endif
/// @brief 外部中断初始化 /// @brief 外部中断初始化

View File

@ -7,6 +7,7 @@
#if DCSTEP_FUN_EN #if DCSTEP_FUN_EN
uint8_t GetVertDcoStatus(void); uint8_t GetVertDcoStatus(void);
uint8_t GetHoriDcoStatus(void);
#endif #endif
#ifdef PTZ_LIGHT_GEAR_L6235D_AS5047D #ifdef PTZ_LIGHT_GEAR_L6235D_AS5047D

View File

@ -163,26 +163,26 @@ void tmc2160_init()
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
#if DCTEP_EN #if DCTEP_EN
/*水平DCSTEP功能引脚配置*/ /*水平DCSTEP功能引脚配置*/
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);//PE10,DCEN gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);//PE10,DCEN
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);//PE11,DCIN gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);//PE11,DCIN
gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_9);//PE9, DCO gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_9);//PE9, DCO
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8); gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8);
gpio_bit_set(GPIOE, GPIO_PIN_7);//使能水平驱动器DCSTEP gpio_bit_set(GPIOE, GPIO_PIN_7);//使能水平驱动器DCSTEP
gpio_bit_set(GPIOE, GPIO_PIN_8);//使能水平驱动器DCIN gpio_bit_set(GPIOE, GPIO_PIN_8);//使能水平驱动器DCIN
/*垂直DCSTEP功能引脚配置*/ /*垂直DCSTEP功能引脚配置*/
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_10);//PE10,DCEN gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_10);//PE10,DCEN
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_11);//PE11,DCIN gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_11);//PE11,DCIN
gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_12);//PE12, DCO gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_12);//PE12, DCO
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11); gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11);
gpio_bit_set(GPIOE, GPIO_PIN_10);//使能垂直驱动器DCSTEP gpio_bit_set(GPIOE, GPIO_PIN_10);//使能垂直驱动器DCSTEP
gpio_bit_set(GPIOE, GPIO_PIN_11);//使能垂直驱动器DCIN gpio_bit_set(GPIOE, GPIO_PIN_11);//使能垂直驱动器DCIN
/*垂直DCO触发外部中断*/ /*垂直DCO触发外部中断*/
nvic_irq_enable(EXTI10_15_IRQn, 2U, 2U); nvic_irq_enable(EXTI10_15_IRQn, 2U, 2U);
syscfg_exti_line_config(EXTI_SOURCE_GPIOE, EXTI_SOURCE_PIN12); syscfg_exti_line_config(EXTI_SOURCE_GPIOE, EXTI_SOURCE_PIN12);
exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_12); exti_interrupt_flag_clear(EXTI_12);
/*垂直DCO定时器更新中断配置*/ /*垂直DCO定时器更新中断配置*/
timer_parameter_struct timer_initpara;//定时器结构体 timer_parameter_struct timer_initpara;//定时器结构体
rcu_periph_clock_enable(RCU_TIMER7);//开启定时器时钟 rcu_periph_clock_enable(RCU_TIMER7);//开启定时器时钟
@ -206,6 +206,34 @@ void tmc2160_init()
/* TIMER7 enable */ /* TIMER7 enable */
// timer_enable(TIMER7);//使能定时器 // timer_enable(TIMER7);//使能定时器
/*水平DCO触发外部中断*/
nvic_irq_enable(EXTI5_9_IRQn, 2U, 3U);
syscfg_exti_line_config(EXTI_SOURCE_GPIOE, EXTI_SOURCE_PIN9);
exti_init(EXTI_9, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_9);
/*水平DCO定时器更新中断配置*/
rcu_periph_clock_enable(RCU_TIMER4);//开启定时器时钟
timer_struct_para_init(&timer_initpara);//将定时器结构体内参数配置成默认参数
timer_deinit(TIMER4); //复位定时器
/* TIMER1 configuration */
//200M/20/1000 = 10K
timer_initpara.prescaler = 20-1;//预分频
timer_initpara.alignedmode = TIMER_COUNTER_EDGE; //边缘对齐
timer_initpara.counterdirection = TIMER_COUNTER_UP; //向上计数方式
timer_initpara.period = 1000-1; //计数值
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0; //每次溢出都产生更新是件
timer_init(TIMER4,&timer_initpara);
timer_interrupt_enable(TIMER4,TIMER_INT_UP);//使能溢出中断
nvic_irq_enable(TIMER4_IRQn, 2u, 3u);//配置中断优先级
/* TIMER7 enable */
// timer_enable(TIMER4);//使能定时器
#endif #endif
/* //为了不让驱动器的两个电容同时上电,驱动器初始化分别进行 /* //为了不让驱动器的两个电容同时上电,驱动器初始化分别进行
@ -575,7 +603,7 @@ char tmc2160_write_register(char choice, unsigned char mode, unsigned char data)
buff[0] = TMC2160_CHOPCONF +0x80; buff[0] = TMC2160_CHOPCONF +0x80;
buff[1] = tmc2160_chopconf_data(data); buff[1] = tmc2160_chopconf_data(data);
#ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V #ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V
buff[2] = 0xec;//ed,,高4为被动快速衰减时间可降低中程共振 buff[2] = 0xed;//ed,,高4为被动快速衰减时间可降低中程共振
buff[3] = 0x43;//03 buff[3] = 0x43;//03
buff[4] = 0x38;//C3 buff[4] = 0x38;//C3
#endif #endif
@ -612,7 +640,7 @@ char tmc2160_write_register(char choice, unsigned char mode, unsigned char data)
buff[1] = 0x00; buff[1] = 0x00;
buff[2] = 0x00; buff[2] = 0x00;
buff[3] = 0x00; buff[3] = 0x00;
buff[4] = 0x11; buff[4] = 0x25;
if(choice == TMC2160_HORI) if(choice == TMC2160_HORI)
{ {
hori_regis.chop_conf = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]); hori_regis.chop_conf = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);

View File

@ -37,10 +37,13 @@ OF SUCH DAMAGE.
#include "bsp_os.h" #include "bsp_os.h"
#include "Usart.h" #include "Usart.h"
#include "device_interrupt.h" #include "device_interrupt.h"
#include "Timer.h" //#include "Timer.h"
//#include "speed_to_step.h"
//#include "ptz_struct.h"
#if DCSTEP_FUN_EN #if DCSTEP_FUN_EN
extern uint8_t g_dcStepVert; extern uint8_t g_dcStepVert;
extern uint8_t g_dcStepHori;
#endif #endif
extern BSP_OS_SEM sem_enet_isr_recv; extern BSP_OS_SEM sem_enet_isr_recv;
@ -239,22 +242,23 @@ void EXTI5_9_IRQHandler(void)
} }
if(RESET != exti_interrupt_flag_get(EXTI_9)) if(RESET != exti_interrupt_flag_get(EXTI_9))
{ {
// /*function start*/ /*function start*/
// if (g_dcStepHori) if ( !gpio_input_bit_get(GPIOE, GPIO_PIN_9) )
// { {
// exti_init(EXTI_9, EXTI_INTERRUPT, EXTI_TRIG_RISING);//上升沿中断 exti_init(EXTI_9, EXTI_INTERRUPT, EXTI_TRIG_RISING);//上升沿中断
// timer_enable(TIMER7);//使能定时器 timer_enable(TIMER12);//使能定时器
// timer_counter_value_config(TIMER7, 0u); timer_counter_value_config(TIMER12, 0u);
// g_dcStepHori = 0; // ptz_hori_timer_stop();
// } g_dcStepHori = 0;
// else }
// { else
// exti_init(EXTI_9, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断 {
// timer_disable(TIMER7);//失能定时器 exti_init(EXTI_9, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断
// timer_counter_value_config(TIMER7, 0u); timer_disable(TIMER12);//失能定时器
// g_dcStepHori = 1; timer_counter_value_config(TIMER12, 0u);
// } g_dcStepHori = 1;
// /*function end*/ }
/*function end*/
exti_interrupt_flag_clear(EXTI_9); exti_interrupt_flag_clear(EXTI_9);
} }
} }
@ -286,12 +290,12 @@ void EXTI10_15_IRQHandler(void)
if(RESET != exti_interrupt_flag_get(EXTI_12)) if(RESET != exti_interrupt_flag_get(EXTI_12))
{ {
/*function start*/ /*function start*/
if (g_dcStepVert) if ( !gpio_input_bit_get(GPIOE, GPIO_PIN_12) )
{ {
exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_RISING);//上升沿中断 exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_RISING);//上升沿中断
timer_enable(TIMER7);//使能定时器 timer_enable(TIMER7);//使能定时器
timer_counter_value_config(TIMER7, 0u); timer_counter_value_config(TIMER7, 0u);
ptz_vert_timer_stop(); // ptz_vert_timer_stop();
g_dcStepVert = 0; g_dcStepVert = 0;
} }
else else
@ -299,7 +303,6 @@ void EXTI10_15_IRQHandler(void)
exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断 exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断
timer_disable(TIMER7);//失能定时器 timer_disable(TIMER7);//失能定时器
timer_counter_value_config(TIMER7, 0u); timer_counter_value_config(TIMER7, 0u);
ptz_vert_timer_start(4000);
g_dcStepVert = 1; g_dcStepVert = 1;
} }
/*function end*/ /*function end*/
@ -366,7 +369,7 @@ void EXTI2_IRQHandler(void)
\param[in] none \param[in] none
\param[out] none \param[out] none
\retval none \retval none
\note LH @2025.08.12 \note LH @2025.08.12!
*/ */
void TIMER7_UP_TIMER12_IRQHandler(void) void TIMER7_UP_TIMER12_IRQHandler(void)
{ {
@ -383,9 +386,38 @@ void TIMER7_UP_TIMER12_IRQHandler(void)
count = 0; count = 0;
timer_disable(TIMER7);//失能定时器 timer_disable(TIMER7);//失能定时器
timer_counter_value_config(TIMER7, 0u); timer_counter_value_config(TIMER7, 0u);
gpio_bit_reset(GPIOD, GPIO_PIN_12); gpio_bit_reset(GPIOD, GPIO_PIN_12);
} }
} }
/* clear TIMER interrupt flag */ /* clear TIMER interrupt flag */
timer_interrupt_flag_clear(TIMER7,TIMER_INT_UP); timer_interrupt_flag_clear(TIMER7,TIMER_INT_UP);
}
/*!
\brief TIM4
\param[in] none
\param[out] none
\retval none
\note LH @2025.08.20!
*/
void TIMER4_IRQHandler(void)
{
static uint16_t count2 = 0;
if(SET == timer_interrupt_flag_get(TIMER4,TIMER_INT_UP))
{
count2 ++;
if ( count2 >= 10 )
{
gpio_bit_set(GPIOC, GPIO_PIN_6);
}
else if( count2 >= 12 )
{
count2 = 0;
timer_disable(TIMER4);//失能定时器
timer_counter_value_config(TIMER4, 0u);
gpio_bit_reset(GPIOC, GPIO_PIN_6);
}
}
/* clear TIMER interrupt flag */
timer_interrupt_flag_clear(TIMER4,TIMER_INT_UP);
} }