7
GENERACION DE SEÑALES PWM 1. Control de servomotor * * control_servo.asm * * Created: 1/22/2015 5:37:22 PM * Author: jip */ .include "m164pdef.inc" .cseg .org 0x00 rjmp inicio .org 0x02 rjmp mover inicio: ldi r16,0b00010000 out ddrd,r16 com r16 out portd,r16 ;conf timer 1 ;cargo el valor para definir frecuencia de 50 Hz ldi r16,high(20000) sts ocr1ah,r16 ldi r16,low(20000) sts ocr1al,r16 ;cargo el valor para definir ancho de pulso de 0.3 ms (0 º ) ldi r16,high(300) sts ocr1bh,r16 ldi r16,low(300) sts ocr1bl,r16 ;configuracion timer com pwm, top OCR0A, PRESCALADOR DE 8 ldi r16,0b00100011 sts tccr1a,r16 ldi r16,0b00011010 sts tccr1b,r16 ;configuracion de interrupcion 0 con flanco de bajada ldi r16,0b00000010 sts eicra,r16 ldi r16,1 out eimsk,r16 out eifr,r16 sei lazo: rjmp lazo

Ejercicios en Clase Pwm

Embed Size (px)

DESCRIPTION

Ejercicios Pwm con microcontrolador Atmega 164P

Citation preview

Page 1: Ejercicios en Clase Pwm

GENERACION DE SEÑALES PWM

1. Control de servomotor

* * control_servo.asm * * Created: 1/22/2015 5:37:22 PM * Author: jip */ .include "m164pdef.inc" .cseg .org 0x00 rjmp inicio .org 0x02 rjmp mover inicio: ldi r16,0b00010000 out ddrd,r16 com r16 out portd,r16 ;conf timer 1 ;cargo el valor para definir frecuencia de 50 Hz ldi r16,high(20000) sts ocr1ah,r16 ldi r16,low(20000) sts ocr1al,r16 ;cargo el valor para definir ancho de pulso de 0.3 ms (0 º ) ldi r16,high(300) sts ocr1bh,r16 ldi r16,low(300) sts ocr1bl,r16 ;configuracion timer com pwm, top OCR0A, PRESCALADOR DE 8 ldi r16,0b00100011 sts tccr1a,r16 ldi r16,0b00011010 sts tccr1b,r16 ;configuracion de interrupcion 0 con flanco de bajada ldi r16,0b00000010 sts eicra,r16 ldi r16,1 out eimsk,r16 out eifr,r16 sei lazo: rjmp lazo

Page 2: Ejercicios en Clase Pwm

mover: com r17 brne cambiar ;cargo el valor para ancho de pulso de 0.3 ms (0º) ldi r16,high(300) sts ocr1bh,r16 ldi r16,low(300) sts ocr1bl,r16 rjmp salir cambiar: ;cargo el valor para ancho de pulso de 2.3 ms (180º) ldi r16,high(2300) sts ocr1bh,r16 ldi r16,low(2300) sts ocr1bl,r16 salir: reti

Page 3: Ejercicios en Clase Pwm

2. PWM de frecuencia variable con el timer 0 (con potenciometro) y delta variable (mediante pulsadores)

.include "m164pdef.inc" .def tempo=r16 .org 0x00 rjmp inicio .org 0x02 rjmp subir .org 0x04 rjmp bajar inicio: ldi tempo,0b0011000 out ddrb,tempo com tempo out portb,tempo clr tempo out ddrd,tempo com tempo out portd,tempo ;conf interrupciones ldi tempo,0b00001010 sts eicra,tempo ldi tempo,0b00000011 out eimsk,tempo ;configuracion timer 0 como PWM (la configuracion puede ser fast pwm o phase correcta) ldi tempo,0b00100001 ; PWM FASE CORRECTA (valor maximo 0cr0a) ; out tccr0a,tempo ;cargo valor inicial comparador A ldi tempo,20 out ocr0a,tempo ;cargo valor inicial comparador B ldi tempo,5 out ocr0b,tempo ldi tempo,0b00001010 ;PRESECALADOR DE 8 out tccr0b,tempo sei ldi r17,5 ;valor que voy a subir o bajar en el ocr0b sei ;CONFIGURACION ADC, JUSTIFICACION IZQUIERDA (8 BITS) ldi tempo,0b00000001 sts didr0,tempo ldi tempo,0b01100000 sts admux,tempo ;LAZO PRINCIPAL lazo: ldi tempo,0b11000010 sts ADCSRA,tempo

Page 4: Ejercicios en Clase Pwm

ESPERA: lds r27,adcsra sbrc r27,6 rjmp espera ;LECTURA DEL ADC ESCRIBO EN OCR0A (COMPARADOR A) lds r27,adch out ocr0a,r27 rjmp lazo subir: in r18,ocr0a subi r18,11 ;limito ancho de pulso, comparador B (no puede ser mayor al comparador A) in tempo,ocr0b cp tempo,r18 brcc salir add tempo,r17 out ocr0b,tempo salir: reti bajar: in tempo,ocr0b cpi tempo,6 brcs salir1 sub tempo,r17 out ocr0b,tempo salir1: reti

Page 5: Ejercicios en Clase Pwm

3. GENERACION DE DOS SEÑALES PWM CON EL TIMER 0, frecuencia 2Khz, usando los dos comparadores OCR1A (modifico con potencimetro) y OCRB (modifico mediante pulsadores) ; únicamente con pequeñas variaciones del código anterior

///pwm phase correcta de 2khz (2pwm), preescalador 8 y .include "m164pdef.inc" .def tempo=r16 .org 0x00 rjmp inicio .org 0x02 rjmp subir .org 0x04 rjmp bajar inicio: ldi tempo,0b0011000 out ddrb,tempo com tempo out portb,tempo clr tempo out ddrd,tempo com tempo out portd,tempo ;conf interrupciones ldi tempo,0b00001010 sts eicra,tempo ldi tempo,0b00000011 out eimsk,tempo ;configuracion timer 0 como PWM ldi tempo,0b10100001 ; PWM FASE CORRECTA out tccr0a,tempo ;cargo valor inicial comparador A ldi tempo,20 out ocr0a,tempo ;cargo valor inicial comparador B

Page 6: Ejercicios en Clase Pwm

ldi tempo,5 out ocr0b,tempo ldi tempo,0b00000010 ;PRESECALADOR DE 8 out tccr0b,tempo sei ldi r17,5 ;valor que voy a subir o bajar en el ocr0b sei ;CONFIGURACION ADC, JUSTIFICACION IZQUIERDA (8 BITS) ldi tempo,0b00000001 sts didr0,tempo ldi tempo,0b01100000 sts admux,tempo ;LAZO PRINCIPAL lazo: ldi tempo,0b11000010 sts ADCSRA,tempo ESPERA: lds r27,adcsra sbrc r27,6 rjmp espera ;LECTURA DEL ADC ESCRIBO EN OCR0A (COMPARADOR A) lds r27,adch ;esto es para limitar mi ancho de pulso (no es conveniente que sea la relacion de trabaja sea 1) cpi r27,245 brcc lazo cpi r27,5 ; limito ancho de pulso (no quiero que sea 0) brcs lazo out ocr0a,r27 rjmp lazo subir: ; in r18,ocr0a ; subi r18,11 ;limito ancho de pulso, comparador B in tempo,ocr0b cpi tempo,248 brcc salir add tempo,r17 out ocr0b,tempo salir: reti bajar: in tempo,ocr0b cpi tempo,6 brcs salir1 sub tempo,r17 out ocr0b,tempo salir1: reti

Page 7: Ejercicios en Clase Pwm