Buenas, tenia mucho que no entraba al foro siquiera, posteare esto aquí por si a alguien mas le puede servir:
Desde hace tiempo tengo en mente varios proyectos con motores BLDC, como ya sabrán son motores trifásicos que son controlados por un puente H triple, los controles ESC o variadores como comúnmente los conocemos algunos hobbystas son muy útiles para casos sencillos en los que se requiere solamente velocidad burda en lazo abierto, sin embargo en algunos casos mas especiales se requiere control de posición del motor, como por ejemplo en el caso de los gimball o estabilizadores de cámaras en estos casos los ESC's convencionales nos son totalmente inútiles (se puede modificar el firmware, pero no es la idea).
Existen varias opciones comerciales que ofrecen mayor control sobre la posición del rotor como lo son O-drive y V-esc, pero son caros y con la escasez de semiconductores se puso aun peor la situación.
Por el momento mi proyecto consiste en un simple puente H que puede ser controlado por un arduino común, en las semanas siguientes iré actualizando el proyecto pero por ahora lo subo aquí, por si hay alguna sugerencia o error que estoy cometiendo me lo hagan saber.
Este proyecto lo inicie porque soy aficionado a la astronomía y quiero una montura direct drive, obviamente son exageradamente caras así que decidí hacer una con motores de hoverboard.
En mi caso usare un STM32 para aprovechar la mayor resolución del pwm, ya que esto dará como resultado una mayor resolución a la hora de hacer tracking del cielo. La tarjeta final tendrá capacidad para controlar 2 motores, es decir 2 puentes H así como entradas analógicas y digitales para varios periféricos.
Mi fuerte es la electrónica, así que no se asusten con mi código ![]()
#include <math.h>
int Output1 = PA8;
int Output2 = PA9;
int Output3 = PA10;
int analogVal;
const int analogInput = PA0;
HardwareTimer timer(1);
//int potVal = 0;
double A = 0;
long IT;
double B; //= 0.00400001;
int amp;// = 11000;
//int Freq_IN = A0;
int var1 = 0;
int var2 = 0;
int var3 = 0;
int var4 = 0;
int var5 = 0;
int var6 = 0;
int cont = 0;
int ampval;
double Phase1 = 2 * PI / 3;
double Phase2 = 4 * PI / 3;
double Phase3 = 2 * PI;
boolean toggle1 = true;
boolean toggle = false; // true = Enabling Serial Plotter Output
void setup()
{
timer.setPrescaleFactor(1);
//timer.setOverflow(255);
Serial.begin(9600);
pinMode(Output1, PWM);
pinMode(Output2, PWM);
pinMode(Output3, PWM);
//pinMode(Freq_IN, INPUT);
//delay(5000);
}
void loop()
{
// analogVal = (analogRead(analogInput) - 2000);
analogVal = analogRead(analogInput) ;
Serial.println(ampval);
B = map(analogVal, 0, 4095, 500000, -500000 );
ampval = analogVal - 2042;
if (ampval < 0) {
ampval = ampval * (-1);
}
B = B / 100000000;
amp = map(ampval, 0, 2095, 8000, 14000 );
if (ampval < 30) {
B = 0;
}
A += B;
cont = cont + 1 ;
IT ++;
pwmWrite(Output1, var1);
pwmWrite(Output2, var2);
pwmWrite(Output3, var3);
if (toggle == true)
{
Serial.print(var1);
Serial.print("\t");
Serial.print(var2);
Serial.print("\t");
Serial.println(var3);
Serial.println("\t");
}
var4 = amp * sin(A + Phase1);
var1 = var4 + 32768;
var5 = amp * sin(A + Phase2);
var2 = var5 + 32768;
var6 = amp * sin(A + Phase3);
var3 = var6 + 32768;
if (A >= 2 * PI)
{
// if(toggle1 == true){
//Serial.println(IT);
// }
A = 0;
//cont = 0;
}
}
Aqui un Video de como va el proyecto.
PD no pude subir imagenes, me marca error o algo estoy haciendo mal




