-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEncoder.c
More file actions
144 lines (124 loc) · 2.88 KB
/
Encoder.c
File metadata and controls
144 lines (124 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include "Encoder.h"
uint8_t encode_mode;
//extern uint8_t count;
/**
* @brief 读取SIQ的值
* @param 无
* @retval 返回差值
*/
static int16_t Encoder_ReadValue(void)
{
int16_t value = 0;
value = (int16_t)(__HAL_TIM_GetCounter(&htim3) - 32768);
__HAL_TIM_SetCounter(&htim3, 32768);
return value;
}
/**
* @brief 应用层函数(时基调用)
* @param 无
* @retval 正转返回1/反转返回2/无状态返回0
*/
uint8_t Encoder_GetNum(void)
{
int8_t Encoder_Num = 0;
static uint8_t Encoder_ReturnNum1, Encoder_ReturnNum2;
/* 读取输入值 */
Encoder_Num = Encoder_ReadValue();
/* 没有输入就返回0 */
if (Encoder_Num == 0)
return 0;
// else
// printf("Encoder:%d\r\n", Encoder_Num);
if (Encoder_Num > 0)
{
Encoder_ReturnNum1 += Encoder_Num;
}
else
{
Encoder_ReturnNum2 += (-Encoder_Num);
}
if (Encoder_ReturnNum1 >= 2)
{
Encoder_ReturnNum1 = 0;
Encoder_ReturnNum2 = 0;
return 1;
}
else if (Encoder_ReturnNum2 >= 2 || (Encoder_ReturnNum1 == 1 && Encoder_ReturnNum2 == 1))
{
Encoder_ReturnNum1 = 0;
Encoder_ReturnNum2 = 0;
return 2;
}
else
return 0;
}
extern uint8_t EncoderNum;
void Encoder_Foreward_CallBack(void);
void Encoder_Reverse_CallBack(void);
/**
* @brief 应用层函数(在主函数中调用)
* @param 无
* @retval 正转/反转会触发CallBack
*/
void Encoder_Handler(void)
{
int8_t Encoder_Num = 0;
static uint8_t Encoder_ReturnNum1, Encoder_ReturnNum2;
/* 读取输入值 */
Encoder_Num = Encoder_ReadValue();
/* 没有输入就返回0 */
if (Encoder_Num == 0)
return ;
// else
// printf("Encoder:%d\r\n", Encoder_Num);
if (Encoder_Num > 0)
{
Encoder_ReturnNum1 += Encoder_Num;
}
else
{
Encoder_ReturnNum2 += (-Encoder_Num);
}
if (Encoder_ReturnNum1 >= 2)
{
Encoder_ReturnNum1 = 0;
Encoder_ReturnNum2 = 0;
Encoder_Foreward_CallBack();
}
else if (Encoder_ReturnNum2 >= 2 || (Encoder_ReturnNum1 == 1 && Encoder_ReturnNum2 == 1))
{
Encoder_ReturnNum1 = 0;
Encoder_ReturnNum2 = 0;
Encoder_Reverse_CallBack();
}
}
void Encoder_Foreward_CallBack(void)
{
EncoderNum = 1;
if(EncoderNum==1)
{
count--;
}
}
void Encoder_Reverse_CallBack(void)
{
EncoderNum = 2;
if(EncoderNum==2)
{
count++;
}
}
//时基函数
//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
//{
// /* USER CODE BEGIN Callback 0 */
// if (htim == (&htim4))
// {
// if (++Encoder_count >= 10)
// {
// Encoder_Handler();
// Encoder_count = 0;
//
// }
// }
//}