Reloj Analógico POV

Si te encuentras diseñando, desarrollando o construyendo un proyecto y tienes complicaciones, en este sub-foro podemos ayudarte. Aquí ingresa con los temas que no puedas ubicar dentro de otros sub-foros, por ejemplo, Radio, Microcontroladores, Software, etc. Cuando algo no funciona, de este sub-foro sale en marcha.

Moderador: HJ

Reloj Analógico POV

Notapor elgarbe » Dom Jun 09, 2013 8:53 pm

Buenas, si bien aún no hemos tenido problemas con este proyecto, seguramente lo tendremos, por lo que voy a ir mostrando los avances en este proyecto aquí.

La idea es armar algo similar a esto:


pero más grande, o algo como este otro:


se me caen las babas!!!!

Este se controla remotamente con una linterna :shock:


En fin, hay cientos dando vuelta por ahí.

Como cálculos iniciales tenemos:
El Radio será de 200mm, por lo que el perímetro será de pi x D = 1256mm
La separacion de los led será de 5mm, usaremos led superficiales, son los denominados 3528 (por su tamaño)
Si suponemos que el pitch radial será el mismo que el axial, entonces tendremos 1,43° por cada cambio o por cada "rayo" y la cantidad de pixeles axiales será 251.

Bien, el motor gira a (cerca de) 3000RPM, por lo que tendremos 50RPS y cada revolucion tardará 20mSeg.
Si tengo 251 pixel en forma axial, el tiempo de cada uno es 79uSeg. O sea que en 79uSeg debemos enviar los 40bits a los 5 74HC595. Tenemos aproximadamente 2uSeg por cada bit... parece que el tiempo sobrará.

Bueno, el esquemático de la parte de los registros y los led es el siguente:
Imagen

El PCB lo voy avanzando y por ahora está así:
Imagen

Bueno, a medida avancemos ire mostrando avances y consultando...

Saludos!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: Reloj Analógico POV

Notapor elgarbe » Vie Jun 21, 2013 10:21 pm

Bien, esta semana hemos estado armando la placa con los LED y los registros de desplazamiento. Aprovechando para dar la teoría y ver en el osciloscopio la salida del reloj y datos del SPI del micro, como para ir entrando en tema.

La placa va quedando más o menos así:

Imagen
Imagen
Imagen

Como se ve hemos usado LED superficiales 3528, separados 5mm uno de otros, con 5 registros podemos usar 40 LED en una tira de 20cm.

Este es el código que he estado acomodando, gracias a los consejos de Javier, para ir testeando los tiempos y detectando problemas:

Código: Seleccionar todo
/*
 * File:   main.c
 * Author: elgarbe
 *
 * Created on 12 de junio de 2013, 19:01
 *
 * Programa para realizar un POV tipo reloj analógico
 * En la INT externa tengo la señal del sensor infrarrojo de vuelta
 * Con el TMRX computo el tiempo entre INT externa y calculo las RPM, con ese
 * dato y la resolucion del sistema calculo el tiempo de actualizacion o tiempo
 * entre 2 radios sucesivos. Ese valor es el que se carga en el TMRX.
 * El TMRX me interrumpe cuando debo actualizar la tira de led.
 */

#define _XTAL_FREQ 8000000 // Indicamos a que frecuencia de reloj esta funcionando el micro
//Funciones para delay's. No son muy precisas por lo que vi en el osciloscopio
//REVISAR
#pragma intrinsic(_delay)
extern void _delay(unsigned long);
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>         // Librería XC8. Este include termina incluyendo al 16F883.h
//#include <delays.h>     // Para utilizar demoras en nuestro código debemos incluir la librería delays.h.

//Includes locales, configuracion de fusibles y del IO
#include "configuracion_de_fuses.c"
#include "configuracion_hard.c"

//bit flagToggleFlanco=0;      // Flag para cambiar de flanco
int data[5] = {0,0,0,0,0};

/********** Funcion para la ISR (Rutina de Servicio de Interrupcion) **********/
void interrupt interrupciones (void) {
    //Verifico que interrupcion se disparó
    if (TMR0IE && TMR0IF){      // se verifica si la interrupcion es por TMR0
        TMR0IF = 0;             // Pongo en 0 el Flag de interrupcion del TMR0
    }
}
/* el resto de las interrupciones utilizadas se deben analizar a coninuacion*/


/*------------------------DECLARACION DE FUNCIONES---------------------------*/

void conf_oscilador (void); // Configuracion del oscilador
void conf_puertos (void);   // Configuracion de puertos I/O
void conf_timer0 (void);    // Configuracion registros TIMER0
void conf_timer1 (void);    // Configuracion registros TIMER1
void conf_spi (void);       // Configuracion registros SPI
void send_5_byte(void);

/*************************** Programa Principal ******************************/
 void main(void) {
    conf_oscilador ();
    conf_puertos ();
    conf_timer0 ();
    conf_timer1 ();
    conf_spi();

    INTCONbits.TMR0IE = 0;      // Habilito interrupcion por TMR0
    SSPIF = 0;                  // Borro el flag de interrupcion de SPI
    INTCONbits.PEIE = 0;
    PIE1bits.SSPIE = 0;         // Deshabilito interrupciom por SPI
    INTCONbits.GIE = 1;         // Habilito Interrupcion Global

    /*-------------------------- Bucle infinito ------------------------------*/
    int i;
    do{
        for(i = 1; i<255; i*=2){
            data[0] = i;
            data[1] = i;
            data[2] = i;
            data[3] = i;
            data[4] = i;
            send_5_byte();
            __delay_ms(100);
        }
    }while(1);
}


/*------------------------------FUNCIONES------------------------------------*/

/* Funcion para la configuracion del oscilador del pic16f88 */
void conf_oscilador (void) {

    OSCCONbits.IRCF2 = 1;
    OSCCONbits.IRCF1 = 1;   // IRCF <2:0> = 111 setea Fosc 8MHz
    OSCCONbits.IRCF0 = 1;   // IRCF <2:0> = 110 setea Fosc 4MHz

    OSCCONbits.SCS = 0; /* SCS = 0 Modo del oscilador definido por
                         * FOSC <2:0> en #pragma config FOSC = INTOSCIO */
}
/* Funcion para la configuracion de los puertos entrada salida del pic 16f88 */
void conf_puertos (void) {

    ANSEL=0x00;         //Todos entrada/salida digitales - Puerto A.
    ANSELH=0x00;        //Todos entrada/salida digitales - Puerto B.
    TRISA=0x00;    //Todos como SALIDA-
    TRISB=0XFF;      //Todos como ENTRADA.
    TRISC=0X00;      //Todos como SALIDA-
    PORTC=0;
    PORTA=0;
}

/* Funcion para la configuracion del modulo Timer0 como temporizador */
void conf_timer0 (void) {

    // Configuración del timer 0. Con Osc de 4MHz la frecuencia de entrada del TMR
    // es 1MHz, con el prescaler en 256 tenemos una cuenta cada 256uSeg. Al ser
    // de 8 bits tenemos interrupcion cada 65,535 mSeg.
    TMR0 = 0;
    OPTION_REGbits.PS0 = 1;
    OPTION_REGbits.PS1 = 1;
    OPTION_REGbits.PS2 = 1;     //Prescaler en 256
    OPTION_REGbits.PSA = 0;     //Prescaler al TMR0 y no al WDT
    OPTION_REGbits.T0CS = 0;    //Clock Source es el Ciclo de Instruccion
}

/* Funcion para la configuracion del modulo Timer1 como temporizador */
void conf_timer1 (void) {

    // Configuración del timer 1. Con Osc de 4MHz la frecuencia de entrada del TMR
    // es 1MHz, con el prescaler en 1 tenemos una cuenta cada 1uSeg. Al ser
    // de 16 bits tenemos interrupcion cada 65,535 mSeg.
    // El timer 1 se usa como base de tiempos de CCP2
    TMR1 = 0;
    T1CONbits.T1CKPS = 0x00;    //Prescaler en 2 -> XX00
    T1CONbits.TMR1ON = 1;       //Enable Timer1
}

/* Funcion para la configuracion del modulo SPI como Master */
void conf_spi(void){

    SSPCONbits.SSPEN = 0;   // Deshabilitamos el modulo SPI
    SSPSTATbits.CKE = 1;    // Para elegir Modo 2
    SSPCONbits.CKP = 1;     // Para elegir Modo 2
    SSPCONbits.SSPM = 0;    // Velocidad = Fosc/4
    SSPCONbits.SSPEN = 1;   // Habilitamos el modulo SPI
}

/* Funcion para la configuracion del modulo SPI como Master */
void send_5_byte(void){
    SSPBUF=data[0];
    while ((SSPSTAT & 1) == 0);
    SSPBUF=data[1];
    while ((SSPSTAT & 1) == 0);
    SSPBUF=data[2];
    while ((SSPSTAT & 1) == 0);
    SSPBUF=data[3];
    while ((SSPSTAT & 1) == 0);
    SSPBUF=data[4];
    while ((SSPSTAT & 1) == 0);
    PORTCbits.RC2 = 1;          // Luego mando la señal de latch
    PORTCbits.RC2 = 0;          //Sin delay, no hace falta
}


Para enviar los 5 bytes, por ahora uso una funcion, ya que no quiero meter el timer aún.

un efecto a distintas velocidades podemos ver en el siguiente video:



Tenemos que revisar el último registro que parece no estar reciviendo datos, quizá alguna pista se ha cortado o algo por el estilo.

Lo siguiente será poner un cristal al uC de 20MHz y testear todo a la máxima frecuencia, quizá alli ponga el osciloscopio y verifique los tiempos.

Será hasta la próxima!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: Reloj Analógico POV

Notapor aquileslor » Sab Jun 22, 2013 1:40 pm

Elgarbe, menudo trabajo estás haciendo. Lo voy copiando como hago con todos los trabajos importantes de los foristas para futura orientación de los que pregunten por algo así. Le copio el título exacto para poder mandar allí a alguien que consulte. Además veo de bueno que publiques el código, pero estamos acostumbrando mal a muchos foristas que quieren todo hecho. Ya no tengo la paciencia para hacer una cosa así, si me hubieras agarrado mas jóven quizás te hubiera seguido en la construcción para darte una mano. Bueno espero de corazón que llegues a buen término. Si se me ocurre algo te lo iré diciendo. Espero ver ese reloj funcionando.
aquileslor
 
Mensajes: 46
Registrado: Vie Abr 19, 2013 7:07 pm

Re: Reloj Analógico POV

Notapor elgarbe » Sab Jun 22, 2013 2:14 pm

aquileslor escribió:Elgarbe, menudo trabajo estás haciendo. Lo voy copiando como hago con todos los trabajos importantes de los foristas para futura orientación de los que pregunten por algo así. Le copio el título exacto para poder mandar allí a alguien que consulte. Además veo de bueno que publiques el código, pero estamos acostumbrando mal a muchos foristas que quieren todo hecho. Ya no tengo la paciencia para hacer una cosa así, si me hubieras agarrado mas jóven quizás te hubiera seguido en la construcción para darte una mano. Bueno espero de corazón que llegues a buen término. Si se me ocurre algo te lo iré diciendo. Espero ver ese reloj funcionando.


Gracias por el aliento!!

Este es uno de los proyectos que venimos trabajando con los pibes en la secundaria. Por supuesto que la base teórica la obtengo yo y luego se las transmito, no espero que nazca de ellos la solucion. Es una forma de engancharlos con este maravilloso mundo de la electrónica, que aprendan algunas ideas báscas, que apliquen los cálculos matemáticos, que construyan un "artefacto" completo desde 0 etc. etc.

Ahora estoy tratando de entender como almacenar la "imagen" que el mostraremos y como ir actualizando las "matrices"... eso me tiene bastante entretenido mentalmente...

Saludos!!!!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina


Volver a Problemas con mis Desarrollos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron