/
enc_v1_func.c
237 lines (195 loc) · 6.78 KB
/
enc_v1_func.c
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#include <stm32f10x_tim.h> //IRQ TIM
#include<stm32f10x_gpio.h>
#define DIAMETER_WHEEL_MM 20 //äèàìåòð êîëåñà
#define TICK_FOR_WHEEL 10 //ùåë÷êîâ íà îäèí îáîðîò
#define TIM_OVERRUN 255 //ðàçìåðíîñòü ñ÷åò÷èêà ýíêîäåðà
#define TIMER_WAIT_MS 1000 // ðàç âî ñêîëüêî âåìåíè îòñ÷èòûâàåì ýíêîäåðû.
NVIC_InitTypeDef NVIC_Int;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure1;
int16_t QE1 = 0, QE2 = 0;
int16_t PreviousQE1 = 0, PreviousQE2 = 0;
uint16_t Enc1_Interrupted = 0;
uint32_t Enc1_TotalCount = 0;
void mcu_tim2_init(void)
{
RCC->APB1ENR = RCC_APB1ENR_TIM2EN; //òàêòèðîâàíèå
TIM2->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; //Íàñòðàèâàåì âòîðîé ìóëüòèïëåêñîð (äëÿ ïåðâîãî è âòîðîãî âõîäà):
TIM2->CCER = TIM_CCER_CC1P | TIM_CCER_CC2P; //Ñ äåòåêòîðà ôðîíòîâ âîçüìåì íå èíâåðñíûé, ò.å. àêòèâíûé óðîâåíü âûñîêèé (äëÿ ïåðâîãî è âòîðîãî âõîäà):
TIM2->SMCR = TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; //Âñ¸, ìîæíî ðàçðåøàòü ðàáîòó ñ÷åò÷èêà:
TIM2->ARR = TIM_OVERRUN;
TIM2->CR1 = TIM_CR1_CEN;
}
void TIM4_Config(void)
{
RCC->APB1ENR += RCC_APB1ENR_TIM4EN; //àêêóðàòíî!!
TIM4->PSC = 24000-1;
TIM4->ARR = TIMER_WAIT_MS;
TIM4->DIER = TIM_DIER_UIE;
TIM4->CR1 = TIM_CR1_CEN;
//NVIC_EnableIRQ(TIM4_IRQn);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void mcu_tim3_init(void)
{
RCC->APB1ENR = RCC_APB1ENR_TIM3EN; //òàêòèðîâàíèå
TIM3->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; //Íàñòðàèâàåì âòîðîé ìóëüòèïëåêñîð (äëÿ ïåðâîãî è âòîðîãî âõîäà):
TIM3->CCER = TIM_CCER_CC1P | TIM_CCER_CC2P; //Ñ äåòåêòîðà ôðîíòîâ âîçüìåì íå èíâåðñíûé, ò.å. àêòèâíûé óðîâåíü âûñîêèé (äëÿ ïåðâîãî è âòîðîãî âõîäà):
TIM3->SMCR = TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; //Âñ¸, ìîæíî ðàçðåøàòü ðàáîòó ñ÷åò÷èêà:
TIM3->ARR = TIM_OVERRUN;
TIM3->CR1 = TIM_CR1_CEN;
}
uint32_t Enc1_GetCount(void)
{
uint32_t count = 0;
uint32_t tmpTotalCount = 0;
uint32_t tmpEncCount = 0;
// do {
Enc1_Interrupted = 1;
tmpTotalCount = Enc1_TotalCount;
tmpEncCount = TIM2->CNT;
//} while ( Enc1_Interrupted == 0 );
count = tmpTotalCount + tmpEncCount;
return count;
}
void TIM2_IRQHandler(void)
{
uint16_t cnt = TIM2->CNT;
GPIOC->ODR^=GPIO_Pin_8;
//send_to_uart('T');
/* if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}*/
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if ( cnt < 0x7FFF ) {
Enc1_TotalCount += (uint32_t)0x10000;
} else {
Enc1_TotalCount -= (uint32_t)0x10000;
}
Enc1_Interrupted = 0;
//send_to_uart('S');
//USART1->DR = (cnt & (uint16_t)0x01FF);
//USART_SendData(USART1, 0x01);
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
DMA_Cmd(DMA1_Channel4, ENABLE);
}
void TIM3_IRQHandler(void)
{
uint16_t cnt = TIM3->CNT;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
void TIM4_IRQHandler(void)
{
//vUtils_Debug("FF");
//uint16_t cnt = TIM4->CNT;
QE1+=TIM2->CNT;
QE2+=TIM3->CNT;
/*TIM2->CR1 =(TIM2->CR1) & ~(TIM_CR1_CEN);
TIM3->CR1 =(TIM3->CR1) & ~ (TIM_CR1_CEN);
TIM2->CR1 =TIM_CR1_CEN;
TIM3->CR1 = TIM_CR1_CEN;
*/
//send_to_uart('S');
//send_to_uart('G');
/*TIM2->ARR = 0;
TIM2->ARR= 1000;
TIM3->ARR = 0;
TIM3->ARR= 1000;*/
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
//mcu_tim2_init();
//mcu_tim3_init();
}
void VirtualEncoderInc()
{
GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_RESET);
GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_RESET);
Delay(800000);
GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_SET);
Delay(800000);
GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);
Delay(800000);
GPIO_WriteBit(GPIOC,GPIO_Pin_9, Bit_RESET);
Delay(800000);
GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);
Delay(800000);
}
void TIM2_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ; // two LED (guess on what pin!!)
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_Int.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_Int.NVIC_IRQChannelSubPriority = 2;
NVIC_Int.NVIC_IRQChannelCmd = ENABLE;
NVIC_Int.NVIC_IRQChannel = TIM2_IRQn;
NVIC_Init(&NVIC_Int);
TIM_TimeBaseStructure.TIM_Period = 200;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}
void TIM3_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ; // two LED (guess on what pin!!)
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_Int.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_Int.NVIC_IRQChannelSubPriority = 2;
NVIC_Int.NVIC_IRQChannelCmd = ENABLE;
NVIC_Int.NVIC_IRQChannel = TIM3_IRQn;
NVIC_Init(&NVIC_Int);
TIM_TimeBaseStructure.TIM_Period = 200;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
}
void EINT_Config(void)
{
GPIO_StructInit(&GPIO_InitStructure1);
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure1);
//SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_StructInit(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure1;
NVIC_InitStructure1.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure1);
}
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
//Handle the interrupt
GPIOC->ODR^=GPIO_Pin_8;
EXTI_ClearITPendingBit(EXTI_Line0);
}
}