stm32f103c8t6: Problema en la generación de PWM en el canal de salida del temporizador

0

Mi objetivo es generar PWM con ciclo de trabajo = 50% , frecuencia = 50 Hz usando   Temporizador de propósito general 2 en el canal de salida 2 que está en PA1 o número de pin 11 Mi sistema objetivo es Placa de desarrollo STM32 BluePill

  • El controlador de destino es STM32F103C8T6 DISPOSITIVO DE DENSIDAD MEDIA
  • El cristal de la placa de destino es 8 MHz
  • Uso la versión de evaluación de Keil Micro vision 4 IDE para programación y depuración
  • Depurador: ST-LINK V2

Configuré el GPIOA en el modo Push Pull de salida de función alternativa con una frecuencia máxima que no supera los 50 MHz, conecté una bombilla LED al pin 1 de GPIOA, pero el LED siguió brillando sin reducción en el nivel de brillo. El LED aún estaba encendido incluso después de realizar una prueba con el ciclo de trabajo establecido en 0. En la ventana del depurador, pude ver exactamente todos los parámetros que configuré y el registro de conteo se fue incrementando. No puedo encontrar información sobre la selección de funciones alternativas para un puerto GPIO.

mi código:

/**************************** Header file *******************************/
#include<stm32f10x.h>

/*************************** user defined function **********************/

/************************************************************************
Name        : PWM_Init()
Description : Initializes PWM hardware and associated GPIO ports
              Enables clocks for peripherals and configure modes
Parameters  : None
Return_val  : None
************************************************************************/
void PWM_Init()
{

/****configure clocks for PORTA & TIMER2********/

  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;           // enable port a clock
  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;           // enable clock for timer 2

/*****  configure GPIOA mode *******************/

   /* Porta Pin 1 &2 as alternate function output Push pull 50 MHz */
    GPIOA->CRL = 0x000000bb;  

/*******Set timer 2 Period for PWM**************        
  Timer Clock                   = 72MHz = 72000000 Hz
  Time Period Required          = (1/50Hz) = 0.02 Seconds
  Let ARR value be 65535 then,
  Prescalar + 1                 = 72000000/((ARR+1)*50Hz)
  Prescalar                     = 21 (approx)   
***********************************************/

    TIM2->ARR = 65535;                      // Set Auto reload value
    TIM2->PSC = 21;                         // Set Prescalar value


    /* Output Compare Mode, ENABLE Preload,PWM  mode:2*/
    TIM2->CCMR1  = 0x00007800; 

    TIM2->EGR |= TIM_EGR_UG;       // ENABLE update generation

    /*CC2E : channel 2 enabled; polarity : active high*/         

    TIM2->CCER = 0x00000010;  

    TIM2->CR1 |= TIM_CR1_ARPE;      // Auto preload ENABLE
    TIM2->CR1 |= TIM_CR1_CEN;       // ENABLE Timer counter     

}
/**************Main Function**********************************/
int main()
 {  
    PWM_Init();                                  // initialize PWM

        while(1)
        {
            TIM2->CCR2  = 32768;                 // SET duty cycle to 50%
        }
  }

Tenga una vista de mi código fuente y notifíqueme las correcciones que deben hacerse. Las especificaciones de destino se mencionan en el código fuente.

Gracias

    
pregunta Rakesh Menon

1 respuesta

1

Finalmente, después de algunos experimentos descubrí lo que estaba mal, el problema no era realmente con el código, ya que configuré el modo PWM como Modo 2, el pulso es negativo en lugar de Positivo con PWM 1 . Así que la señal está realmente invertida . En el ciclo de trabajo establecido en '0', el pulso estará en la amplitud máxima y el LED brillará (con configuración alta activa), también debido al parpadeo rápido, la disminución de la intensidad no es claramente visible incluso en el ciclo de trabajo del 50%. Cambié el ciclo de trabajo a aproximadamente 80% -90% y conseguí que el LED se iluminara menos.

    
respondido por el Rakesh Menon

Lea otras preguntas en las etiquetas