STM32F4 - выход ШИМ для управления сервоприводом

Итак, я пытаюсь переместить сервопривод с помощью платы обнаружения STM32F4. Мой код ниже.

Насколько я понимаю, все настроено правильно, но я не получаю никаких выходных данных на контакте PC6. Может ли кто-нибудь заметить, что я сделал неправильно / указать мне правильное направление?

Спасибо!

#include <stm32f4xx.h>
//#include "stm32f4xx_tim.h"

#define  RCC_APB1ENR_TIM3EN          ((uint32_t)0x00000002)


void delay (void)                   //create simple delay loop
{
int d;
for (d=0; d<10000000; d++);
}

int main (void)
{

    RCC->APB1ENR     = RCC_APB1ENR_TIM3EN;  //enable timer 3
TIM3->CR1       |= 0x81;                    //enable timer 1 = 10000001
//TIM3->CR2         |= 0x40;                                    //                              = 01000000
TIM3->PSC        = 0x48;                                //set prescale to 72
TIM3->ARR        = 0x4E20;                          //set auto reload to 20000
TIM3->CCER    |= 0x01;                              //set timer to output
TIM3->CCMR1     |= 0x68;                                //Set PWM mode 1 = 01101000


//timer 3 now set to 50hz

RCC->AHB1ENR        |= 0x05;                        //IO Port A and C clock enable  = 00000101

GPIOC->MODER        |= 0x400;                   //set PC6 as alternate function = 0000 0100 0000 0000
GPIOC->AFR[0]      = 0x02000000;            //Set AF to timer 3 = 0000 0010 0000 0000 0000 0000 0000 0000
GPIOC->OTYPER    = 0;                           //Set output as Push-Pull mode
GPIOC->OSPEEDR   = 0;                           //Set output speed 2MHz low speed
GPIOC->PUPDR       = 0;                             //Set no pull up and pull down

GPIOA->MODER        &= 0xfffffffc;          // Set Port a Bit 0 Active input
GPIOA->OTYPER    = 0;                           //Set output as Push-Pull mode
GPIOA->OSPEEDR   = 0;                           //Set output speed 2MHz low speed
GPIOA->PUPDR       = 0;                             //Set no pull up and pull down




while(1)
    {
            TIM2->CCR1 |= 0x28A;            //650us pulses
            delay();
            TIM2->CCR1 |= 0x73A;                //1850us pulses
            delay();
    }
}

person Joe of Loath    schedule 25.11.2014    source источник
comment
Если вам нужно было определить #define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002), вы наверняка делаете что-то очень неправильное. Остальное я не читал, в шапке куча #defines, поставьте туда именно для того, чтобы НЕ убивать других людей этими 0x05, 0x02000000 и тому подобным.   -  person Freddie Chopin    schedule 25.11.2014
comment
Так нас учили в наших встроенных модулях программирования, и когда я отправил свой код своему руководителю проекта, он его исправил.   -  person Joe of Loath    schedule 26.11.2014


Ответы (2)


Это нормально, если вы настраиваете TIM3, но изменяете _2 _...

TIM3->CR1       |= 0x81;
...
TIM2->CCR1 |= 0x28A;
person Freddie Chopin    schedule 25.11.2014
comment
Ой! Исправлено, по-прежнему нет: / - person Joe of Loath; 25.11.2014

Вы настроили выход на канал 2 таймера 3, установив значение:

TIM3->CCER    |= 0x01; 

для этого значения регистра CCER выход ШИМ будет на контакте PB8.

Чтобы получить выходной сигнал на выводе PC6, установите значение:

TIM3->CCER |= 0x1000;

а также, согласно документации, канал 1 TIM3 подключен к контактам PA6, PB4, PC6. Проверьте выход ШИМ на этих трех контактах.

person Koundinya    schedule 03.05.2015