Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of Chemical_Sensor_DMA by
Sample/quad.cpp@2:3771b3195c7b, 2015-10-29 (annotated)
- Committer:
- baxterja
- Date:
- Thu Oct 29 17:15:20 2015 +0000
- Revision:
- 2:3771b3195c7b
Accessible Sample folder
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
baxterja | 2:3771b3195c7b | 1 | #include "quad.h" |
baxterja | 2:3771b3195c7b | 2 | |
baxterja | 2:3771b3195c7b | 3 | void quad_init() { |
baxterja | 2:3771b3195c7b | 4 | |
baxterja | 2:3771b3195c7b | 5 | // Enable clock for FTM2 |
baxterja | 2:3771b3195c7b | 6 | SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK; // there are two of them for some reason |
baxterja | 2:3771b3195c7b | 7 | SIM_SCGC6 |= SIM_SCGC6_FTM2_MASK; // |
baxterja | 2:3771b3195c7b | 8 | |
baxterja | 2:3771b3195c7b | 9 | // Enable clock for PortB |
baxterja | 2:3771b3195c7b | 10 | SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK; |
baxterja | 2:3771b3195c7b | 11 | |
baxterja | 2:3771b3195c7b | 12 | //enable the counter |
baxterja | 2:3771b3195c7b | 13 | FTM2_MODE |= FTM_MODE_WPDIS_MASK; // unlock write protection on certain FTM bits and registers |
baxterja | 2:3771b3195c7b | 14 | FTM2_MODE |= FTM_MODE_FTMEN_MASK; |
baxterja | 2:3771b3195c7b | 15 | |
baxterja | 2:3771b3195c7b | 16 | //enable the counter to run in the BDM mode |
baxterja | 2:3771b3195c7b | 17 | FTM2_CONF |= FTM_CONF_BDMMODE(3); |
baxterja | 2:3771b3195c7b | 18 | |
baxterja | 2:3771b3195c7b | 19 | //load the Modulo register and counter initial value |
baxterja | 2:3771b3195c7b | 20 | FTM2_MOD = 4095; |
baxterja | 2:3771b3195c7b | 21 | FTM2_CNTIN = 0; |
baxterja | 2:3771b3195c7b | 22 | |
baxterja | 2:3771b3195c7b | 23 | //configuring FTM for quadrature mode |
baxterja | 2:3771b3195c7b | 24 | FTM2_QDCTRL = 0; |
baxterja | 2:3771b3195c7b | 25 | FTM2_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; // enable Quadrature decoding |
baxterja | 2:3771b3195c7b | 26 | FTM2_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; // select phase A and phase B decoding mode (this is what the angle encoder uses) |
baxterja | 2:3771b3195c7b | 27 | FTM2_QDCTRL |= FTM_QDCTRL_PHAPOL_MASK; // change direction of counting by changing the phase of input A (for some reason QUADIR wouldn't work) |
baxterja | 2:3771b3195c7b | 28 | |
baxterja | 2:3771b3195c7b | 29 | |
baxterja | 2:3771b3195c7b | 30 | // start the timer clock, source is the external clock |
baxterja | 2:3771b3195c7b | 31 | FTM2_SC |= FTM_SC_CLKS(3); |
baxterja | 2:3771b3195c7b | 32 | |
baxterja | 2:3771b3195c7b | 33 | //configuring the input pins: |
baxterja | 2:3771b3195c7b | 34 | PORTB_PCR18 = PORT_PCR_MUX(6); // FTM2_QD_PHA (PTB18) ALT6 |
baxterja | 2:3771b3195c7b | 35 | PORTB_PCR19 = PORT_PCR_MUX(6); // FTM2_QD_PHB (PTB19) ALT6 |
baxterja | 2:3771b3195c7b | 36 | |
baxterja | 2:3771b3195c7b | 37 | // Enable write protection |
baxterja | 2:3771b3195c7b | 38 | FTM2_MODE |= FTM_MODE_WPDIS_MASK; // Lock write protection on certain FTM bits and registers |
baxterja | 2:3771b3195c7b | 39 | |
baxterja | 2:3771b3195c7b | 40 | } |
baxterja | 2:3771b3195c7b | 41 | |
baxterja | 2:3771b3195c7b | 42 | int32_t quad_read() { |
baxterja | 2:3771b3195c7b | 43 | int angle = FTM2_CNT; |
baxterja | 2:3771b3195c7b | 44 | if(angle > 2048) angle -= 4096; |
baxterja | 2:3771b3195c7b | 45 | return angle; // this is the register with the counter in it. |
baxterja | 2:3771b3195c7b | 46 | } |
baxterja | 2:3771b3195c7b | 47 | |
baxterja | 2:3771b3195c7b | 48 | void quad_update(int value) { |
baxterja | 2:3771b3195c7b | 49 | if(value < 0) value = value + 4096; // convert back to raw form (both absolute angle and relative angle are actually integers between 0-4095) |
baxterja | 2:3771b3195c7b | 50 | FTM2_CNTIN = value; // change reset value to desired value |
baxterja | 2:3771b3195c7b | 51 | FTM2_CNT = 0; // writing anything to FTM_CNT loads FTM2_CNTIN into FTM_CNT; |
baxterja | 2:3771b3195c7b | 52 | FTM2_CNTIN = 0; // change reset value back to 0 |
baxterja | 2:3771b3195c7b | 53 | } |
baxterja | 2:3771b3195c7b | 54 | |
baxterja | 2:3771b3195c7b | 55 | void quad_invert(){ |
baxterja | 2:3771b3195c7b | 56 | FTM2_QDCTRL &= ~FTM_QDCTRL_PHAPOL_MASK; // change direction of counting by changing the phase of input A |
baxterja | 2:3771b3195c7b | 57 | } |