77#define LOG_TAG "stepper"
88#include <drv_log.h>
99#include <stdlib.h>
10+ #include <string.h>
1011
1112static rt_uint8_t forward_table [4 ] = {0x09 ,0x0A ,0x06 ,0x05 }; //4拍正转表 Forward
1213static rt_uint8_t reverse_table [4 ] = {0x05 ,0x06 ,0x0A ,0x09 }; //4拍反转表 Reverse
1920 .Am_pin = GET_PIN (B , 5 ), /* A- */
2021 .Bp_pin = GET_PIN (B , 4 ), /* B+ */
2122 .Bm_pin = GET_PIN (B , 3 ), /* B- */
23+
24+ .fix_angle = STEP_ANGLE /* 初始化每次接受到指令转动的固定角度 */
2225};
2326
2427/* FOCUS步进电机初始定义 名称、引脚等 */
2932 .Am_pin = GET_PIN (B , 9 ), /* A- */
3033 .Bp_pin = GET_PIN (B , 8 ), /* B+ */
3134 .Bm_pin = GET_PIN (B , 7 ), /* B- */
35+
36+ .fix_angle = STEP_ANGLE /* 初始化每次接受到指令转动的固定角度 */
3237};
3338
3439/**
@@ -74,11 +79,11 @@ void selete_pin(rt_uint32_t pin, rt_uint8_t beat)
7479 * @brief 步进电机控制
7580 * @param *stepper 步进电机结构体指针,*beat_table 节拍控制表首地址,*angle角度变量指针
7681 */
77- void stepper_set (stepper_t * stepper , rt_uint8_t * beat_table , rt_int16_t * angle )
82+ void stepper_set (stepper_t * stepper , rt_uint8_t * beat_table )
7883{
7984
8085 /* 角度自减,等待完成对应的角度数 */
81- while (((* angle )-- ) > 0 ) // 由于数据手册未给定步距角,暂定为1步进1°
86+ while (((stepper -> angle )-- ) > 0 ) // 由于数据手册未给定步距角,暂定为1步进1°
8287 {
8388 for (int k = 0 ; k < 4 ; k ++ ) // 4节拍,完成一个步进
8489 {
@@ -96,16 +101,37 @@ void stepper_set(stepper_t *stepper, rt_uint8_t *beat_table, rt_int16_t *angle)
96101 * @brief 步进电机控制
97102 * @param *stepper 步进电机结构体指针,*dir 正反转标志指针,*angle角度变量指针(0~360)
98103 */
99- void stepper_control (stepper_t * stepper , stepper_dir_e * dir , rt_int16_t * angle )
104+ void stepper_control (stepper_t * stepper )
100105{
106+ /* 根据实际测试,foucus转完一个周期需要 360*2,因此这个*2(以360作为一个周期) */
107+ if (!strcmp (stepper -> name , "focus" ))
108+ stepper -> angle *= 2.5 ;
109+ /* 根据实际测试,zoom转完一个周期需要 360*1.5,因此这个*1.5(以360作为一个周期) */
110+ else if (!strcmp (stepper -> name , "zoom" ))
111+ stepper -> angle *= 1.5 ;
112+
113+ if (ANTICLOCKWISE == stepper -> dir ) // 正转
114+ stepper_set (stepper ,forward_table );
101115
102- if (ANTICLOCKWISE == * dir ) // 正转
103- stepper_set (stepper ,forward_table ,angle );
104-
105- else if (CLOCKWISE == * dir ) // 反转
106- stepper_set (stepper ,reverse_table ,angle );
116+ else if (CLOCKWISE == stepper -> dir ) // 反转
117+ stepper_set (stepper ,reverse_table );
107118
108- * dir = STOP ;
119+ stepper -> dir = STOP ;
120+ }
121+
122+ /**
123+ * @brief 设置步进电机参数
124+ * @param *stepper 步进电机结构体指针,data为参数
125+ * @note 当data<3为控制命令,否则为设定每次步进数值
126+ */
127+ void set_stepper_params (stepper_t * stepper , uint8_t data )
128+ {
129+ if (data < 3 ){ // 当小于3时为动作指令,大于3为设定转动角度
130+ stepper -> dir = (stepper_dir_e )data ;
131+ stepper -> angle = stepper -> fix_angle ;
132+ }
133+ else // 否则为设定每次步进的固定角度
134+ stepper -> fix_angle = data ;
109135}
110136
111137/**
@@ -115,8 +141,6 @@ void stepper_control(stepper_t *stepper, stepper_dir_e *dir, rt_int16_t *angle)
115141static int stepper (int argc , char * argv [])
116142{
117143 int result = 0 ;
118- stepper_dir_e stepper_dir ;
119- rt_int16_t stepper_angle [2 ];
120144
121145 if (argc != 3 )
122146 {
@@ -125,19 +149,21 @@ static int stepper(int argc, char *argv[])
125149 goto exit ;
126150 }
127151
128- stepper_dir = (stepper_dir_e )atoi (argv [1 ]); // 获取 方向标志
129- stepper_angle [0 ] = atoi (argv [2 ]); // 获取 角度数值
130- stepper_angle [1 ] = stepper_angle [0 ]; // 角度由于会自减,因此两个步进电机需要两个变量
152+ zoomStepper .dir = (stepper_dir_e )atoi (argv [1 ]); // 获取 方向标志
153+ focusStepper .dir = zoomStepper .dir ;
131154
132- if (stepper_angle [0 ] < 0 || stepper_angle [0 ] > 360 )
155+ zoomStepper .angle = atoi (argv [2 ]); // 获取 角度数值
156+ focusStepper .angle = zoomStepper .angle ;
157+
158+ if (zoomStepper .angle < 0 || zoomStepper .angle > 360 )
133159 {
134160 LOG_E ("angle range in (0,360)" );
135161 result = - RT_ERROR ;
136162 goto exit ;
137163 }
138-
139- stepper_control (& zoomStepper , & stepper_dir , & stepper_angle [ 0 ] );
140- stepper_control (& focusStepper , & stepper_dir , & stepper_angle [ 1 ] );
164+
165+ stepper_control (& zoomStepper );
166+ stepper_control (& focusStepper );
141167
142168exit :
143169 return result ;
0 commit comments