Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
84621c7cdThis file is pinned to the selected release. Download the original to open it in your design tool.
#ifdef CMD_RX
#error you can only have one command component
#else
#define CMD_RX
#endif
COMP(enc_cmd);
HAL_PIN(res) = 2048.0;
HAL_PIN(pos) = 0.0;
MEM(int e_res) = 0.0;
RT_INIT(
GPIO_InitTypeDef GPIO_InitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1 | TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0xF;
TIM_ICInit(ENC0_TIM, &TIM_ICInitStructure);
/***************** port 0, quadrature or step/dir *********************/
e_res = (int)PIN(res);
if(e_res < 1){
e_res = 1;
}
// enable clocks
RCC_APB2PeriphClockCmd(ENC0_TIM_RCC, ENABLE);
// pin af -> tim
GPIO_PinAFConfig(ENC0_A_PORT, ENC0_A_PIN_SOURCE, ENC0_A_AF_SOURCE);//ch1
GPIO_PinAFConfig(ENC0_B_PORT, ENC0_B_PIN_SOURCE, ENC0_B_AF_SOURCE);//ch2
// enc res / turn
TIM_SetAutoreload(ENC0_TIM, e_res - 1);
// quad
TIM_Cmd(ENC0_TIM, DISABLE);
TIM1->CR1 |= TIM_CR1_DIR;
GPIO_InitStructure.GPIO_Pin = ENC0_A_PIN | ENC0_B_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(ENC0_A_PORT, &GPIO_InitStructure);
TIM_EncoderInterfaceConfig(ENC0_TIM, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_Cmd(ENC0_TIM, ENABLE);
);
RT_DEINIT(
TIM_Cmd(ENC0_TIM, DISABLE);
TIM_DeInit(ENC0_TIM);
RCC_APB2PeriphClockCmd(ENC0_TIM_RCC, DISABLE);
GPIO_InitStructure.GPIO_Pin = ENC0_A_PIN | ENC0_B_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(ENC0_A_PORT, &GPIO_InitStructure);
);
RT(
float p = 0.0;
int res = (int)PIN(res);
if(res < 1){
res = 1;
}
p = mod(TIM_GetCounter(ENC0_TIM) * 2.0f * M_PI / (float)e_res);
PIN(pos) = p;
if(e_res != res){
e_res = res;
TIM_SetAutoreload(ENC0_TIM, e_res - 1);
}
);
ENDCOMP;
//http://stackoverflow.com/questions/32947972/stm32-how-to-make-pulse-count-up-down-with-timer
// #include "mbed.h"
// #include "stm32f4xx.h"
// #include "stm32f4xx_hal_tim_ex.h"
//
// TIM_HandleTypeDef timer;
// TIM_Encoder_InitTypeDef encoder;
//
// //direction to PA_9 -- step to PA_8
//
// int main(){
// GPIO_InitTypeDef GPIO_InitStruct;
// __TIM1_CLK_ENABLE();
// __GPIOA_CLK_ENABLE();
// GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
// GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
// GPIO_InitStruct.Pull = GPIO_PULLDOWN;
// GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
// GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
// HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//
// timer.Instance = TIM1;
// timer.Init.Period = 0xffff;
// timer.Init.Prescaler = 1;
// timer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
// timer.Init.CounterMode = TIM_COUNTERMODE_UP;
//
//
// encoder.EncoderMode = TIM_ENCODERMODE_TI1;
// encoder.IC1Filter = 0x0f;
// encoder.IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING; //step signal
// encoder.IC1Prescaler = TIM_ICPSC_DIV1;
// encoder.IC1Selection = TIM_ICSELECTION_DIRECTTI;
//
// encoder.IC2Filter = 0x0f;
// encoder.IC2Polarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE; //check direction
// encoder.IC2Prescaler = TIM_ICPSC_DIV1;
// encoder.IC2Selection = TIM_ICSELECTION_INDIRECTTI;
//
// HAL_TIM_Encoder_Init(&timer, &encoder);
// HAL_TIM_Encoder_Start(&timer,TIM_CHANNEL_1);
//
//
// TIM1->EGR = 1; // Generate an update event
// TIM1->CR1 = 1; // Enable the counter
//
//
// while (1) {
// int16_t count1;
// count1=TIM1->CNT;
//
// printf("%d\r\n", count1);
// wait(1.0);
//
// };
// }