Secuencia y relacion de salidas hall y pasos trifasicos.

Hola amigos. Este tema se me ha vuelto una pesadilla. Llevo días y días, he probado todas las combinaciones AB, AC, .... en relacion a las 6 salidas de los 3 sensores hall. El motor gira para donde quiera, no puedo controlar la velocidad, cosa que aún no me preocupa, pero tampoco funciona, tengo algunas dudas sobre esto. Y lo mas grave es que el motor se detiene con el paso del tiempo, adjunto foto. La flecha indica una perdida siempre paulatina de velocidad, o de revoluciones. Ayuda amigos. Gracias.
 

Adjuntos

  • pesadilla.png
    pesadilla.png
    136.9 KB · Visitas: 21
Sí, ojalá lo fueramos. Estoy usando Ab, Ac, Bc, Ba, Ca, Cb. Donde mayúscula es alimentación positiva de la face a la que corresponde la letra, y minúscula negativo, obviamente. Pero tambien he usado. Ab, Cb, Ca, Ba, Bc, Ac. Además he hecho cambios al azar, pues repito, nunca funciona bien.
El problema es que los sensores hall, tienen 6 estados de salida, entonces quiero saber por poner un ejemplo:

EJEMPLO: Cuando el sensor tiene 101 (4 Decimal), hay que alimentar "C" con positivo y "a" con negativo.
Cuando el sensor tiene tal salida, hay que alimentar con positivo tal face y con negativo mas cual face.....
y así.
Esa información, nadie la dice, no se como buscarla, y tampoco soy adivino.

Frecuencias. He probado todo tipo de frecuencias, desde microsegundo a milisegundo 100, 200 trescientos milisegundos, 1, 20, 3, 10, todas las frecuencias las he probado. Explico. El micro lo tengo mirando todo el tiempo la salida de sensores, ante un cambio, pues cambia en la secuencia ABC, y deja esa salida puesta, da vueltas y vueltas el bucle y cuando los sensores cambian, pues cambio de nuevo la salida ABC.
Y por último, dentro de una misma salida puesta, me he puesto a dar esa salida intermitente tambien, la quito, la pongo, la quito, la pongo, así con varias frecuencias, hasta que cambien los sensores hall, y entonces cambio salida ABC, y esta nueva pues tambien intermitente. Y nada, todo falla.
 
Cuando quieras, si quieres, publica todo.
Si no quieres no, tampoco pasa nada; es a ti a quien interesa. A mí me da lo mismo.

Pista: el código de un sistema con microcontrolador es imprescindible.

Re-pista: un esquema que se pueda seguir también. Esa imagen con hilos que pasan por detrás de cosas que no se sabe de dónde a donde van...
 
#define F_CPU 1000000UL

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include<util/delay.h>

//-------------------------------------------
void mytime(unsigned int time)
{
unsigned long a;

for(a = 0; a <= time; a++)
_delay_ms(900);

}
//-------------------------------------------

//-----------------------------------------
//OJOOOOO El bit 0 del puerto B lo uso para A, el bit 1 para B, y el bit 2 para C.


int main()
{
DDRB = 0b00000000;
PORTB = 0b00000000;

DDRD = 0b11111111;
PORTD = 0b00000000;

WDTCSR = 0;

_delay_ms(1000);


int sensors = 0;


while (1)
{
// _delay_ms(1);

//PORTB = 0b00000000;

_delay_ms(2);

sensors = PIND;

if(sensors == 1)
{
PORTB = 0b00011000; //CB

continue;
}



if(sensors == 3)
{
PORTB = 0b00010010; //CA

continue;
}



if(sensors == 2)
{
PORTB = 0b00000110; //BA

continue;
}



if(sensors == 6)
{
PORTB = 0b00100100; //BC

continue;
}



if(sensors == 4)
{
PORTB = 0b00100001; //AC

continue;
}



if(sensors == 5)
{
PORTB = 0b00001001; //AB

continue;
}



}//while


return 0;
}
 
C:
#define F_CPU 1000000UL

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include<util/delay.h>

//-------------------------------------------
void mytime(unsigned int time)
{
unsigned long a;

for(a = 0; a <= time; a++)
_delay_ms(900);

}
//-------------------------------------------

//-----------------------------------------
//OJOOOOO El bit 0 del puerto B lo uso para A, el bit 1 para B, y el bit 2 para C.


int main()
{
DDRB = 0b00000000;
PORTB = 0b00000000;

DDRD = 0b11111111;
PORTD = 0b00000000;

WDTCSR = 0;

_delay_ms(1000);


int sensors = 0;


while (1)
{
// _delay_ms(1);

//PORTB = 0b00000000;

_delay_ms(2);

sensors = PIND;

if(sensors == 1)
{
PORTB = 0b00011000; //CB

continue;
}



if(sensors == 3)
{
PORTB = 0b00010010; //CA

continue;
}



if(sensors == 2)
{
PORTB = 0b00000110; //BA

continue;
}



if(sensors == 6)
{
PORTB = 0b00100100; //BC

continue;
}



if(sensors == 4)
{
PORTB = 0b00100001; //AC

continue;
}



if(sensors == 5)
{
PORTB = 0b00001001; //AB

continue;
}



}//while


return 0;
}

¿Para qué sirve este código?
C:
//-------------------------------------------
void mytime(unsigned int time)
{
unsigned long a;

for(a = 0; a <= time; a++)
_delay_ms(900);

}
Porque declaras un algo que no usas
Si pones un esquema legible, mejor
 

Adjuntos

  • IR2101.PDF
    374.5 KB · Visitas: 0
Última edición:
El código de la función mytime, es una prueba que estaba haciendo de tiempo, por ahora no lo estoy usando.
Cómo encerraste el código y aparece más legible, o sea, en formato de código fuente, y no como cuando lo puse yo?

Supongo que anteponiendo al código "c:"
101b --> 5 en decimal
Sí correcto, me confundí. Igual sirve 5, 4 o cualquier valor para el contexto de la pregunta. Gracias.
 
Hola amigos, y dispensen la tardanza. Aquí les dejaré el enlace del proyecto completamente funcional. Poco a poco fuí resolviendo todos los problemas. Quieron compartirle dos criterios muy personales, desde mi punto de vista claro:
1- Muy mala experiencia trabajar con los avr, nada que ver con los pic. El direccionamiento de bit, el reguero en sus registros, etc, etc..
A pesar de que realmente tienen en la mayoría de los casos más prestaciones que sus homólgos pics.
2- El IR2101 me tubo el proyecto parado muchas muchas horas, de hecho, la existencia de este hilo, fue por ese componente. El fabricante no se le ocurrió especificar el el datasheet que deben ponerse resistencias de pulldown a las entradas lógicas.

Y ahora el enlace, espero les guste:
 
Atrás
Arriba