Генерация ШИМ разными таймерами

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
zwer97
Потрогал лапой паяльник
Сообщения: 340
Зарегистрирован: Сб янв 08, 2011 18:10:22
Откуда: Украина

Генерация ШИМ разными таймерами

Сообщение zwer97 »

Здравствуйте.
На stm32f051c8t6 генерирую ШИМ через TIM1 (advanced control) и TIM3 (general purpose) с абсолютно одинаковыми настройками. Но на пинах с TIM1 максимальное напряжение 2.5В, а на пинах с TIM3 только 0.5В. В интернете пишут, что разницы между ними не должно быть.
Подскажите пожалуйста в чем может быть проблема?
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Генерация ШИМ разными таймерами

Сообщение Мурик »

zwer97 писал(а):Подскажите пожалуйста в чем может быть проблема?
Неверное к коде.
Реклама
Аватара пользователя
zwer97
Потрогал лапой паяльник
Сообщения: 340
Зарегистрирован: Сб янв 08, 2011 18:10:22
Откуда: Украина

Re: Генерация ШИМ разными таймерами

Сообщение zwer97 »

Мурик писал(а):Неверное к коде.
Настройки абсолютно одинаковые в обоих случаях, как у GPIO так и у TIM.
Буду очень благодарен за помощь в поиске ошибки

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

#include "main.h"
#include "stm32f0xx.h"
#include <stdio.h>
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_usart.h"
#include <stm32f0xx_syscfg.h>

GPIO_InitTypeDef gpio;
static __IO uint32_t TimingDelay;

uint16_t Channel1Pulse = 0, Channel2Pulse = 0, Channel3Pulse = 0, Channel4Pulse = 0;

 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;


void Delay(__IO uint32_t nTime);
static void TIM_Config(void);
void step1(void);



static void TIM_Config(void)
{

  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA , ENABLE);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_2);
  
   RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);
  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_1);
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_1);
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
  
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = 1199;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 300;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  
   TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
   TIM_Cmd(TIM1, ENABLE); 
   TIM_CtrlPWMOutputs(TIM1, ENABLE);
  
   TIM_OC1Init(TIM3, &TIM_OCInitStructure);
   TIM_Cmd(TIM3, ENABLE);
   TIM_CtrlPWMOutputs(TIM3, ENABLE);
    
}



int main(void)
{
  TIM_Config();
  
  if (SysTick_Config(SystemCoreClock / 5000))
  { 
    /* Capture error */ 
    while (1);
  }

  while (1)
  {
  
  Channel1Pulse = 10;
  Channel2Pulse = 100;
  Channel3Pulse = 100;
  Channel4Pulse = 10;
  
        TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
         TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);
         TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;
        TIM_OC3Init(TIM1, &TIM_OCInitStructure);
        TIM_OC3Init(TIM3, &TIM_OCInitStructure);
         TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;
        TIM_OC4Init(TIM1, &TIM_OCInitStructure);
        TIM_OC4Init(TIM3, &TIM_OCInitStructure);
        
        GPIO_SetBits(GPIOB, GPIO_Pin_5);
        GPIO_SetBits(GPIOB, GPIO_Pin_4);
        Delay(500);
        
  Channel1Pulse = 119;
  Channel2Pulse = 1199;
  Channel3Pulse = 1199;
  Channel4Pulse = 119;
  
        TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
         TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;
       TIM_OC2Init(TIM1, &TIM_OCInitStructure);
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);
         TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;
        TIM_OC3Init(TIM1, &TIM_OCInitStructure);
        TIM_OC3Init(TIM3, &TIM_OCInitStructure);
         TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;
        TIM_OC4Init(TIM1, &TIM_OCInitStructure);
        TIM_OC4Init(TIM3, &TIM_OCInitStructure);       
  
        GPIO_ResetBits(GPIOB, GPIO_Pin_5);
        GPIO_ResetBits(GPIOB, GPIO_Pin_4);
        Delay(500);
        

    
  }
}

void Delay(__IO uint32_t nTime)
{ 
  TimingDelay = nTime;

  while(TimingDelay != 0);
}

void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}
Добавлено after 6 minutes 22 seconds:
Заметил, что если пишу большее значение в Pulse для TIM3 то напряжение растет. Хотя должно было бы работать одинаково на TIM1 и TIM3 с одинаковыми значениями :shock:

Добавлено after 2 hours 59 minutes 57 seconds:
Спасибо за помощь, проблема таки была в коде. Для TIM3 забыл прописать TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
:))
Ответить

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