domingo, 8 de septiembre de 2013

PWM en la STM32F0Discovery

Siguiendo el orden natural, una vez hemos visto como utilizar los temporizadores de los Cortex M0 que montan las placas discovery, lo siguiente que podemos aprender es a generar una señal de modulación de ancho de pulso (PWM). 
Como ocurre en todos los microcontroladores, las señales PWM van muy ligadas a los temporizadores, ya que son estos los que generan la base de tiempos, que luego se convertirá en nuestra frecuencia de conmutación. Sobre la rampa imaginaria que generan los temporizadores al ir incrementando la cuenta, se deslizan hasta 4 comparadores en los Cortex M0, dependiendo del temporizador que escojamos. El número de comparadores del que dispone cada timer lo podeis ver en la tabla de la entrada anterior.
El procedimiento para empezar a generar señales PWM es muy sencillo, lo primero que debemos hacer es configurar el temporizador, de forma que el periodo de este se corresponda con nuestra frecuencia deseada de conmutación del PWM, además de decirle que el temporizador funcionará en modo PWM. Una vez configurado, debemos habilitar en primer lugar el uso de comparadores y luego habilitar el comparador que vayamos a utilizar, de forma que quede así:
TIM3->PSC = 47;
TIM3->ARR = 100;
TIM3->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3PE;
TIM3->CCER = TIM_CCER_CC3E;
TIM3->CR1 |= TIM_CR1_CEN;
Una vez configurado mediante el registro CCR3 establecemos el punto de comparación. En el siguiente vídeo podeis ver el proceso completo, además de como utilizar el depurador de Keil uVision.

Y a continuación teneis el código completo que he desarrollado en el vídeo.
/=============================================================================
// Autor: P.Trujillo
// mipsandchips.blogspot.com.es
// Generación de señal PWM en la placa STM32F0Discovery
//=============================================================================
 
#include "stm32f0xx.h"
 
//=============================================================================
// aux functions
//=============================================================================


//=============================================================================
// global vars
//=============================================================================
int dc = 50;

//=============================================================================
// main function
//=============================================================================
int main(void)
{ 
   
  RCC->AHBENR |= RCC_AHBENR_GPIOCEN ; //Habilitamos el reloj para el puerto C
 RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; //Habilitamos el reloj para el timer 3
  
  GPIOC->MODER = GPIO_MODER_MODER8_1; //Puerto C8 como salida PWM
  
 TIM3->PSC = 47;
 TIM3->ARR = 100;
 TIM3->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3PE;
 TIM3->CCER = TIM_CCER_CC3E;
 TIM3->CR1 |= TIM_CR1_CEN;
 
 TIM3->CCR3 = 50;
 
  while (1) {
    
  TIM3->CCR3 = dc;
      
  }
}

No hay comentarios:

Publicar un comentario