РАБОТА С ШИМ на STM32VLDiscovery

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Родился
Сообщения: 5
Зарегистрирован: Чт апр 04, 2013 20:34:59

Сообщение Человек Панда »

Здравствуйте. Недавно начал свое знакомство с STM32 , решил сгенерировать пилу с помощью ШИМ. На осциллографе наблюдается импульс со скважностью,заданной в начале TIM2->CCR2 =3000; В коде программы меняю это значение,но скважность не меняется.Подскажите,пожалуйста,что я делаю не так. Смотрел исходники, использую все те же настройки.

Код: Выделить всё

#include "stm32f10x.h"

void wait(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}

int main(void)
{
  /*Инициализация GPIOA.
  Вывод PA1 настраивается для работы с выходом TIM2_CH2*/
 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //Тактирование порта GPIOA
 RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;//Тактирование альтернативных функций
 
 /*НАСТРОЙКА ЧАСТОТЫ*/
 GPIOA->CRL |= GPIO_CRL_MODE1_0;//1
 GPIOA->CRL |= GPIO_CRL_MODE1_1;//1	  11: Максимальная скорость порта = 50 MHz 
 
 /*НАСТРОЙКА РЕЖИМА РАБОТЫ*/
 GPIOA->CRL &= ~GPIO_CRL_CNF1_0;//0
 GPIOA->CRL |=  GPIO_CRL_CNF1_1;//1   10: Выход Push-Pull в режиме альтернативной функции
 
 /*Инициализация таймера TIM2 Для формирования сигнала ШИМ используется канал 2 (TIM2_CH2)*/
 RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;//Тактирование таймера TIM2
 TIM2->CR1 |= TIM_CR1_ARPE;//Включен режим предварительной записи регистра автоперезагрузки
 TIM2->CCMR1 |= TIM_CCMR1_OC2PE;//Включен режим предварительной загрузки регистра сравнения
 TIM2->CCMR1 |= (TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1);// 110 - PWM mode 1
 
 /*ЧАСТОТА ТАЙМЕРА 24 MHz*/

 TIM2->ARR = 6000;//Период выходного сигнала T = 6mS
 TIM2->CCR2 =3000;//Длительность импульса. В данном случае Duty cycle = 50%
 TIM2->CCER |= TIM_CCER_CC2E;//Выход канала захвата/сравнения включен
 TIM2->CR1 |= TIM_CR1_CEN;//Старт счета таймера 
 wait(74000);
 
  while(1);
  {	  if ((TIM2->ARR)<=(TIM2->CNT)) {	TIM2->CCR2 = 1332;
  										TIM2->CNT=0;}
wait(74000);
TIM2->ARR = 6000;//Период выходного сигнала T = 6mS
 TIM2->CCR2 =3000;//Длительность импульса. В данном случае Duty cycle = 50%
 TIM2->CCER |= TIM_CCER_CC2E;//Выход канала захвата/сравнения включен
 TIM2->CR1 |= TIM_CR1_CEN;//Старт счета таймера 
	//TIM2->CCR2 = 1332;
    wait(74000);
	//TIM2->CCR2 =3000;
	wait(74000);
	/*
	(TIM2->CNT)=(TIM2->CNT)*0; 
	TIM2->CCR2 = 1992;
	wait(74000);
	/*	
	TIM2->CCR2 =2664 ;
	wait(74000);
	
	TIM2->CCR2 =3324 ;
	wait(74000);
	
	TIM2->CCR2 =4656 ;
	wait(74000);
	TIM2->CCR2 =3996 ;
	wait(74000);
	TIM2->CCR2 =5328 ;
	wait(74000);
	TIM2->CCR2 =5999 ;
	wait(74000);
	TIM2->CCR2 =0 ;
	wait(74000); */
  }				  
}
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Код: Выделить всё

 TIM2->CR1 |= TIM_CR1_CEN;//Старт счета таймера 
 wait(74000);
 
  while(1); // ????????????????????????
	  
}
Работает как умеет... "согласно купленным билетам"...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Родился
Сообщения: 5
Зарегистрирован: Чт апр 04, 2013 20:34:59

Сообщение Человек Панда »

А можно поподробнее? Мне кажется,что все ошибки выползают из-за регистра ARR ,включен режим сравнения с содержимым CNT. Может CNT просто доходит до ARR и не обнуляется? Осциллографа нет,но пробовал следующее:проверял потенциал на выходе вольтметром(цикл закомментировал).Сегодня попробую поставить ARR сначала в 6000,потом сделать задержку и поменять в 3000.если на выходе увижу падение с 5В до 2.5, то значит дело в цикле while. Хотя все же думаю ошибка при сравнении ARR с CNT (хотя ARPE включен). Очень нужна ваша помощь.
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Сообщение srg320 »

Для начала после while(1) убрать точку с запятой.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 5
Зарегистрирован: Чт апр 04, 2013 20:34:59

Сообщение Человек Панда »

Спасибо всем.Именно это и было ошибкой. Привязал время задержки к TIM1,так что сейчас все стало работать
Реклама
Ответить

Вернуться в «ARM»