Autor
|
Tema: PWM con salida en 4 pines de un pic desfasados entre ellos (Leído 16,521 veces)
|
xiruko
Desconectado
Mensajes: 438
|
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!
|
|
|
En línea
|
|
|
|
Firos
Ex-Staff
Desconectado
Mensajes: 1.410
Enseña lo que sepas... y oculta lo peor...
|
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.
|
|
|
En línea
|
El final del camino no está determinado, lo determinamos nosotros mismos paso a paso, día a día, y se puede cambiar.
|
|
|
xiruko
Desconectado
Mensajes: 438
|
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!
|
|
|
En línea
|
|
|
|
skapunky
Electronik Engineer &
Colaborador
Desconectado
Mensajes: 3.667
www.killtrojan.net
|
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.
|
|
|
En línea
|
Killtrojan Syslog v1.44: ENTRAR
|
|
|
xiruko
Desconectado
Mensajes: 438
|
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!
|
|
|
En línea
|
|
|
|
Firos
Ex-Staff
Desconectado
Mensajes: 1.410
Enseña lo que sepas... y oculta lo peor...
|
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!
|
|
« Última modificación: 21 Mayo 2013, 16:06 pm por Firos »
|
En línea
|
El final del camino no está determinado, lo determinamos nosotros mismos paso a paso, día a día, y se puede cambiar.
|
|
|
xiruko
Desconectado
Mensajes: 438
|
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 ¿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. Haciendo 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: 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. 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!
|
|
« Última modificación: 21 Mayo 2013, 15:11 pm por xiruko »
|
En línea
|
|
|
|
Firos
Ex-Staff
Desconectado
Mensajes: 1.410
Enseña lo que sepas... y oculta lo peor...
|
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 . 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í.
|
|
« Última modificación: 21 Mayo 2013, 16:06 pm por Firos »
|
En línea
|
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. 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.
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
@Firos 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. 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. 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. [...] 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 @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!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
telnet, vb y una comunicacion entre ellos
Programación Visual Basic
|
sorcerer
|
3
|
3,212
|
7 Julio 2005, 06:25 am
por sorcerer
|
|
|
Adaptar ventilador 2 pines a regulador de 3 pines,reducir velocidad y ruido
Hardware
|
Anonymous250
|
2
|
8,016
|
14 Noviembre 2011, 16:57 pm
por Anonymous250
|
|
|
cambiar conector Placa madre 9 pines a 19 pines USB3.0
Hardware
|
polakeirus
|
1
|
6,362
|
27 Octubre 2012, 04:06 am
por _Slash_
|
|
|
Programa que elige el mayor complejo de un array de ellos. Fallo de salida
Programación C/C++
|
NikNitro!
|
4
|
2,840
|
10 Febrero 2013, 19:00 pm
por NikNitro!
|
|
|
IDEs y editores: ¿qué diferencias hay entre ellos a la hora de escribir código?
Noticias
|
wolfbcn
|
0
|
1,796
|
19 Diciembre 2016, 19:32 pm
por wolfbcn
|
|