реклама на сайте
подробности

 
 
> Вопрос по таймерам и прерываниям
CortexM3
сообщение Jan 11 2012, 15:39
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 11-01-12
Пользователь №: 69 293



Всем привет. Мне нужна Ваша подсказка - необходимо получить два ШИМ сигнала первый с частотой 2 Мгц, и второй с частотой 100кГц.
Для этого я хочу использовать TIM1 и TIM3. Максимум частоты что мне удалось получить из таймера 3 это 0.5Мгц вместо 2 Мгц (вообще мне надо еще больше до 10 Мгц)... Вопрос-больше то можно получить??sm.gif И как это сделать??

В проекте у меня четыре прерывания от уарта таймера 2 таймера 3 и таймера 1. Смотрю осциллографом в режиме отладки выходные сигналы. Сигнал с частотой 0.5 Мгц искажается, в нем импульсы исчезают в зависимости от частоты другого таймера.

Вопрос - как быть с прерываниями как сделать так чтобы они не влияли друг на друга?? Или есть иной способ сформировать подобные сигналы?
Контроллер stm32f103ret6. Частота 72 Мгц. частота шины на которой висит таймер 3 36 Мгц.
Заранее благодарен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
scifi
сообщение Jan 11 2012, 15:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(CortexM3 @ Jan 11 2012, 19:39) *
Максимум частоты что мне удалось получить из таймера 3 это 0.5Мгц вместо 2 Мгц (вообще мне надо еще больше до 10 Мгц)... Вопрос-больше то можно получить??sm.gif

Если таймер тактируется с частотой 36 МГц, то можно наружу вывести 18 МГц: 0-1-0-1-... Но в этом случае скважность регулировать не получится. Какие у вас там требования по скважности - неясно, телепатией не владею.

Цитата(CortexM3 @ Jan 11 2012, 19:39) *
В проекте у меня четыре прерывания от уарта таймера 2 таймера 3 и таймера 1. Смотрю осциллографом в режиме отладки выходные сигналы. Сигнал с частотой 0.5 Мгц искажается, в нем импульсы исчезают в зависимости от частоты другого таймера.

Формируем сигнал ШИМ при помощи прерывания таймера? Ужас какой. Это либо от безысходности, либо от незнания. Таймеры способны вырабатывать сигналы без участия процессора.
Go to the top of the page
 
+Quote Post
CortexM3
сообщение Jan 11 2012, 15:56
Сообщение #3





Группа: Новичок
Сообщений: 8
Регистрация: 11-01-12
Пользователь №: 69 293



Я пошел по известному пути. Наверное второе. Подскажите пожалуйста, заранее благодарен.

О! Вы мне скажите как это сделать. Насчет скважности не могу сказать - вещь экспериментальную делаю. Мне нужны довольно короткие "греющие" импульсы... Мне главное частоту вывести.

Сообщение отредактировал IgorKossak - Jan 11 2012, 17:58
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 11 2012, 16:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(CortexM3 @ Jan 11 2012, 19:56) *
Подскажите пожалуйста, заранее благодарен.

Нужно использовать режим PWM таймера. Вот пример из жизни для TIM1 (STM32F20x):

Код
/* DAC load pulse generator */
TIM1_ARR = 6 - 1; /* 20 MHz sample rate */
TIM1_CCR1 = 3; /* 50% duty cycle on PWM output CH1 */
TIM1_CCMR1 = 0x0068; /* PWM mode 1 on CH1 */
TIM1_EGR = 1; /* generate update event */
TIM1_CCER = 4; /* enable CH1N output */
TIM1_BDTR = 0x8000; /* main output enable */
TIM1_SMCR = 0x25; /* gated by TIM3 */
TIM1_CR1 = 0x0001; /* start timer */

Это если программировать регистры напрямую. Наверное, чаще программируют при помощи библиотеки ST standard library. Как там - не знаю.
Go to the top of the page
 
+Quote Post
CortexM3
сообщение Jan 11 2012, 16:05
Сообщение #5





Группа: Новичок
Сообщений: 8
Регистрация: 11-01-12
Пользователь №: 69 293



Обычно программирую из библиотеки. Спасибо большое попробую. О результатах сообщу.)

Сообщение отредактировал IgorKossak - Jan 11 2012, 17:58
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
CortexM3
сообщение Jan 12 2012, 15:27
Сообщение #6





Группа: Новичок
Сообщений: 8
Регистрация: 11-01-12
Пользователь №: 69 293



Здравствуйте ! Спасибо Вам scifi.
Заработало. Вот привожу код.
CODE

void TIM1_init (void)
{
u16 TIMCounter = 1200;// 2048
u16 TIMAutoreload = 34;// 34
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

TIM_TimeBaseStructure.TIM_Period = 1;// TIM1_ARR = 2
TIM_TimeBaseStructure.TIM_Prescaler = 1;//
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_GenerateEvent(TIM1, TIM_EventSource_Update);//TIM1_EGR = 1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//TIM1_CCMR1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;// TIM1_CCER = 4
TIM_OCInitStructure.TIM_Pulse = 30;// TIM1_CCR1 = 30
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
TIM_BDTRInitStructure.TIM_LOCKLevel = 0;
TIM_BDTRInitStructure.TIM_DeadTime = 0;// =value/(1/72mhz)
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

TIM_SetCounter(TIM1, TIMCounter);// Sets the TIM Counter Register value
TIM_SetAutoreload(TIM1, TIMAutoreload);
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}



Получился у меня 1 Мгц но мне кажется это подгон результатов...
НЕ совсем понятно как считать частоту таймера. Кажется все просто 72 Мгц делим на прескалер еще учитываем период и вот казалось бы тебе нужная частота... Но частотомер показывает совершенно иное... Я что то недопонимаю?

Заранее благодарен. С уважением.

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 15:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016