PWM con salida en 4 pines de un pic desfasados entre ellos

Iniciado por xiruko, 17 Mayo 2013, 00:53 AM

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

xiruko

Buenas a todos,

necesito programar un pic para dar un PWM por hardware en 4 pines con los pulsos solapados entre ellos. algo asi que espero que se entienda:

salida 1: __-----_________
salida 2: ____-----_______
salida 3: ______-----_____
salida 4: ________-----___

el tema es que me han pedido que investigue si es posible hacerlo con el modulo EPWM de algun pic o sino con el modulo SMPS de algun dspic. con el EPWM he estado leyendo el datasheet y no parece que haya ningun modo de funcionamiento asi, pero nunca se sabe. por software ya me han dicho que no ya que entonces el micro no podria hacer apenas nada mas.

entonces pregunto.. alguien sabe si es posible hacerlo? y si es que si, me pueden dar alguna palabra clave o un tema especifico para buscarlo?

muchas gracias!

Firos

No entiendo muy bien qué es lo que quieres hacer pero por software no parece muy complicado.


De hecho, si tienes 4 salidas PWM es tan facil como configurar las 4, calcular un tiempo de estado lógico uno de... por ejemplo 1 segundo cada uno, y cuando uno lleve 60ms activar el otro.


Podrias hacerlo activando uno, haciendo un retardo de 60ms y activar el segundo, hacer un retardo de 60ms y activar el tercer; y asi sucesivamente, haciendo  un bluce de 5.


Un saludo.
El final del camino no está determinado, lo determinamos nosotros mismos paso a paso, día a día, y se puede cambiar.

xiruko

gracias por responder, pero como ya dije por software ya me han dicho que no lo haga, ya que con tanto retardo el micro no podria hacer nada mas.

el tema es si hay algun modo de funcionamiento por hardware que haga lo que he explicado. por ejemplo, igual que hay un modo half-bridge en el modulo EPWM, en el que tu lo configuras y te da la salida PWM por un pin y su complementaria por otro, sin necesidad de preocuparse de retardos ni nada.

me aconsejaron informarme sobre el modulo para el control de fuentes conmutadas (SMPS) de algun dspic, pero ya he estado buscando y no encontre nada, igual porque no usaba las palabras correctas. asi que a ver si alguien tiene alguna idea...

gracias igualmente!

skapunky

Por programación de software quizá gastes la capacidad de trabajo del micro haciendo retardos, pero piensa que los micros tienen temporizadores, como mínimo 2 o 3 que puedes configurar.

Mucha gente usa rutinas de tiempo mediante software..pero el úso de temporizadores es muy útil aunque claro...debes configurarlos.
Killtrojan Syslog v1.44: ENTRAR

xiruko

ya bueno pero es que ya me dijeron explicitamente que no lo hiciera por software asi que esa opcion esta completamente descartada.

con los temporizadores ya lo habia pensado, estoy con el pic18f458 que tiene 4 timers disponibles, aunque preferiria (si existiera) otra solucion ya que no se si luego tendre que usar alguno. bueno ya lo preguntare el martes y a ver que me dicen...

gracias por responder!

Firos

#5
Podrías hacer que se activaran por interrupción externa. Seguramente te habrán dicho que hagas eso con el módulo SMPS.

Haciendo una pequeña búsqueda he encontrado este: Viper50/SP: http://www.datasheetcatalog.org/datasheet/SGSThomsonMicroelectronics/mXyywxv.pdf

¿No te pide ningún tiempo de DUTY CYCLE?


Pues no es tan difícil... si el Viper50/SP te da una señal pulsatoria pues es tan fácil como hacerlo por interrupción externa, variación de puerto o flancos externos.

- Detecta señal externa.
- Aumenta contador (indica qué PWM activar).
- Compara para detectar qué PWM es.
- contador es = a 3 o 4? (ha llegado al final?) borrar contador
- goto hasta el que tengas que activar.
- Activa PWM.
- Sleep.


Aunque vamos... yo antes que usar un SMPS usaría un AOP (amplificador operacional) o una puerta lógica NAND con un condensador, una resistencia y un potenciómetro para hacer un circuito oscilador (el mismo efecto que conseguimos con el SMPS) y haciéndo un cálculo mínimo ajustarle la frecuencia al tiempo que tu quieras y voalá, ya tendríamos señal externa pulsatoria para generar las interrupciones externas.

:)



Un saludo!
El final del camino no está determinado, lo determinamos nosotros mismos paso a paso, día a día, y se puede cambiar.

xiruko

#6
Muchas gracias Firos, esto me será de gran ayuda. Me miraré bien estas dos alternativas a ver si puedo sorprender a mi jefe que ahora estoy en periodo de prueba... xD

Citar¿No te pide ningún tiempo de DUTY CYCLE?

Bueno no me han dicho nada sobre eso. Solo me dijo que quería los pulsos solapados, así que ya intentaré hacer algo para dejarlo en función de una variable.

CitarHaciendo una pequeña búsqueda he encontrado este: Viper50/SP

Como curiosidad, qué buscaste para dar con estos resultados? Porque estuve un rato poniendo cosas como "pwm phase shifted" ademas de "smps" y cosas así, y no encontré nada que me iluminara.

Gracias de nuevo!

edito:

CitarAunque vamos... yo antes que usar un SMPS usaría un AOP (amplificador operacional) o una puerta lógica NAND con un condensador, una resistencia y un potenciómetro para hacer un circuito oscilador (el mismo efecto que conseguimos con el SMPS) y haciéndo un cálculo mínimo ajustarle la frecuencia al tiempo que tu quieras y voalá, ya tendríamos señal externa pulsatoria para generar las interrupciones externas.

Pero a ver... el SMPS, no es más que un módulo ECCP mejorado no? Con más rapidez y precisión, y algunos modos de funcionamiento más. Entonces lo que tu me comentas de detectar interrupciones externas... Se haría el PWM por software o con el módulo SMPS? Quiero decir, al detectar la interrupción, tendría que ir cambiando los pines de salida para hacer los pulsos, o solo sería activarlo una vez y ya luego el módulo continuaría con el PWM?

No sé si me he explicado muy bien así que si necesitas que lo aclare un poco dímelo...

Un saludo!

Firos

#7
Mmmm a lo mejor no te he entendido del todo.


Tu lo que necesitas hacer es que el PIC que tienes genere 4 señales escalonadas por 4 PWM's distintos, ¿no?

Pues ahora, solo te falta definir cómo tiene que trabajar el PIC, si no quieres hacerlo por software para que el PIC no tenga "tanto trabajo" (que sigo pensando que ese trabajo es mínimo, puesto que si configuras los timers con interrupción puedes seguir haciendo otras cosas) pues tendrás que hacerlo de forma externa.

Para hacerlo de forma externa la única manera que se me ocurre ahora mismo es mediante impulsos externos, ya sea por una patilla de interrupción, o por una patilla de un puerto por variación o por detección de flanco.

Yo activaría las interrupciones externas en el PIC por la patilla X y me olvidaría de configurar nada más. De tal forma que cuando se detecte una variación en esa patilla saltase a una interrupción, desactivando uno de los PWM's y activando el siguiente y saldría de la interrupción. Salta otra interrupción, desactivas el PWM's activado anteriormente y conectas el siguiente (con una diferencia de menos de 1us trabajando a 8Mhz o menos si el PIC trabaja con más frecuencia). Y así en un bucle. En este caso el microprocesador esta completamente sin hacer nada, puesto que estarías esperando a una interrupción externa.


Exactamente no se como funciona un módulo SMPS... nos explicaron las fuentes conmutadas muy por encima pero el funcionamiento creo que era básicamente un circuito que se encargaba de conmutar (que creo que era el SMPS) la tensión de salida del puente recitificador, elevando la frecuencia, con lo que se conseguía perder menos potencia por el circuito conmutador que se calentaba menos.

Por esto he llegado a la conclusión de que si lo que quieres es un SMPS para generar una serie de "impulsos" que lleguen al PIC en forma de señal cuadrada para hacer lo anteriormente descrito, podrías hacerlo mejor con un circuito oscilador que te genere una señal cuadrada. Con una puerta NAND trigger schmitt, un condensador, una resistencia y un potenciómetro lo tienes hecho. De tal forma que no tienes que incluir el SMPS y es posible que ahorres dinero, peeeeeeeero, que siempre hay peros, el circuito oscilador requiere que le configures la señal manualmente y nunca será la misma en todos los dispositivos por temas de tolerancia. Es posible que el SMPS solucione esto. Así que... tu mismo :)


Si me pones exactamente cómo lo quieres hacer exactamente podría concretar más :)



Un saludo.



AÑADO:


Se me olvidaba!! La búsqueda que he hecho en Google ha sido: "fuentes conmutadas schematic smps". ¿Por qué?... Pues porque buscando sólo fuentes conmutadas salían fabricantes, con smps podían salirme referencias a cualquier cosa y poniendo esas cuatro palabras reduzco toda la busqueda a páginas donde haya un esquema de una fuente con un SMPS, en el cual habrá un componente con una referencia  :P .

Hay veces que al realizar búsquedas tienes que hacerlo especificando un poco "quién" y "cómo" lo expondría alguien explicándolo en alguna página. Si pones el nombre de algo muy concreto es posible que te de resultados de fabricantes y cosas así.
El final del camino no está determinado, lo determinamos nosotros mismos paso a paso, día a día, y se puede cambiar.

Meta

Hola:

Este es un ejemplo en asm y otro en C para el PIC16F886.

Código (asm) [Seleccionar]
Los módulos CCPx
;PWM mejorado. Se aplica sólo al generador PWM del módulo CCP1.
;
;El modo puente en H (Full-Bridge). Genera cuatro señales de salida para controlar las cuatro
;entradas típicas de un puente en H. En el modo directo la salida RC2/P1A se mantiene activa
;mientras que por RB4/P1D se obtiene la señal PWM. RB2/P1B y RB1/P1C se mantienen inactivas.
;En el modo inverso la salida RB1/P1C se mantiene activa mientras que por RB2/P1B se obtiene
;la señal PWM. RC2/P1A y RB4/P1D se mantienen inactivas.
;
;En el ejemplo se genera una señal PWM a partir de una tensión analógica por RA0/AN0. Mediante
;la entrada digital RA2 se controla el modo: a "0" modo directo, a "1" modo inverso del puente H.
;
;Con un osciloscopio de doble trazo podemos analizar las señales de salida: en RC2/P1A y RB4/P1D
;para el modo directo y en RB1/P1C y RB2/P1B para el modo inverso. También podríamos emplear un
;analizador lógico para visualizar simultáneamente las 4 señales. Nosotros hemos empleado el
;modelo PoScope Basic 2 en el modo analizador de funcionamiento.

List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración

Periodo equ .200 ;Valor para el periodo de 3200uS (200*Preescaler de 16)

Duty_H equ 0x20
Duty_L equ 0x21 ;Variable para la anchura de pulso

org 0x00 ;Vector de RESET
goto Inicio
org 0x05

;Programa principal

Inicio     bsf STATUS,RP0
bsf STATUS,RP1 ;Banco 3
movlw b'00000001'
movwf ANSEL ;RA0/AN0/C12IN0- entrada analógica, resto digitales
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;Banco 1

;RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D salidas PWM para el puente en H ("Full-Bridge")
movlw b'11101001'
movwf TRISB
movlw b'11111011'
movwf TRISC

;Configuración del ADC
clrf ADCON1 ;Alineación izda. Vref= VDD para el convertidor
bcf STATUS,RP0 ;Banco 0

;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.
movlw Periodo-1
bsf STATUS,RP0 ;Selecciona página 1
movwf PR2
bcf STATUS,RP0 ;Selecciona página 0

;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.
movlw b'00000111'
movwf T2CON ;TMR2 en On

;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
Loop movlw b'10000001'
movwf ADCON0 ;ADC en On, seleciona canal AN0
bcf PIR1,ADIF ;Restaura el flag del conversor AD
bsf ADCON0,GO ;Inicia la conversión

;Esperar el final de la conversión y leer el resultado
ADC_Wait_0 btfss PIR1,ADIF ;Fin de conversión ??
goto ADC_Wait_0 ;Todavía no
movf ADRESH,W
movwf Duty_H ;Registra valor actual para el periodo
bsf STATUS,RP0 ;Selecciona página 1
rrf ADRESL,F
rrf ADRESL,W
bcf STATUS,RP0 ;Selecciona página 0
andlw b'00110000'
movwf Duty_L ;Salva parte baja de la conversión

;El módulo CCP1 se configura en modo PWM en puente en H (Full-Bridge) con salidas por RC2/P1A,
;RB2/P1B, RB1/P1C y RB4/P1D. Los bits LSB se obtienen de la variable Duty_L

movlw b'01001100'
iorwf Duty_L,F
movwf CCP1CON ;Modo PWM directo para el módulo CCP1

;Si RA2=1 se selecciona el modo inverso
btfsc PORTA,2
bsf CCP1CON,P1M1

;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.

movf Duty_H,W
movwf CCPR1L

goto Loop

end ;Fin del programa fuente



En C de CCS:
/*
Los módulos CCPx
PWM mejorado. Se aplica sólo al generador PWM del módulo CCP1.

El modo puente en H (Full-Bridge). Genera cuatro señales de salida para controlar las cuatro
entradas típicas de un puente en H. En el modo directo la salida RC2/P1A se mantiene activa
mientrás que por RB4/P1D se obtiene la señal PWM. RB2/P1B y RB1/P1C se mantienen inactivas.
En el modo inverso la salida RB1/P1C se mantiene activa mientrás que por RB2/P1B se obtiene
la señal PWM. RC2/P1A y RB4/P1D se mantienen inactivas.

En el ejemplo se genera una señal PWM a partir de una tensión analógica por RA0/AN0. Mediante
la entrada digital RA2 se controla el modo: a "0" modo directo, a "1" modo inverso del puente H.

Con un osciloscopio de doble trazo podemos analizar las señales de salida: en RC2/P1A y RB4/P1D
para el modo directo y en RB1/P1C y RB2/P1B para el modo inverso. También podríamos emplear un
analizador lógico para visualizar simultáneamente las 4 señales. Nosotros hemos empleado el
modelo PoScope Basic 2 en el modo analizador de funcionamiento. */

#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT //Palabra 1 de configuración
#fuses NOWRT,BORV40 //Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

#use fast_io (B)
#use fast_io (C)

#define CCP_DELAY 100

int periodo=200; //Valor para el periodo de 3200uS (200*Preescaler de 16)

main()

//RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D salidas PWM para el puente en H ("Full-Bridge")
set_tris_b(0b11101001);
set_tris_c(0b11111011);

//Configura el ADC
setup_adc_ports(sAN0); //RA0 entrada analógica
setup_adc(adc_clock_div_32); //Ajusta frecuencia de muestreo del ADC

//El TMR2 trabaja con un preescaler 1:16 por lo que con una frecuencia de 4MHz evoluciona
//cada 16uS ((4*Tosc)*16)

setup_timer_2(T2_DIV_BY_16,periodo-1,1); //Carga el periodo y TMR2 en ON

while(1)
{
/* El módulo CCP1 se configura en modo PWM en puente en H (Full-Bridge) con salidas por RC2/P1A,
RB2/P1B, RB1/P1C y RB4/P1D. El modo directo o inverso se selecciona en función del estado de RA2 */

if(input(PIN_A2)==0)
setup_ccp1(CCP_PWM_FULL_BRIDGE|CCP_PWM_H_H); //RA1=0, Modo directo
else
setup_ccp1(CCP_PWM_FULL_BRIDGE_REV|CCP_PWM_H_H);//RA1=1, Modo inverso

//Se activa el ADC y se selecciona el canal RA0/AN0.

set_adc_channel(0); //Selección del canal 0 (RA0)
CCP_1_LOW=read_adc(); //Inicia la conversión y carga la anchura del pulso
}
}


Espero que te de algo de ideas.

Un saludo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

xiruko

@Firos

CitarPues ahora, solo te falta definir cómo tiene que trabajar el PIC, si no quieres hacerlo por software para que el PIC no tenga "tanto trabajo" (que sigo pensando que ese trabajo es mínimo, puesto que si configuras los timers con interrupción puedes seguir haciendo otras cosas) pues tendrás que hacerlo de forma externa.

No lo he probado, pero tratándose de que necesito una frecuencia del PWM de unos 50KHz y de que el micro trabaja a 40MHz (100 nsec/instrucción), si configurara los timers para cambiar los pines por la interrupción, el micro no pararía de entrar y salir de interrupciones. Además recuerda que dije que los pulsos deben estar solapados, por lo que en 20usec el micro debería entrar 8 veces en la rutina de interrupción para cambiar pines, y así a ojo la ISR tendrá unas 15-20 instrucciones entre contadores, cambios de pin, y otras instrucciones de control, así que los 20usec estarían casi exprimidos sin dejar al micro hacer mucho más.

CitarYo activaría las interrupciones externas en el PIC por la patilla X y me olvidaría de configurar nada más. De tal forma que cuando se detecte una variación en esa patilla saltase a una interrupción, desactivando uno de los PWM's y activando el siguiente y saldría de la interrupción. Salta otra interrupción, desactivas el PWM's activado anteriormente y conectas el siguiente (con una diferencia de menos de 1us trabajando a 8Mhz o menos si el PIC trabaja con más frecuencia). Y así en un bucle. En este caso el microprocesador esta completamente sin hacer nada, puesto que estarías esperando a una interrupción externa. [...]

Bueno esto sería complicado por el tema de que los pulsos deben estar solapados. Debería llevar algunos contadores para detectar cuando tengo que llevar un pin a alto y cuando debo llevarlo a bajo. Supongo que se podría hacer y es buena idea pero ya me han dicho que quieren evitar a toda costa el uso de circuitería de control externa al micro, así que... xD

En fin, ya me han dado otras tareas para hacer y me han dicho que me olvide de eso. De hecho ni ellos saben qué sistema van a implementar cuando en 1 mes y poco deben entregar el proyecto... Pero bueno, yo soy un mandado así que ellos sabrán.

Igualmente gracias por la ayuda, todo lo que pueda aprender mientras estoy de prácticas es más que bienvenido :D

@Meta

Te agradezco también la ayuda pero... No has leído el hilo verdad? xD

Si te fijas el programa que has puesto solo se parece a lo que había pedido porque salen las siglas PWM, pero por lo demás... Pero bueno gracias igualmente, supongo que a alguien le servirá.

Un saludo!