-
Notifications
You must be signed in to change notification settings - Fork 0
/
mcal_encoder.c
71 lines (62 loc) · 2.6 KB
/
mcal_encoder.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
#include "mcal_encoder.h"
/*******************************************************************************
* Function name : Encoder_vInit
* Description : 1)Initializes the QEI(Quadrature Encoder Interface)
* 2)Sets the count register value in the middle for easier
* data processing(by decreasing count reset probability)
* List of arguments: no arguments
* Return value : no return value
********************************************************************************/
void QEI_vInit(void)
{
/* Set channel A and B microcontroller pins as Inputs */
TRISCbits.TRISC9 = 1;
TRISBbits.TRISB15 = 1;
/* Assign channel A to RP15 */
RPINR14bits.QEA1R = 15;
/* Assign channel B to RP25 */
RPINR14bits.QEB1R = 25;
/* Timer Input Clock Prescale 1:64 */
QEI1CONbits.TQCKPS = 0b10;
/* Encoder enabled (x4 mode) with position counter reset by match(MAXxCNT) */
QEICONbits.QEIM = 0b111;
/* Set count register value around the middle of the possible value range */
POS1CNT=32000;
/* Count value can be read from POS1CNT register */
}
/*******************************************************************************
* Function name : Encoder_u16getCount
* Description : Returns POS1CNT(count register) value
* List of arguments: no arguments
* Return value : T_U16 -> value of POS1CNT.
* POS1CNT is initialized at 32000
* POS1CNT is: incremented when moving backwards
* decremented when moving forward
********************************************************************************/
T_U16 QEI_u16getCount()
{
return POS1CNT;
}
/*******************************************************************************
* Function name : QEI_vResetCount
* Description : Resets the count register to 32000
* List of arguments: no arguments
* Return value : no return value
********************************************************************************/
void QEI_vResetCount()
{
POS1CNT=32000;
}
/*******************************************************************************
* Function name : QEI_s16getElapsed
* Description : Returns the elapsed ticks and resets the counter
* List of arguments: no arguments
* Return value : T_S16 -> Elapsed Encoder Ticks
********************************************************************************/
T_S16 QEI_s16getElapsed()
{
T_S16 s16Elapsed;
s16Elapsed = 32000 - POS1CNT;
QEI_vResetCount();
return s16Elapsed;
}