Skip to content

Commit 88ac16b

Browse files
committed
✨ ENH: 优化程序结构,新增修改参数功能
1 parent 0406790 commit 88ac16b

File tree

7 files changed

+110
-65
lines changed

7 files changed

+110
-65
lines changed

README.md

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ void selete_pin(rt_uint32_t pin, rt_uint8_t beat)
5252
* @brief 步进电机控制
5353
* @param *stepper 步进电机结构体指针,*beat_table 节拍控制表首地址,*angle角度变量指针
5454
*/
55-
void stepper_set(stepper_t *stepper, rt_uint8_t *beat_table, rt_int16_t *angle)
55+
void stepper_set(stepper_t *stepper, rt_uint8_t *beat_table)
5656
{
5757
/* 角度自减,等待完成对应的角度数 */
58-
while(((*angle)--) > 0) // 由于数据手册未给定步距角,暂定为1步进1°
58+
while(((stepper->angle)--) > 0) // 由于数据手册未给定步距角,暂定为1步进1°
5959
{
6060
for(int k = 0; k < 4; k++) // 4节拍,完成一个步进
6161
{
@@ -79,19 +79,53 @@ void stepper_set(stepper_t *stepper, rt_uint8_t *beat_table, rt_int16_t *angle)
7979
| 数据所代表的含义 | 包头 | 包头 | 数据长度位 | 聚焦指令 | 变焦指令 | 累加校验和 |
8080
| 具体描述 | AA | 55 | 02 | xx | xx | SUM |
8181

82+
> 每当`变焦控制器`收到正确数据包时则返回 "ok" 字符串(0x6F、0x6B),可用于检测`变焦控制器`是否存在、是否正常,也可以检测下发给`变焦控制器`的命令是否执行。
83+
84+
85+
86+
#### 2.2.1 动作指令
87+
88+
> **当指令小于3时,为动作指令**
89+
90+
- 聚焦指令为`0x00`时,为聚焦(focus)停止
91+
8292
- 聚焦指令为`0x01`时,为聚焦(focus)放大
93+
8394
- 聚焦指令为`0x02`时,为聚焦(focus)缩小
8495

96+
97+
8598
---
8699

87-
- 变焦指令为`0x01`时,为变焦(zoom)拉近
88-
- 变焦指令为`0x02`时,为变焦(zoom)拉远
100+
- 变焦指令为`0x00`时,为变焦(focus)停止
101+
- 变焦指令为`0x01`时,为变焦(zoom)拉近(即镜头外突)
102+
- 变焦指令为`0x02`时,为变焦(zoom)拉远(即镜头内缩)
103+
104+
```c
105+
// eg. 发送以下数值为转动指定动作
106+
AA 55 02 01 01 03
107+
```
108+
109+
#### 2.2.1 修改步进角度
110+
111+
> **当指令大于等于3时,为修改步进角度指令**
112+
113+
- 聚焦指令其他数值时(大于2),为设定每次步进的角度,默认值为10,周期为360,即一个周期需要36次指令
114+
115+
---
116+
117+
- 变焦指令其他数值时(大于2),为设定每次步进的角度,默认值为10,周期为360,即一个周期需要36次指令
118+
119+
```c
120+
// eg. 发送以下数值为设定两个步进电机每次的步进角度为 50 (0x32)
121+
AA 55 02 32 32 65
122+
```
123+
89124

90-
> 每当`变焦控制器`收到正确数据包时则返回 "ok" 字符串(0x6F、0x6B),可用于检测`变焦控制器`是否存在、是否正常,也可以检测下发给`变焦控制器`的命令是否执行。
91125

92126
### 2.2 调试说明
93127

94-
> 向UART2口发送上述数据包,(eg. `0xAA 0x55 0x02 0x01 0x01 0x03`),可在逻辑分析仪上获取以下波形,符合该4相 步进电机的励磁序列,以下波形完成一个步进(即完成一个励磁序列)用时4ms,即单步为1ms。
128+
> 向 UART2 口发送上述数据包,(eg. `0xAA 0x55 0x02 0x01 0x01 0x03`),可在逻辑分析仪上获取以下波形,符合该4相 步进电机的励磁序列,以下波形完成一个步进(即完成一个励磁序列)用时4ms,即单步为1ms。
95129
96130
![逻辑分析仪上测试得到的励磁序列](https://zengwangfa.oss-cn-shanghai.aliyuncs.com/rov/stepper_sequence_on_logic_analyzer.png "逻辑分析仪上测试得到的励磁序列")
97131

applications/control.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ static void control_thread_entry(void* parameter)
1919

2020
while (1)
2121
{
22-
stepper_control(&focusStepper, &cmd_data.zoom_dir, &cmd_data.zoom_angle);
23-
stepper_control(&zoomStepper, &cmd_data.focus_dir, &cmd_data.focus_angle);
22+
stepper_control(&focusStepper);
23+
stepper_control(&zoomStepper);
2424

2525
rt_thread_mdelay(10); // 此处挂起线程,以防卡死其他线程
2626
}

applications/control.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,5 @@
55
#include <rtdevice.h>
66
#include <board.h>
77

8-
#include "stepper.h"
9-
10-
/* 每次接受到指令的 步进角 */
11-
#define STEP_ANGLE 5
128

139
#endif

applications/stepper.c

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#define LOG_TAG "stepper"
88
#include <drv_log.h>
99
#include <stdlib.h>
10+
#include <string.h>
1011

1112
static rt_uint8_t forward_table[4] = {0x09,0x0A,0x06,0x05}; //4拍正转表 Forward
1213
static rt_uint8_t reverse_table[4] = {0x05,0x06,0x0A,0x09}; //4拍反转表 Reverse
@@ -19,6 +20,8 @@
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步进电机初始定义 名称、引脚等 */
@@ -29,6 +32,8 @@
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)
115141
static 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

142168
exit:
143169
return result;

applications/stepper.h

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
#include <rtthread.h>
55
#include <board.h>
66

7+
/* 初始化时,每次接受到指令的 固定的步进角 */
8+
#define STEP_ANGLE 10
9+
710
/* 步进方向 枚举 0逆 1正*/
811
typedef enum
912
{
@@ -12,25 +15,27 @@ typedef enum
1215
CLOCKWISE = 2, // 顺时针 反转
1316
}stepper_dir_e;
1417

15-
16-
1718
/* 步进电机 结构体*/
1819
typedef struct
1920
{
2021
char *name; // 步进电机名称
2122

2223
/* 步进电机引脚定义*/
23-
rt_uint32_t Ap_pin; /* A+ */
24-
rt_uint32_t Am_pin; /* A- */
25-
rt_uint32_t Bp_pin; /* B+ */
26-
rt_uint32_t Bm_pin; /* B- */
27-
24+
rt_uint32_t Ap_pin; /* A+ */
25+
rt_uint32_t Am_pin; /* A- */
26+
rt_uint32_t Bp_pin; /* B+ */
27+
rt_uint32_t Bm_pin; /* B- */
28+
stepper_dir_e dir; /* 方向 */
29+
rt_int16_t angle; /* 角度 */
30+
rt_int16_t fix_angle; /* 每接收到指令转动的固定角度 */
2831
}stepper_t;
2932

3033
extern stepper_t zoomStepper,focusStepper;
3134

3235
/* 步进电机引脚初始化 */
3336
void stepper_init(stepper_t *stepper);
3437
/* 步进电机控制 */
35-
void stepper_control(stepper_t *stepper, stepper_dir_e *dir, rt_int16_t *angle);
38+
void stepper_control(stepper_t *stepper);
39+
/* 设定步进电机参数 */
40+
void set_stepper_params(stepper_t *stepper, uint8_t data);
3641
#endif

applications/uart.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
#include "uart.h"
66
#include "control.h"
7+
#include "stepper.h"
78
#include <rtdevice.h>
89

910
#define LOG_TAG "uart"
1011
#include <drv_log.h>
1112

1213
#define CONTROL_UART_NAME "uart2"
1314

14-
/* 控制数据 结构体 */
15-
cmd_t cmd_data;
15+
static void control_data_analysis(rt_uint8_t data);
1616

1717
/* 上层控制器发送的变焦控制命令,如果命令数据包正常,则返回"ok"字符串
1818
* 也可表示控制器 检测是否存在变焦组件,因此收到正常的数据包即返回"ok"字符串
@@ -43,7 +43,7 @@ static void serial_thread_entry(void *parameter)
4343
/* 阻塞等待接收信号量,等到信号量后再次读取数据 */
4444
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
4545
}
46-
control_data_analysis(ch, &cmd_data);
46+
control_data_analysis(ch);
4747
}
4848
}
4949

@@ -78,11 +78,12 @@ static int uart2_init(void)
7878
}
7979
INIT_APP_EXPORT(uart2_init);
8080

81+
8182
/**
8283
* @brief 控制命令解析
8384
* @param data 数据字, *cmd控制命令结构体指针
8485
*/
85-
void control_data_analysis(rt_uint8_t data, cmd_t *cmd) //控制数据解析
86+
static void control_data_analysis(rt_uint8_t data) //控制数据解析
8687
{
8788
static rt_uint8_t i;
8889
static rt_uint8_t rxBuffer[10] = {0}; // 数据包
@@ -109,12 +110,12 @@ INIT_APP_EXPORT(uart2_init);
109110

110111
if (rxCheck == rxBuffer[CONTROL_PACKET_LENGTH - 1]) // 判断数据包校验是否正确
111112
{
112-
113-
cmd->zoom_dir = (stepper_dir_e)rxBuffer[3];
114-
cmd->focus_dir = (stepper_dir_e)rxBuffer[4];
113+
/* 设置动作或改参数 */
114+
set_stepper_params(&focusStepper, rxBuffer[3]);
115+
set_stepper_params(&zoomStepper, rxBuffer[4]);
115116

116-
cmd->focus_angle = STEP_ANGLE; // 每次转动STEP_ANGLE°
117-
cmd->zoom_angle = STEP_ANGLE;
117+
/* 测试:打印步进角是否设定成功 */
118+
// rt_kprintf("focus fix_angle %d, zoom->fix_angle %d\n", focusStepper.fix_angle ,zoomStepper.fix_angle );
118119
/* 数据包正常,返回"ok" */
119120
rt_device_write(camera_uart_device, 0, ok_str, (sizeof(ok_str)));
120121
}

applications/uart.h

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#ifndef __MY_UART_H__
1+
#ifndef __MY_UART_H__
22
#define __MY_UART_H__
33

44
#include <rtthread.h>
@@ -8,21 +8,4 @@
88
/* ¿ØÖÆÊý¾Ý°ü³¤¶È 6 */
99
#define CONTROL_PACKET_LENGTH 6
1010

11-
/* 变焦控制命令 */
12-
typedef struct
13-
{
14-
stepper_dir_e zoom_dir;
15-
stepper_dir_e focus_dir;
16-
17-
rt_int16_t zoom_angle;
18-
rt_int16_t focus_angle;
19-
20-
}cmd_t;
21-
22-
/* 控制数据解析 */
23-
void control_data_analysis(rt_uint8_t data, cmd_t *cmd);
24-
25-
/* 控制数据 结构体 */
26-
extern cmd_t cmd_data;
27-
2811
#endif

0 commit comments

Comments
 (0)