Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Чт апр 04, 2013 20:43:41

Здравствуйте. Недавно начал свое знакомство с 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); */
  }             
}

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

Чт апр 04, 2013 21:25:19

Код:
 TIM2->CR1 |= TIM_CR1_CEN;//Старт счета таймера
 wait(74000);
 
  while(1); // ????????????????????????
    
}

Работает как умеет... "согласно купленным билетам"...

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

Пт апр 05, 2013 09:31:43

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

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

Пт апр 05, 2013 09:43:24

Для начала после while(1) убрать точку с запятой.

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

Пт апр 05, 2013 15:24:26

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