Ср июн 21, 2023 15:42:49
Ср июн 21, 2023 20:14:42
alex_ писал(а):Но почему вам так не нравится тема: сопряжения 2 таймеров, если это заложено в камень?
Камень будет хорошо нагружен,
Ср июн 21, 2023 23:21:22
Ещё и пишет этот вопрос в нескольких темах.
А ещё Эзернет, а ещё...
Рекомендую чётко сформулировать хотелки, ибо пока сам не можешь объяснить чё те надо, сделать это по-человечески не получится.
Чт июн 22, 2023 06:03:12
alex_ писал(а):вопрос в том что возможно ли это при подключении энкодера?
alex_ писал(а):жаль что этот такт нельзя напрямую проклучить на другой таймер
alex_ писал(а):40 каналов АЦП в 12бит, считывать данные с АЦП нужно через каждый мм
alex_ писал(а):В кратце...
Чт июн 22, 2023 07:44:34
С этого момента по подробнее, что надо на что поменять?Можно. Просто меняется источник тактирования и способ счёта.
Я художник, я так вижуНе понятно, _для_чего_ нужен второй таймер.
Можно только смысла особо нет, считываем данные с нескольких каналов АЦП, пересчитываем в физические значения, если они получились реальными(не мусор и не сбой датчика) тогда записываем в массив, после сканирования этот массив ещё раз обрабатывается, сжимая ещё в несколько раз данные, чтобы потом передать по Ethernet. Основная нагрузка здесь не чтение датчиков, а больше вычисленияЭто можно сделать аппаратно, да ещё и через DMA
Чт июн 22, 2023 09:07:39
alex_ писал(а):Я художник, я так вижу
Чт июн 22, 2023 17:27:47
Чт июн 22, 2023 22:18:59
Пт июн 23, 2023 09:19:42
Пт июн 23, 2023 10:48:23
Пн июн 26, 2023 13:57:40
/* Encoder Initialization */
/* TIM4 Clock */
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
/* 01: CC1 channel is configured as input, IC1 is mapped on TI1
* 01: CC2 channel is configured as input, IC2 is mapped on TI2 */
TIM4->CCMR1 |= (TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0);
TIM4->CCMR1 &= ~(TIM_CCMR1_CC1S_1 | TIM_CCMR1_CC2S_1);
/* 00: noninverted/rising edge */
TIM4->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P);
TIM4->CCER &= ~(TIM_CCER_CC2NP | TIM_CCER_CC2NP);
/* 001: Encoder mode 1 - Counter counts up/down on TI2FP1 edge depending on TI1FP2 level */
TIM4->SMCR |= TIM_SMCR_SMS_0; // 001 считаем только по входу TI1 , ели надо по обоим то 011
TIM4->SMCR |= TIM_SMCR_SMS_1;
TIM4->SMCR &= ~TIM_SMCR_SMS_2;
/* 1111: fSAMPLING = fDTS / 32, N = 8 */
TIM4->CCMR1 |= (TIM_CCMR1_IC1F_0 | TIM_CCMR1_IC1F_1 | TIM_CCMR1_IC1F_2); //| TIM_CCMR1_IC1F_3);
TIM4->CCMR1 |= (TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_IC2F_2); //| TIM_CCMR1_IC2F_3);
TIM4->CCMR1 &=~TIM_CCMR1_IC1F_3;//уменьшили уже не 32x8
TIM4->CCMR2 &=~TIM_CCMR1_IC2F_3;
/* Auto-Reload Register (MAX counter number) */
TIM4->ARR = 0xffff;//30;
//разрешаем прерывание от таймера 4
NVIC_EnableIRQ(TIM4_IRQn);
NVIC_SetPriority (TIM4_IRQn, 5);
TIM4->DIER |= TIM_DIER_CC1IE | TIM_DIER_CC2IE | TIM_DIER_CC3IE | TIM_DIER_CC4IE;// включаем прерывание по совпадению
TIM4->CCR1 = 1000;
TIM4->CCR2 = 2000;
TIM4->CCR3 = 3000;
TIM4->CCR4 = 4000;
/* 1: Counter enabled */
TIM4->CR1 |= TIM_CR1_CEN;
//----------
//ну и сам обработчик прерывания
void TIM4_IRQHandler(void)
{
sprintf(txt, "%d", (unsigned int)TIM4->CNT);
UART3_Write_Text((unsigned char*)txt);UART3_Write_Text((unsigned char*)"\t");
if(TIM4->SR & TIM_SR_UIF){
TIM4->SR = ~TIM_SR_UIF;
}
if(TIM4->SR & TIM_SR_CC1IF){
TIM4->SR = ~TIM_SR_CC1IF;
UART3_Write_Text((unsigned char*)"CC1IF\r\n");
LED2_INV();
}
if(TIM4->SR & TIM_SR_CC2IF){
TIM4->SR = ~TIM_SR_CC2IF;
UART3_Write_Text((unsigned char*)"CC2IF\r\n");
LED2_INV();
}
if(TIM4->SR & TIM_SR_CC3IF){
TIM4->SR = ~TIM_SR_CC3IF;
UART3_Write_Text((unsigned char*)"CC3IF\r\n");
LED2_INV();
}
if(TIM4->SR & TIM_SR_CC4IF){
TIM4->SR = ~TIM_SR_CC4IF;
UART3_Write_Text((unsigned char*)"CC4IF\r\n");
LED2_INV();
}
}