Mensajes recientes

Páginas: [1] 2 3 4 5 6 7 8 9 10
1
Que tal genisuvi,

Puedo entender que sigas teneidno dudas y preguntas acerca de tu proyecto, pero es importante que indiques con mas detalle tu proyecto. Como te he estado siguiendo, se con seguridad que el "chip" que estás usando es el MCP23S017 y es importante que lo sigas indicando, de lo contrario como es el caso, remi04 ha asumido a que te refieres a pines de RESET para microcontroladores, los cuales son mucho más sensibles tal como te lo ha explicado él.
Ahora bien, respondiendo a tu pregunta, debes leer y observar con detalle la hoja de datos del componente en cuestión, en este caso el MCP23S017, el cual detalla en las páginas 4 y 5 que el pin de RESET tiene una capacitancia de entrada de 50pF, ese es un dato importante a tomar en cuenta para realizar los cálculos necesarios.
Mira sin tomar en cuenta la capacitancia parasítica de las pistas en el PCB y suponiendo que tienes 8 MCP23S017 en un solo PCB, estarías uniendo 8 capacitores de 50pF, dándote una capacitancia total de 400pF. Ahora bien, supongamos que solo tienes un solo IC, y le agregas una resistencia de 10 Kohms, entonces necesitas que el capacitor se cargue hasta 0.8VDD, que en tu caso es de 3.3V, es decir necesitas que se cargue hasta 2.64V. Aplicas la ecuación del voltaje de carga en un capacitor, y obtienes que el capacitor alcanzará dicho voltaje de 2.64V en 804ns. Ahora bien, si tienes 8 pines de RESET conectados, la capacitancia se incrementa hasta 400pF, lo que significa que ahora le tomará 6.4377 uS en alcanzar el voltaje. Como te podrás dar cuenta, el tiempo de colocar los MCP23S017 en modo activo irá incrementando, así que imagínate que lo que deseas es mantener el ese tiempo como el originalmente calculado, es decir ele de 804ns, entonces lo que tienes que hacer es reducir el valor de la resistencia en tu ecuación de carga del capacitor de modo que el conjutno de RC en la ecuación te produzca 804ns. En el caso de 8 MCP23S017 te diré que la resistencia sería de 1.2489 Kohms. Si ahora colocas 64 de estos la resitencia sería cada vez más pequeña, por lo que llegará un momento el que el pin del raspberry pi no podrá manejar la corriente de la resistencia por se tan pequeña. ASí, que la mejor solución sería usar la idea de remi04, pero yo la modificaría de manera que solo uses una resistencia de 1.2Kohms por cada targeta de 8 MCP23S017 y utilices un transistor para así bajar el nivel a 0 y generar el reset.
Espero que me haya explicado y que esta idea te sirva, si tienes preguntas no dudes en hacerlas. Por cierto lo de la carga y descarga de un capacitor te lo dejo de tarea para que sea una parte de tu aprendizaje.

Saludos,

elreypic.
2
Primeros pasos - Iniciación a los microcontroladores / Re:Ajustar Velocidad de motor dada las RPM
« Último mensaje por artemis en 11 de Agosto de 2020, 18:11:48 »
Hola remi, gracias por la respuesta

Te comento esto es lo que yo plantié

Utilizo las interrupciones externas en RB0 y ahí es donde tengo el contador de pulsos por segundo. No se si es posible de hacerlo así o como podría ser? no me doy cuenta como lo mencionas vos
Código: [Seleccionar]
#INCLUDE <16F876A.h>
#DEVICE ADC=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <flex_lcd.C>
#DEFINE USE_PORTB_LCD TRUE
//Direcciones de memoria que utilizan los puertos A,B y C
#BYTE PORTA= 5
#byte PORTB= 6
#byte PORTC= 7

long contador=0;//Variable para contar los pulsos del encoder
int16 duty=0;//para guardar el ciclo duty del pwm
int Timer2,Poscaler;//para configurar el pwm
double RPM,P_RPM;//se guarda las revoluciones por minuto del motor
int i=0; //variable que servira como contador
int prueba=0;
//Interrubción por cambio en RB0
#INT_EXT
ext_isr()//esta funcion solo se activa cuando hay una interrupcion por flanco de subida (L TO H)
{
   contador++;             
}
void main()
{
   //Configura los Puertos del PIC
   set_tris_a(0b00000111);//RA0 RA1 RA2 como entrada, donde está el potenciometro
   set_tris_b(0b00000011); //RB0 como entrada, donde está conectado el encoder del motor y se utiliza interrupcion externa (que trabaja con este pin)
   set_tris_c(0b00000000);//todo el puerto C como salida
   lcd_init();
   lcd_gotoxy(1,1);
   printf(LCD_PUTC, "BIENVENIDO");
   delay_ms(200);
    //Habilita las Interrupcciones
    enable_interrupts(int_ext); //Activa interrupcion por RB0
    ext_int_edge(L_TO_H);    //Activa interrupción por flanco de subida
    enable_interrupts(global); //Habilita interrupciones de forma global, se hacen arriba del main como funcion global
   //Configura el PWM
   // Generemos una Señal cuadrada de 1 Khz
   Timer2=249;    //Se carga timer 2 con 249 como lo vimos en la pagina
   Poscaler=1;  //Preescaler solo puede tomar valores de: 1
   
   setup_timer_2(t2_div_by_4,Timer2,Poscaler);   //Configuracion de Timer 2 para establecer frec. PWM a 1kHz
   
   setup_ccp1(ccp_pwm); //Configura el modulo CCP1 en modo PWM
   set_pwm1_duty(70);    //Determina el ciclo de trabajo en escala de 0 a 255 (PARAMETRO DE INICIO)
   
    //Hace por siempre
    while(1)
    {
   if(INPUT(PIN_A0)==1) //condicion de la pulsacion de incremento
   {     
         P_RPM=200;
         i=P_RPM/30; //cantidad de pulsos que hay que contar por minuto para poder tener las revoluciones requeridas         
         while(contador<i)
         {           
            prueba++;
            set_pwm1_duty(prueba);
         }
   }
 
   if(INPUT(PIN_A1)==1) //condicion de la pulsacion de incremento
   {
           
   }
      if(INPUT(PIN_B1)==1) //condicion de la pulsacion de incremento
   {
      set_pwm1_duty(0);
      i=0;
   }
  //Espera por 1 segundo*/
     delay_ms(999);
     
     //Despues de 1 segundo multiplica el valor de los pulsos contados en
     //contador y los multiplica por 60 (para pasarlo a minutos) y lo divide
     //por el numero de pulsos que tiene el encoder, en este caso el encoder
     //da 10 pulsos en 1 giro completo
     RPM=contador*60/2;
     
   //  Reinicia el contador de Pulsos
     contador=0;
     
   //  Visualiza la Velocidad
     lcd_gotoxy(1,2);
     printf(lcd_putc,"RPM: %f   ",RPM);
   
    }
   
}

Saludos

3
- Niple - / Re:Buzzer pasivo
« Último mensaje por Fer_TACA en 11 de Agosto de 2020, 12:26:50 »
¿A que te refieres que no logras hacerlo funcionar?

En el bloque de configurar la PWM has puesto una frecuencia de 3800Hz con un porcentaje útil del ciclo del 90%. Si observas la figura adjunta veras que eso es lo que se obtiene al simular lo que has realizado. La frecuencia que se obtiene es de 3846Hz pero seguro que no es muy buena la medida del osciloscopio del simulador y se puede afinar un poco más la medida.

Otra cosa que observo es que configuras y habilitas la interrupción del TMR2 peo no tienes creada ninguna subrutina que atienda esa situacion.

F.
4
Los pines de reset de los uC suelen ser muy delicados y sensibles a ruido por lo que es totalmente desaconsejable hacer una red de reset’s en paralelo y enviarlos todos a la gpio de la Raspi.  Y menos aún si van a mediar cables entre distintas tarjetas que comunican con los reset directamente.


  Lo ideal es que todos los uC estén lo más cerca posibles entre ellos. Cada reset con su pullup independiente y su condensador cerámico de desacople.

  Luego pondría un mosfet tipo 2n7002 que son smd, muy pequeños y baratos,  con drain al pin reset, source a Gnd y gate a gpio.

   Entonces todas las gates de todos los mosfet sí que los puedes unir, las polarizas a gnd con una resistencia de 10k y todo conectado al gpio.

  Incluso puedes agrupar varios reset que estén muy cerca entre ellos a un solo mosfet.

   
5
* PROYECTOS * / Re:interfaz FTDI y python
« Último mensaje por Caracola en 11 de Agosto de 2020, 10:31:45 »

 :-/ :-/ :-/ :-/ :-/ :-/ SOLUCIONADO!






6
hola!
Quiero controlar el reset de varios chips en una PCB que controlará señal de salida de una Raspberry. Una única señal en una PCB de 8 chips. Pero también puede haber hasta 8 PCBs. Así que 8x8 = 64 chips.
Es decir; un RESET_OUT (Raspberry OUTPUT) tendrá 64 derivaciones para llegar a los 64 pines de RESET_INx (chips destino INPUT).
Si quisiera dejar esta señal RESET_INx en estado alto por defecto (reset inactivo) usaría la configuración Rpull up. En muchos casos la gente emplea 10K para hacer este Rpull up en este chip.


Mi duda es si:

1.- necesito una Rpull up para cada chip o si al colgar de la misma señal/línea bastaría una sola Rpull up conectada a RESET_OUT antes de distribuirse.
2.- manteniendo el valor de R10K? cómo saber qué valores me harían falta?


Gracias a todos!
7
Primeros pasos - Iniciación a los microcontroladores / Re:Ajustar Velocidad de motor dada las RPM
« Último mensaje por remi04 en 11 de Agosto de 2020, 05:54:10 »
Hola, entiendo que se trata de un motor de escobillas con encoder incorporado.

  Ahi vas a necesitar 4 funciones principales dentro del bucle del main:

while(1) {

- Lectura de pulsadores para ajustar la velocidad (Vset).
- Lectura del régimen actual (mediante interrupcion).
- Ajuste del dutty cicle del PWM si es necesario.
- Feedback.
}


La lectura de pulsadores ningún problema, if (!p+) rpm++; if(!p-) rpm--  o similar, como lo quieras ajustar y le pones alguna rutina antirrebote.

Para la lectura del régimen de giro actual necesitas usar un timer, y una variable inicializada a cero para almacenar el numero de veces que desborda ese timer. conectas el encoder a un pin que tenga interrupción por cambio de estado.
Cuando se produzca un cambio de estado entras en la interrupción y:
1- Lees el estado actual del pin y te mantienes en espera de que cambie de nuevo.
2- Una vez ha cambiado, pones el timer a cero y vigilas dos cosas:
       2-1: La bandera tmrxxif (que indica que el timer ha desbordado), entonces incrementas el contador y bajas la bandera, nada mas.
       2-2: Control de timeout: ¿Cuanto tiempo máximo esperarás cambio de estado antes de abandonar?, si el motor se detiene el programa quedaría atrapado esperando cambios de estado, si eso no interesa, y no creo que interese, aqui debes esperar lo que creas conveniente. Como tieness un contador de desbordamientos, y sabes el tiempo que tarda el timer en desbordar (depende del oscilador, preescalador, postcalador, etc) sabes con qué valor de contador abandonas.

3- Esperas otros dos cambios de estado. En todos ellos haces lo mismo descrito en 2-1 y 2-2.
- Una vez alcanzado el ultimo cambio de estado:
   - lees el valor del timer.
   - Lees el valor del contador de desbordamientos. Si es un timer de 16 bits desborda a las 65535 + 1 pulsos de conteo. De 8 bits desborda a los 255 + 1 pulso de conteo.

    la operacion para periodo es:
   periodo = numero de desbordamientos * (65535 + 1);
   periodo += valor del timer obtenido al momento del ultimo cambio de estado del pin.

    Todo esto es para UN SOLO DIENTE del encoder. Ahora bien, o repites lo anterior tantas veces como dientes tenga el encoder y vas acumulando las lecturas y aplicar la operación del periodo a todo, o....     Lo haces para un solo diente y el resultado lo multiplicas por el numero de dientes del encoder (No merece la pena, ya puestos.....  mejor medirlo todo), solo tienes que encerrar todo lo anterior (excepto el calculo del periodo) en un while(){} cuya condicion sea while (numero_de_dientes-- > 0) { }


    De una manera u otra, una vez que tienes un periodo, lo conviertes en su tiempo equivalente. Como sabes el tiempo que tarda el timer en incrementarse y en desbordarse por que lo has calculado dependiendo del oscilador, prescaler, postcaler y poco más,  puedes saber cuanto tiempo ha tardado el motor en dar un giro completo.

  Le aplicas la inversa y ya tienes la frecuencia.
  La divides entre 60 y ya tienes las rpm, aunque yo aun lo trabajaría en frecuencia. Las rpm solo para mostrarlas si hace falta.

 
Ya solo queda el bloque de feedback, que consiste en comparar el valor de rpm ajustado (Vset) con el obtenido, si es mayor, bajamos el dutty cicle al pwm, si es menor, subimos el dutty cicle al pwm...  Esto es lo mas facil, pero no es lo mejor.

   Para bordarlo ya mejor implementar un algoritmo PID que no es muy complicado y te dará un redondeo de ajuste y suavidad que quitan el sentido.... :D

  Un saludo.
8
Foro Técnico / Re:Fusible de restablecimiento automático
« Último mensaje por juaperser1 en 11 de Agosto de 2020, 03:39:47 »
Eso es lo que me mosquea, que la hoja de datos recomienda un 3.15A/300V slow-blow   :? :?

¿Es posible que lo que trae la fuente no sea un fusible, si no un PTC como fusible de restablecimiento automático? Es decir estas fuentes creo recordar que se apagaban y luego volvian a funcionar si tenian un cortocircuito o algun otro fallo.

de todas maneras creo que le voy a colocar un fusible de 2A mejor por si acaso, he colocado este:

https://www.mouser.es/datasheet/2/240/Littelfuse_Fuse_369_Datasheet.pdf-693406.pdf

De varistor este, de 9mm de diametro:

https://product.tdk.com/info/en/catalog/datasheets/70/db/var/SIOV_Leaded_AdvanceD.pdf?ref_disty=mouser

y de resistencia esta de 3W, 6,8ohmios:

https://www.mouser.es/datasheet/2/427/acac-at-1762688.pdf

al reducir el diametro del varistor y colocar la resistencia en vertical ha entrado todo.

un saludo
9
Todo en microcontroladores PIC / Re:Migración de código problemas
« Último mensaje por Pinolillo16 en 11 de Agosto de 2020, 01:01:57 »
O alguna referencia que tengan del uso de estos pics con PPS?

Saludos
10
CNC - Control Numérico Computarizado / Re:que driver elegir
« Último mensaje por scrwld en 11 de Agosto de 2020, 00:10:18 »
hola fede_joe m espero esto te sirva.

stp-58d307
STP-58D307-01

1/8 step ; 1,4v ; 1,3A

ORG &#8211; A
BRN &#8211; A-
GRN &#8211; B-
BLU &#8211; B
BLK - COMMON
WTH &#8211; COMMON

*********************************
Deskripsi Stepping motor nema 23 FH61571 2A

  STEPPING MOTOR FH6-1571 2.0 A

- Stepper FH6-1571
- STP-58D307
- 1.8 DEG/STEP
- 2.2 V
- 2.0 A
- 6 wire (Unipolar)

- Dimensi 56 x 56 x 56 mm
- D AS +- 6mm dan 7 mm
*******************************
Type : 103h7126-0649
Fram size : NEMA 23
Current : 2.5A
Holding torque :1.32 N.m = 13.5 Kg.cm
Number of wire leads: 6
Weight: 1.0 Kg
https://www.ebay.com/itm/Nema-23-Sanyo-Denki-Stepper-Motor-268oz-in-CNC-Router-Mill-Lathe-Robot-RepRap-/171021459581
*********************************************************
https://www.sanyodenki.com/archive/document/product/servo/catalog_E_pdf/SANMOTION_F2_E.pdf

saludos
Páginas: [1] 2 3 4 5 6 7 8 9 10