Roteiro 12 EA870 2S2009

De DCA-Wiki

Contents

Roteiro 12 - Geração de onda digital PWM

  • Uso do periférico de geração de onda digital PWM

Agradecimentos

O desenvolvimento deste roteiro teve a grata contribuição de: Yuri Hayashi Isayama e Igor Kovacs Biscaia

Introdução ao Experimento de Hoje

  • O objetivo dessa experiência é conhecer as idéias básicas por trás da geração de onda digital PWM. Através da utilização do módulo PWM, objetiva-se verificar o funcionamento do controle de largura de pulso através de um osciloscópio e com auxílio dos leds da placa.

Roteiro de Estudos

  • 1. O que significa a sigla PWM? Explique sucintamente o funcionamento e a utilidade desta ferramenta.
  • 2. Cite e explique a função de cada um dos registradores ligados ao módulo PWM.
  • 3. Qual a diferença entre gerar um pulso com alinhamento à esquerda ou centralizado?
  • 4. Explique como são gerados os clocks A, B, AS e SB.
  • 5. Explique como é possível configurar o duty cycle.
  • 6. Explique brevemente como funcionam os timer counters do módulo PWM.
  • 7. O que ocorre quando o registrador PWMCTL está configurado para concatenar dois canais?

Roteiro da Aula

O programa abaixo deve ser executado no CodeWarrior. Este programa realiza a configuração básica do módulo PWM e gera uma onda que pode ser observada no led.

  • Observe no osciloscópio o funcionamento da onda. Note que a intensidade observada no led pode ser alterada mudando o valor no registrador PWMDTY (255 corresponde à intensidade mínima, enquanto 0, à intensidade máxima).

Programa PWM/main.c

#include "support_common.h"
#include "stdio.h"

/*Definições dos registradores do módulo PWM*/
#define PWME               0x401B0000
#define PWMPOL             0x401B0001
#define PWMCLK             0x401B0002
#define PWMPRCLK           0x401B0003
#define PWMCAE             0x401B0004
#define PWMCTL             0x401B0005
#define PWMCNT0            0x401B000C
#define PWMCNT6            0x401B0012
#define PWMPER(x)          0x401B0014 + (x)*0x1	//Ao utilizar outros canais, varie o X
#define PWMDTY(x)          0x401B001C + (x)*0x1 //na definicao dos ponteiros
#define PWMSCLA            0x401B0008
#define PWMSCLB            0x401B0009
#define PTCPAR             0x4010006F
#define PWMSDN             0x401B0024

int main()
	{
	//Definindo os apontadores
	uint8 *pwme = (uint8 *)PWME;
	uint8 *pwmpol = (uint8 *)PWMPOL;
	uint8 *pwmclk = (uint8 *)PWMCLK;
	uint8 *pwmprclk = (uint8 *)PWMPRCLK;
	uint8 *pwmcae = (uint8 *)PWMCAE;
	uint8 *pwmctl = (uint8 *)PWMCTL;
	uint8 *pwmcnt0 = (uint8 *)PWMCNT0;
	uint8 *pwmcnt6 = (uint8 *)PWMCNT6;
	uint8 *pwmper_0 = (uint8 *)PWMPER(0);	//Configuracao do canal 0
	uint8 *pwmdty_0 = (uint8 *)PWMDTY(0);	//Configuracao do canal 0
	uint8 *pwmper_6 = (uint8 *)PWMPER(6);	//Configuracao do canal 6
	uint8 *pwmdty_6 = (uint8 *)PWMDTY(6);	//Configuracao do canal 6
	uint8 *pwmscla = (uint8 *)PWMSCLA;
	uint8 *pwmsclb = (uint8 *)PWMSCLB;
	uint8 *ptcpar = (uint8 *)PTCPAR;
	uint8 *pwmsdn = (uint8 *)PWMSDN;
			

	*pwme = 0;			//Desabilita o módulo PWM
	*pwmctl = 0;		//Todas as saídas PWM são individuais
	*pwmcae = 0;		//Definido alinhamento à esquerda do pulso
	*pwmpol = 0xFF;		//Definida polaridade 1 (o pulso inicia em 1 em todos os canais)
	*pwmprclk = 0x11;	//Clock A gerado= clock do barramento interno dividido por 2. Idem para Clock B
	*pwmscla = 233;		//Divisão do clock A por 466
	*pwmsclb = 233;		//Divisão do clock B por 466
	*pwmclk = 65;		//Selecionado o clock SA para o PWM0 e o clock SB para o PWM6
	*ptcpar = 0xFF;		//Selecionada função terciária para PORT TC (habilita PWM0, PWM2, PWM4 e PWM6)
	*pwmdty_0 = 200;	//Seleção de duty cycle PWM0 (determina intensidade do led)
	*pwmper_0 = 255;	//Seleção do período PWM0
	*pwmdty_6 = 200;	//Idem para PWM6
	*pwmper_6 = 255;
	*pwmcnt0 = 0;		//Zerado o contador do PWM0
	*pwmcnt6 = 0;		//Zerado o contador do PWM6
	*pwmsdn = 0;		//Desabilita shutdown/interrupção do PWM
	*pwme = 65;		//Habilita as saídas PWM0 e PWM6

	while(1)
		{
		/*O programa é executado em um loop infinito*/	
		}	
}

Relatório

(Veja na página da disciplina, na opção calendário a data referente à entrega de cada relatório).

  • 1. Faça o fluxograma do programa exemplo tentando entende-lo.
  • 2. Implemente um programa em linguagem C que varie a intensidade luminosa de um dos leds da seguinte maneira: o led deve aumentar sua intensidade até atingir o máximo. Em seguida, deve diminuir a sua intensidade até apagar-se. Então, deve aumentar a intensidade até o máximo, e assim sucessivamente. Observe o comportamento do pulso gerado em um osciloscópio
  • 3. Faça outro programa, que permita que o usuário escolha a intensidade de um dos leds:
    • Utilizando a porta serial, o usuário irá digitar um número de 0 a 100. O término da digitação do número é indicado pela tecla “enter”;
    • Caso o usuário digite 0, a intensidade mostrada no led deve ser a mínima (correspondente a 0%). Se o usuário digitar 100, a intensidade deve ser máxima (correspondente a 100%). Caso o usuário digite 59, deseja-se que a intensidade do led corresponda a 59% da sua intensidade máxima;
    • Após o usuário fornecer uma entrada, a intensidade escolhida deve ser mostrada no led e o programa deve ficar esperando uma outra entrada.
  • 4. Faça o fluxograma do programa do exercício 3.

- Referências

Ferramentas pessoais