Пн окт 04, 2021 20:46:12
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// Заполняем настройки по дефолту
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
// Clock prescaler 72M/1 Запускаем таймер на тактовой частоте 72 MHz
TIM_TimeBaseStructure.TIM_Prescaler= 1;
// Частоту дополнительно не делим TIM_CKD_DIV1=0
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
// Считаем вверх и вниз
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down | TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 65536;
// Инициализируем TIM3
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// Clear overflow interrupt flag
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ClearFlag(TIM3, TIM_FLAG_CC1);
// Disable interrupt for Update Event
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
TIM_ITConfig(TIM3,TIM_IT_CC1,DISABLE);
/* Считать будем все переходы лог. уровня с обоих каналов */
//TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);
TIM_Cmd(TIM3, ENABLE);
Пн окт 04, 2021 20:58:36
Пн окт 04, 2021 21:08:09
Пн окт 04, 2021 21:13:46
Пн окт 04, 2021 21:19:21
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // тактирование врубаем
TIM_DeInit(TIM3); // в состояние "по умолчанию"
TIM_TimeBaseInitStructure.TIM_Period = 65535; // до скольки крутим
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseInitStructure.TIM_Prescaler = 0x0000; // Предделитель учитывается как TIM_Prescaler+1, поэтому отнимаем 1
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_PrescalerConfig(TIM3, 1, TIM_PSCReloadMode_Immediate);
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_Falling, TIM_ICPolarity_Rising);
TIM_Cmd(TIM3, ENABLE);
a = TIM3->CNT; // читаем значение энкодера
Вт окт 05, 2021 01:19:47
Вт окт 05, 2021 10:23:06
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // тактирование врубаем
TIM_DeInit(TIM3); // в состояние "по умолчанию"
TIM_TimeBaseInitStructure.TIM_Period = 65535; // до скольки крутим
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseInitStructure.TIM_Prescaler = 0x0000; // Предделитель учитывается как TIM_Prescaler+1, поэтому отнимаем 1
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_PrescalerConfig(TIM3, 1, TIM_PSCReloadMode_Immediate);
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_Falling, TIM_ICPolarity_Rising);
TIM_Cmd(TIM3, ENABLE);
a = TIM3->CNT; // читаем значение энкодера
Вт окт 05, 2021 12:29:39
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);
}
Вт окт 05, 2021 13:25:54
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);
}
TIM3->SMCR = TIM_SMCR_ETF_3 | TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; /* (3) */
TIM3->SMCR = TIM_SMCR_ETF_3 | TIM_SMCR_SMS_0; /* (3) */
Вт окт 05, 2021 13:35:55
А входы какую настройку имеют?
GPIOA->MODER = GPIO_MODER_MODER4_O | GPIO_MODER_MODER6_AF | GPIO_MODER_MODER7_AF;
GPIOA->AFR[0] = (GPIOA->AFR[0] &~ (GPIO_AFRL_AFRL6 | GPIO_AFRL_AFRL7)) \
| (1 << (6 * 4)) | (1 << (7 * 4));
Вт окт 05, 2021 13:59:13
А входы какую настройку имеют?
GPIOA->MODER = GPIO_MODER_MODER4_O | GPIO_MODER_MODER6_AF | GPIO_MODER_MODER7_AF;
GPIOA->AFR[0] = (GPIOA->AFR[0] &~ (GPIO_AFRL_AFRL6 | GPIO_AFRL_AFRL7)) \
| (1 << (6 * 4)) | (1 << (7 * 4));
TIM_ICInitTypeDef TIM_ICInitStructure;
//Enter the content in the structure by default
TIM_ICStructInit(&TIM_ICInitStructure);
//filter value
TIM_ICInitStructure.TIM_ICFilter = 6;
//Initialize the specified parameters in TIM_ICInitStructure TIM3
TIM_ICInit(TIM3, &TIM_ICInitStructure);
/* Configure pin PA6, PA7*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//Каналы 1 и 2 таймера TIM3 - на вход, подтянуть к питанию
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //вход с подтяжкой к питанию
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
Вт окт 05, 2021 14:55:58
нашел проблему
TIM3->SMCR |= TIM_SMCR_ETF_3
Вт окт 05, 2021 21:24:38
нашел проблему
TIM3->SMCR |= TIM_SMCR_ETF_3
Вт окт 05, 2021 21:34:58
Вт окт 05, 2021 21:40:38
Ср окт 13, 2021 21:06:26
if ((CNT_TIM3_old==1)&&(cnt_dir != 1)&&(TIM3->CNT > 32767)) //CNT_TIM3_old 0 база, 1 - близкое к нулю, 65534 - близкое к переполнению вверх
CNT_Val_Reg = (s32)(CNT_Val_Reg - 65536), cnt_dir = 1; //0 прошли середину диапазона CNT, 1 назад, 2 вперед
if ((CNT_TIM3_old==65534)&&(cnt_dir != 2)&&(TIM3->CNT < 32767))
CNT_Val_Reg = (s32)(CNT_Val_Reg + 65536), cnt_dir = 2; //0 прошли середину диапазона CNT, 1 назад, 2 вперед
Ср окт 13, 2021 21:37:16
Чт окт 14, 2021 06:28:43
// Посмотреть относительное перемещение по сравнению с прошлым вызовом
int16_t enc_Get(void)
{
// Для хранения предыдущего значения счетчика
static uint16_t CNT_last = 0;
// Текущее значение, чтоб только один раз было запрошено
uint16_t CNT_now = TIM3->CNT;
// Посчитаем перемещение
int16_t CNT_diff = (int16_t)(CNT_now - CNT_last);
// Сохраним текущее значение как предыдущее
CNT_last = CNT_now;
// Вернем перемещение
return CNT_diff;
}
temp = (int16_t )enc_Get();
if (temp < 0) {
x--;
}
if (temp > 0) {
x++;
}
Чт окт 14, 2021 09:25:50
Чт окт 14, 2021 09:59:44
И что?Eddy_Em писал(а):т.е. для таймера это 80, 200, 400, 800, 4000 и т.п. отсчетов.
// Вернем перемещение
temp = (int16_t )enc_Get();
if (temp < 0) {
x -= temp;
}
if (temp > 0) {
x += temp;
}