Вс окт 17, 2021 08:25:54
Пн окт 18, 2021 19:26:06
static inline void timers_setup(){
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
/* (1) Configure TI1FP1 on TI1 (CC1S = 01)
configure TI1FP2 on TI2 (CC2S = 01) */
/* (2) Configure TI1FP1 and TI1FP2 non inverted (CC1P = CC2P = 0, reset value) */
/* (3) Configure both inputs are active on both rising and falling edges
(SMS = 011), set external trigger filter to f_DTS/8, N=6 (ETF=1000) */
/* (4) Enable the counter by writing CEN=1 in the TIMx_CR1 register. */
TIM3->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; /* (1)*/
/* (2) */
TIM3->SMCR = TIM_SMCR_ETF_3 | TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; /* (3) */
// enable update interrupt
TIM3->DIER = TIM_DIER_UIE;
// set ARR to 79 - generate interrupt each 80 counts (one revolution)
TIM3->ARR = 79;
// enable timer
TIM3->CR1 = TIM_CR1_CEN; /* (4) */
NVIC_EnableIRQ(TIM3_IRQn);
}
if (CNT_EN){
if ((CNT_TIM3_old==1)&&(cnt_dir!=1)&&(TIM3_CNT > 32767))
CNT_Val_Reg = (s32)(CNT_Val_Reg - 65536), CNT_TIM3_old = 65534, cnt_dir = 1;
if ((CNT_TIM3_old==65534)&&(cnt_dir!=2)&&(TIM3_CNT < 32767))
CNT_Val_Reg = (s32)(CNT_Val_Reg + 65536), CNT_TIM3_old = 1, cnt_dir = 2;
}
TIM_ICInitTypeDef TIM_ICInitStructure;
//Enter the content in the structure by default
TIM_ICStructInit(&TIM_ICInitStructure);
//выбрать входной терминал IC1
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
//Захват фронт
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
//сопоставлен с TI1
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
//Настроить входное частотное деление замеряемого сигнала, не делим чтоб не потерять
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
//filter value fSAMPLING=fDTS/32, выборка N=8.
TIM_ICInitStructure.TIM_ICFilter = 15;
//Initialize the specified parameters in TIM_ICInitStructure TIM3
TIM_ICInit(TIM3, &TIM_ICInitStructure);
Вт окт 19, 2021 07:59:37
да потому что дребезг я отфильтровать расчетным путем не смог
Вт окт 19, 2021 09:50:53
Вт окт 19, 2021 10:50:25
да потому что дребезг я отфильтровать расчетным путем не смог
Вт окт 19, 2021 10:58:43
Вт окт 19, 2021 12:17:47
Вт окт 19, 2021 12:51:55
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //включить тактирование порта AHB = 48
/** TIM3 GPIO Configuration
PA6 ------> TIM3_CH1
PA7 ------> TIM3_CH2
*/
// настройка вывода PA6
GPIOA->MODER &= ~(GPIO_MODER_MODER6);
GPIOA->MODER |= (GPIO_MODER_MODER6_1); //10 Alternate
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR6_0; //01 Alternate Function PP Pull-up
// настройка вывода PA7
GPIOA->MODER &= ~(GPIO_MODER_MODER7);
GPIOA->MODER |= (GPIO_MODER_MODER7_1);
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR7_0; //01
/*Configure GPIO pin alternate function */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);
/*Configure GPIO pin alternate function */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_1);
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; //тактирование таймера
TIM3->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; //полярность сигнала для каждого входа
TIM3->CCER &= (uint16_t)(~(TIM_CCER_CC1P | TIM_CCER_CC2P)); // PA6 PA7
TIM3->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1 | TIM_SMCR_ETF; //режим энкодера
TIM3->CR1 |= TIM_CR1_CKD_1;
TIM3->CCMR1 |= TIM_CCMR1_IC1F_3 | TIM_CCMR1_IC1F_2 | TIM_CCMR1_IC1F_1 | TIM_CCMR1_IC1F_0;
TIM3->CCMR1 |= TIM_CCMR1_IC2F_3 | TIM_CCMR1_IC2F_2 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_IC2F_0;
TIM3->ARR = 0xFFFF; //значение, до которого считает CNT
TIM3->CNT = 0x1FFF;
TIM3->CR1 |= TIM_CR1_CEN;
Вт окт 19, 2021 12:58:01
Вт окт 19, 2021 13:19:32
Ну как сказать, один тик плохо отрабатывает, особенно при навигации в меню жутко не удобно, может на два три пункта перескочить.Eddy_Em писал(а):и что, все равно не фильтрует?
не пробовал.Eddy_Em писал(а):А если APB prescaler на 1/16?
Вт окт 19, 2021 13:36:00
Ср ноя 03, 2021 15:22:08
htim3.Instance = TIM3;
htim3.Init.Prescaler = 1;
htim3.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3;
htim3.Init.Period = 100;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 15;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sConfig.IC2Filter = 15;
if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
encoder_counter = __HAL_TIM_GET_COUNTER(&htim3);
Ср ноя 03, 2021 16:04:22
Ср ноя 03, 2021 23:16:32
Вт июн 20, 2023 10:20:55
Ср июн 21, 2023 06:03:32
alex_ писал(а):на цепи лежит объект, цепь при этом перемещается, на цепи установлен инкрементальный энкодер
Ср июн 21, 2023 10:22:48
Ср июн 21, 2023 11:18:47
Ср июн 21, 2023 13:48:35
Ср июн 21, 2023 14:19:00
alex_ писал(а):счётчик сбрасывается в ноль и формируется прерывание. Хочу сделать всё на аппаратном уровне без заморочки с регистрами сравнения.