Autor Tema: módulo PWM - iluminacion Leds  (Leído 3579 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Steffi

  • PIC10
  • *
  • Mensajes: 6
módulo PWM - iluminacion Leds
« en: 30 de Octubre de 2008, 06:32:52 »

holas a todos una semanita más! (mi tercera con esto del pic)

una vez que ya he hecho el semaforo, variando la velocidad con el ADC, y sabiendo grabar datos en la eeprom.... quiero dar un pasito más.

quiero variar la intensidad de la iluminacion de mis 3 leds del semaforo..... mediante PWM.

se teoricamente lo que es el pWM, pero no muy bien como aplicarlo. y es que mediante otro potenciómetro, quiero ir variando el ancho de pulso. osea, el duty cicle este.... jejeje

todo con el pic que tengo a mano, el 16F886.

alguna ayudita o consejo? porfaaaaaaaaaa! ahora si que me vuelvo un poco loca porque esto se me complica

gracias de antemano!

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: módulo PWM - iluminacion Leds
« Respuesta #1 en: 30 de Octubre de 2008, 07:19:08 »
Hola Steffi, si pide ayuda porque nos no dice en que lenguaje?? y postea lo que tenga ya hecho.
Saludo

jacrmr

  • Visitante
Re: módulo PWM - iluminacion Leds
« Respuesta #2 en: 30 de Octubre de 2008, 07:27:42 »
Del ADC lee el valor y lo pasas al PWM. ¿o exactamente qué es lo que quieres hacer? ¿dmx, midi show control? ¿? Recuerda que los valores del PWM no corresponden a valores visuales de tus leds. Necesitas hacer una corrección de gama. Es decir, 8 bits de PWM no corresponde a 256 niveles de "grises" en los leds.

Desconectado Steffi

  • PIC10
  • *
  • Mensajes: 6
Re: módulo PWM - iluminacion Leds
« Respuesta #3 en: 30 de Octubre de 2008, 08:08:06 »
hola stk500! quiero programarlo en ensamblador con el MPLAB. posteo mas abajo mi programita. es un semaforo con el que mediante un potenciometro cambio la velocidad y guardo en la eeprom cuantas veces a pasado por "rojo". sin más.
ahora quiero con otro potenciómetro variar la intensidad.

es para probar el modulo pwm...estoy aprendiendo nada mas. para hacerlo mas simple, puedo hacer un programa nuevo desde cero donde solo veo el cambio de intensidad del color de los leds. una pregunta que tengo, es que los leds no los puedo cambiar de pin (me los dieron soldados ya a esos que tengo puestos) y he visto que la salida del PWM está en este pic en los pines 12 o 13.... que puedo hacer?


copio aqui el programita que tengo hecho hasta ahora (todavia no tengo NADA del pwm, porque no se ni como empezar):


   list P=16F886 ; indicamos el modelo de PIC que tenemos

#include "P16F886.inc"
 __CONFIG _CONFIG1, _MCLRE_OFF & _PWRTE_ON & _LVP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _FCMEN_OFF & _IESO_OFF
; registros


; constantes del programa

TIEMPO     equ 0x30         ; posicion de memoria
ampelstatus   equ   0x31      ; para las tablas
contador   equ   0x32


#define VERDE   PORTC,3      ; definicion de puertos (donde se colocan los leds)   
#define AMBAR   PORTC,6
#define ROJO   PORTB,6

#define K_TICKS_V    .200   ; Temporizaciones (ciclos) para verde,ambar y rojo
#define K_TICKS_A    .40
#define K_TICKS_R    .140
#define   adresseeprom   0xF0   ; dirección de la EEPROM donde escribimos el numero de ciclos

   org 0


; Accedemos al Banco 1
   
   bsf   STATUS,RP0   

; Configuración puertos

   movlw   0
   movwf   TRISC
   movlw   0x4            ; patilla RB2 cono entrada (analogica), el resto salidas
   movwf   TRISB   
   clrf   ADCON1         ; Resultado ADC en el registro AdresH y los 2 bits de menor peso en AdresL

; configuracion del timer

   movlw   b'01010111'     ; divisor preescalar = 256
   movwf   OPTION_REG

; Accedemos al Banco 0

   bcf   STATUS,RP0
   

;; A/D Converter
   
   movlw   b'11100001'      ; ADCON0 - Frec.RC, Entrada analogica por RB2(AN8), habilitar conversion
   movwf   ADCON0   

; Pongo a cero el puerto C
   clrf   PORTC
   clrf   contador

;***************************************************
;*  Inicio Programa Sencillo utilizando Subrutina  *
;***************************************************


inicio
   bsf   VERDE      ; Semaforo en Verde
   bcf   AMBAR
   bcf   ROJO
   bsf   ADCON0,1      ; comienza la conversion AD
   btfsc   ADCON0,1      ; y espera hasta que termine (borra el bit)
   goto   $-1   
   movlw   K_TICKS_V   
   call    pausa

   bcf            VERDE      ; Semaforo en Ambar
   bsf   AMBAR       
   bcf   ROJO
   bsf   ADCON0,1   
   btfsc   ADCON0,1
   goto   $-1   
   movlw   K_TICKS_A   
   call    pausa

   bcf   VERDE      ; Semaforo en Rojo
   bcf   AMBAR      
   bsf   ROJO
   incf   contador,1      ; contamos las veces que se ha puesto rojo
   call   escribir_eeprom   ; y lo escribimos en la EEPROM
   bsf   ADCON0,1   
   btfsc   ADCON0,1
   goto   $-1      
   movlw   K_TICKS_R   
   call   pausa
   

   bcf   VERDE      ; Semaforo en Ambar-Rojo
   bsf   AMBAR
   bsf   ROJO
   bsf   ADCON0,1      
   btfsc   ADCON0,1
   goto   $-1         
   movlw   K_TICKS_A   
   call   pausa

   goto    inicio      ; vuelve a inicio


;********************************
;*  Escribir Dato en la EEPROM  *
;********************************

escribir_eeprom

   bcf     STATUS,RP0      ;Seleccionamos Banco 2
   bsf     STATUS,RP1

   movlw   adresseeprom   ;Ponemos en W la dirección que vamos a escribir
   movwf   EEADR         ;y la guardamos en EEADR

   bcf   STATUS,RP1      ;Seleccionamos Banco 0

   movf    contador,w      ;Ponemos ahora el dato a escribir en W

   bsf   STATUS,RP1      ;Seleccionamos Banco 2

   movwf   EEDATA         ;y lo guardamos en EEDATA
   
   bsf   STATUS,RP0      ;Seleccionamos Banco 3
 
   bcf   EECON1,EEPGD
   bsf   EECON1,WREN      ;Colocamos el permiso de escritura (WREN) en EECON1 a 1
                           ;Aquí da inicio la secuencia de escritura

   movlw   0x55         ;Inicio de las intrucciones para EECON2
   movwf   EECON2
   movlw   0xAA       
   movwf   EECON2         ;Fin de las intrucciones para EECON2

   bsf   EECON1,WR      ;Comienza la escritura propiamente dicha.
   btfsc   EECON1,WR      ;esperar a que termine (10 ms)
   goto   $-1

   bcf     STATUS,RP0      ;cambiar a Banco 0
   bcf   STATUS,RP1   

   return




;**********************
;*  RUTINA DE ESPERA  *
;********************** 

pausa
                movwf   TIEMPO   ; guarda valor en memoria   
otro_tic
   movf   ADRESH,w      ; cargo el timer con el resultado de la conversión AD
   movwf      TMR0         
sigue   
   clrwdt
   btfss   INTCON,2      ; ¿desbordamiento ? INTCON register: bit 2 = timer0 overflow
   goto   sigue         ; no
                bcf   INTCON,2      ; si -> borro el flag
   decfsz   TIEMPO,1
   goto    otro_tic   
   return     

   END

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: módulo PWM - iluminacion Leds
« Respuesta #4 en: 30 de Octubre de 2008, 09:07:22 »
Hola Steffi!
para que tenga una idea aqui te pongo un link http://www.response-box.com/rgblights/2007code.shtml aunque ese pic no lo conozco creo que solo tiene 2 pwm y para hacerlos mas simple necesita un pic con 3 pwm.
Saludo