Dificuldade com PWM

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Dificuldade com PWM

Mensagempor lipesh » 22 Jan 2008 19:20

Pessoal, sou ainda novo na progrmação de AVR, e estou tentando fazer o PWM funcionar, mas sem muito sucesso... Quando tento colocar um valor em OCR0A ou OCR0B, nada acontece... Segue abaixo o código que fiz para testes...


.include "m88def.inc"

.def W=R16
.def TEMPO0=R17
.def TEMPO1=R18
.def D1=R19
.def D2=R20

.org 0x00
RJMP CONFIG

;---------------------------------------------------------------------
; CONFIGURAÇÕES INICIAIS PARA O PROGRAMA

CONFIG:
LDI W,0b11111111 ;CONFIGURA PORTD COMO SAÍDA
OUT DDRD,W ;PD5 E PD6 SÃO AS SAIDAS PWM

;CONFIGURAÇÃO DE TIMER0 PARA OPERAR COMO "NON-INVERTING FAST PWM",
;COM PRESCALER 1:8 E DOIS CANAIS (0A E 0B)
LDI W,0b10100011
OUT TCCR0A,W
LDI W,0b00000010
OUT TCCR0B,W

RJMP INICIO

;---------------------------------------------------------------------

INICIO:
CLR W
CLR D1
CLR D2
LOOP:
LDI W,0b10000000 ;CARREGA W COM O VALOR 128
;RCALL DELAY_MS ;CHAMA DELAY PROPORCIONAL À "W"

DEC D1 ; AUMENTA DUTY DO CANAL A
OUT OCR0A,D1 ; (*) DUTY CANAL A -> OCR0A

INC D2 ; AUMENTA DUTY DO CANAL B
OUT OCR0B,D2 ; (*) DUTY CANAL B -> OCR0B

RJMP LOOP

;---------------------------------------------------------------------

DELAY_MS:
MOV TEMPO1,W ; CARREGA TEMPO1
DEL_INI:
LDI W,250
MOV TEMPO0,W ; CARREGA TEMPO0
NOP_INI:
NOP
NOP
NOP
NOP
DEC TEMPO0
IN W,SREG
SBRS W,1 ; FIM DE TEMPO0 ?
RJMP NOP_INI ; NÃO - VOLTA
; SIM
DEC TEMPO1
IN W,SREG
SBRS W,1 ; FIM DE TEMPO1 ?
RJMP DEL_INI ; NÃO - VOLTA
; SIM
RET ; RETORNA
include "Dominar_o_AVR.asm"
lipesh
Bit
 
Mensagens: 6
Registrado em: 03 Jan 2007 19:47

Mensagempor zurca1599 » 23 Jan 2008 19:08

Se bem percebo queria que na porta D aparecessem os sinais correspondentes .

Mas no seu programa não tem instrução para activar e desactivar os pinos da porta D , apenas a configuração como saídas .

Alco como :

out PortD, ........
zurca1599
Bit
 
Mensagens: 31
Registrado em: 08 Jan 2007 14:47

Mensagempor lipesh » 23 Jan 2008 23:17

Mas isto é necessário ? Pelo que eu entendi, os "matches" do contador do timer0 e do OCR0 seriam responsáveis por ativar a saída... Além disso o problema não é exatamente com a saída, e sim com o OCR0A e OCR0B, nos quais não consigo escrever valor algum...

Tentei o mesmo programa com o timer2, com a exceção da instrução OUT cujo range não alcança os OCR2A e OCR2B, e no lugar de OUT usei STS. Com este programa sim deu tudo certo, funcionou de primeira sem problema algum...

Tentei usar o STS com o programa do timer0, com os OCR0A e OCR0B, mas também não funcionou...

Agora que eu ainda estou curioso para saber por que não consegui escrever no OCR0A e OCR0B e consegui nos OCR2A e OCR2B, ah, isso estou !
include "Dominar_o_AVR.asm"
lipesh
Bit
 
Mensagens: 6
Registrado em: 03 Jan 2007 19:47

Mensagempor zurca1599 » 25 Jan 2008 00:42

Experimente alterar o valor de

LDI W,0b00000010
OUT TCCR0B,W

para

LDI W,0b00001010 ==> WGM02=1 (WGM01,WGM00 já tem a 1)
OUT TCCR0B,W

veja este ponto do datasheet

14.7.3Fast PWM Mode

The counter counts from BOTTOM to TOP then restarts from BOT-
TOM. TOP is defined as 0xFF when WGM2:0 = 3, and OCR0A when WGM2:0 = 7
zurca1599
Bit
 
Mensagens: 31
Registrado em: 08 Jan 2007 14:47

Mensagempor gafar » 20 Mar 2008 00:49

Zurca1599,
Usei esta rotina para gerar pulsos para 2 servos.
Para vc recarregar o valor de OCR1A/B use TCCR1A =0
ICR1 é o período total e OCR1A e B é o tempo do sina em nível 1 nas saidas OC1A e OC1B. O clock é 8Mhz.

OC1A, OC1B outputs
DDRB |= (1<<PB1)|(1<<PB2); //instead of (1<<PB4)|(1<<PB3);
// TOP, set for 50Hz (20ms)
ICR1 = 20000;
// Center outputs (1.5ms)
OCR1A = 1500;
OCR1B = 1500;
// Timer 1 fast PWM mode 14
// Clear on compare, set at TOP
// /8 prescaler
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS11);
Avatar do usuário
gafar
Bit
 
Mensagens: 26
Registrado em: 23 Out 2006 08:07
Localização: São Paulo SP


Voltar para AVR

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x