Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 измерение ШИМ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
juvf
Не могу автоматически измерить параметры ШИМ. Подключены 2 канала (2 провода) к 2-ум пинам процессора, к TIM3_ch3 и к TIM3_ch4. На них поступает ШИМ.

Решил для начала померить ШИМ в канале 3. Код
CODE
//настроим порты входа
GPIOB_CRL_bit.MODE0 = 0;//Вход
GPIOB_CRL_bit.CNF0 = 1;
GPIOB_CRL_bit.MODE1 = 0;//Вход
GPIOB_CRL_bit.CNF1 = 1;

RCC_APB1ENR_bit.TIM3EN = 1; // подадим клоки

TIM3_PSC = 552;
TIM3_ARR = 0x7fff;

TIM3_CCMR2_bit.IC3S = 1;//подадим на IC3 сигнал с входа TI3 (Tim3_CH3)
TIM3_CCER_bit.CC3P = 0;// захват по нарастающему фронту


TIM3_CCMR2_bit.IC4S = 2;//подадим на IC4 сигнал с входа TI3 (Tim3_CH3)
TIM3_CCER_bit.CC4P = 1;// захват по спадающиму фронту

TIM3_SMCR_bit.TS = 0x5;// триггер Filtered Timer Input 1 (TI1FP1)
TIM3_SMCR_bit.SMS = 0x4; //Reset mode

TIM3_CCER_bit.CC3E = 1;
TIM3_CCER_bit.CC4E = 1;

TIM3_CR1_bit.CEN = 1;

Нету захвата. В даташите схема таймера. Тригер может быть запущен только с IC1 и IC2. Но судя по схеме, вроде есть возможность канал TI3 перенаправить в TI1 чтобы получить TI1F_ED или TI1FP1. Не могу понять, для этого нужно ещё какие-то биты прописывать? или TI3 по умолчанию прицеплен к TI1 через XOR?


ps Ну и если 2-ой ШИМ физически подан на ногу TIM3_CH4. Я так понял что автоматическое измерение праметров ШИМ не получится с это ноги?
SasaVitebsk
Это старый проект, локальный и тогда я использовал ещё библиотеку.
Это работает. (прости - просто выдирал куски из текста)

CODE
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* TIM2 CH2 pin: Вход ШИМ скорости */
GPIO_InitStructure.GPIO_Pin = TIM2_CH2_GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(TIM2_CH2_GPIO, &GPIO_InitStructure);


// Вход скорости
TIM_TimeBaseStructure.TIM_Period = 0xffffffff;
TIM_TimeBaseStructure.TIM_Prescaler = (CCLK / 100000) - 1; // 100kHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

/* Входы захвата: Ch1 */
// канал захвата 1 связать со входом Ch2 и сработка по нарастающему фронту
// Измерение периода
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;

TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);

/* Входы захвата: Ch2 */
// канал захвата 2 связать со входом Ch2 и сработка по спадающему фронту
// Измерение длительности ШИМ
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);

// Сброс и перезапуск таймера по каналу 1 (по нарастающему импульсу)
TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);


TIM_Cmd(TIM2, ENABLE);


использование

sPCANsKEY.sPCan21.bwSpeed = COEF_SPEED*TIM_GetCapture1(TIM2)/TIM_GetCapture2(TIM2);


Проблемы только если вообще частота перестаёт идти. В это время читается 0.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.