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

 
 
> STM32F429I-DISCO PWM Input Capture Mode
retterberg
сообщение Feb 29 2016, 09:33
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 29-02-16
Пользователь №: 90 657



STM32F429I-DISCO (STM32F429ZIT6U) + датчик угла наклона. Осциллографом вижу, что при 0 градусов идут импульсы с периодом 1кгц, и шириной около 0,5кгц. При изменении угла наклона, ширина имульса меняется. Используя даташит накидал код, представленный ниже. Занимаюсь с этим микроконтроллером две недели, да и вообще занимаюсь с микроконтроллерами две недели, да и радиоэлектроникой... Ну вы поняли. biggrin.gif
Мне не удается получить ширину импульса в CCR2, лишь его период в CCR1. В CCR2 чаще всего период, иногда проскакивают 0 или 1.
И ещё, почему то не могу обнулить ни один бит регистра SR, соответственно вот эти условия if (TIM2_SR & 2) и if (TIM2_SR & 4) не имеют никакого смысла.
Как же получить в CCR2 ширину импульса?
Очень нужна помощь. Уже хочется выть и биться головой об стену.
Код
#include "define.h" //адреса и значения регистров (не пользуюсь cmsis, hal)

volatile int up;
volatile int down;

void main(void){
  RCC_AHB1ENR |= RCC_AHB1ENR_GPIOA; //GPIOA clocking
  RCC_APB1ENR |= RCC_APB1ENR_TIM2; //TIM2 clocking

  GPIOA_MODER |= GPIOA_MODER_AF_P0; //GPIOA0 alternate function
  GPIOA_AFRL |= GPIOA_AFRL_AF1_P0 //GPIOA0 TIM2_CH1

  TIM2_PSC = 16-1; //Prescaler 16
  
  TIM2_CCMR1 |= TIM2_CCMR1_CC1S_0_1; //Select TI1 active input for TIM2_CCR1
  TIM2_CCER &= ~TIM2_CCER_CC1P &
               ~TIM2_CCER_CC1NP; //TI1FP1 rising edge

  TIM2_CCMR1 |= TIM2_CCMR1_CC2S_1_0; //Select TI1 active input for TIM2_CCR2
  TIM2_CCER |= TIM2_CCER_CC2P &
              ~TIM2_CCER_CC2NP; //TI1FP2 falling edge
  
  TIM2_SMCR |= TIM2_SMCR_TS_1_0_1; //Select TI1FP1 valid trigger input
  TIM2_SMCR |= TIM2_SMCR_SMS_1_0_0; //Reset mode
  
  TIM2_CCER |= TIM2_CCER_CC1E; //Enable the capture CC1            
  TIM2_CCER |= TIM2_CCER_CC2E; //Enable the capture CC2
  
  TIM2_DIER |= TIM2_DIER_CC1IE; //Enable the interrupt CC1
  TIM2_DIER |= TIM2_DIER_CC2IE; //Enable the interrupt CC2

  TIM2_CR1 |= TIM2_CR1_CEN; //Counter enabled
  
  NVIC_ISER0 |= NVIC_ISER0_TIM2; //TIM2 Interrupt
  
  while(1);
}

//обработчик прерывания (startup.c)
void interrupt(void){
        if(TIM2_SR & 2) up=TIM2_CCR1;
        if(TIM2_SR & 4) down=TIM2_CCR2;
        TIM2_SR = 0;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
retterberg
сообщение Mar 1 2016, 07:18
Сообщение #2





Группа: Новичок
Сообщений: 3
Регистрация: 29-02-16
Пользователь №: 90 657



Спасибо, как раз по "PWM input mode" reference manual'а я и делал. Ещё делал по примеру разработчика и по примерам из интернета. В этом коде тоже самое. Думаю, работать у меня не будет, CCR2 так и будет 0 или 1 (может быть что то с аппаратной, а не с программной частью?). Сейчас без таймеров буду реализовывать, прерывание, когда единичка на ножке и системным счетчиком определять длительность.
PS а где тут опечатка?)) все замечательно)
Код
TIM2_CCER |= TIM2_CCER_CC2P &
              ~TIM2_CCER_CC2NP; //TI1FP2 falling edge


Сообщение отредактировал retterberg - Mar 1 2016, 07:19
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 1 2016, 08:34
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(retterberg @ Mar 1 2016, 09:18) *
PS а где тут опечатка?)) все замечательно)

Если вы хотели написать
Код
TIM2_CCER |= TIM2_CCER_CC2P;
то да, замечательно wink.gif

Честно говоря я сомневаюсь, что вы будете переключать эти биты в процессе выполнения программы. Вероятнее всего такую настройку вы будете делать один раз в самом начале и тогда ее удобнее написать в таком виде:
Код
TIM2_CCER = 0
    | 0 * TIM2_CCER_CC4NP   // 0 - single edge, 1 - both edges
    | 0 * TIM2_CCER_CC4P    // 0 - rising edge, 1 - falling edge/both edges
    | 0 * TIM2_CCER_CC4E    // 0 - disabled, 1 - enabled
    | 0 * TIM2_CCER_CC3NP
    | 0 * TIM2_CCER_CC3P
    | 0 * TIM2_CCER_CC3E
    | 0 * TIM2_CCER_CC2NP
    | 1 * TIM2_CCER_CC2P
    | 1 * TIM2_CCER_CC2E
    | 0 * TIM2_CCER_CC1NP
    | 0 * TIM2_CCER_CC1P
    | 0 * TIM2_CCER_CC1E
;
Она и читается лучше, и править ее легче, и всем битам в ней присваивается конкретное значение, и в другой проект ее можно перетащить с минимальными правками.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 23:51
Рейтинг@Mail.ru


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