Hallo Community,
ich habe bisher hier viel gelesen und auch viele Lösungen gefunden. Bei meinem aktuellen Problem jedoch nichts gefunden. Ich möchte einen BLDC Motor ansteuern und nutze bisher einen alten Arduino Uno und eine 6 A Brücke vom Sparkfun mit dem TMC6300. Hier habe ich eine Ansteuerung per 3 Phasen Sinus PWM erstellt. Diese auch zum laufen bekommen (siehe Code). Später soll eine Erfassung per Hallsensoren hinzukommen und die Ansteuerung über eine RC-Fernsteuerung. Leider ist der bisher verwendetet Uno dafür zu langsam. Der Motor soll später mit bis 200 u/s mechanisch und wegen 7 Polpaaren ca 1400 u/s elektrisch vollziehen. Dafür habe ich jetzt Testweise den Arduino Minima angeschafft. Die Arduino IDE kann leider die Konfiguration der Timer nicht anpassen. Könnt Ihr mir zeigen wie die Anpassung des vorhandenen Code auf den Uno Minima erfolgen müßte?
Ich wollte noch das Datasheet zum RA4M1 hinzufügen, dies ist jedoch leider nicht möglich. Hier wäre auf Seite 454 das Beispiel für die PWM-Timer konfiguration zu finden.
```cpp
uint8_t Winkel_U_ []={128,130,132,134,136,139,141,143,145,148,150,152,154,156,158,161,163,165,167,169,171,173,175,178,180,
182,184,186,188,190,192,193,195,197,199,201,203,205,206,208,210,211,213,215,216,218,220,221,223,224,
226,227,228,230,231,232,234,235,236,237,238,239,241,242,243,244,244,245,246,247,248,249,249,250,251,
251,252,252,253,253,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,
254,253,253,252,252,251,251,250,249,249,248,247,246,245,244,244,243,242,241,239,238};
uint8_t Winkel_V_ []={238,237,236,235,234,232,231,230,228,227,226,224,223,221,220,218,216,215,213,211,210,208,206,205,203,
201,199,197,195,193,192,190,188,186,184,182,180,178,175,173,171,169,167,165,163,161,158,156,154,152,
150,148,145,143,141,139,136,134,132,130,128,125,123,121,119,116,114,112,110,107,105,103,101,99,97,94,
92,90,88,86,84,82,80,77,75,73,71,69,67,65,64,62,60,58,56,54,52,50,49,47,45,44,42,40,39,37,35,34,32,31,
29,28,27,25,24,23,21,20,19,18,17};
uint8_t Winkel_W_ []={17,16,14,13,12,11,11,10,9,8,7,6,6,5,4,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,3,4,4,
5,6,6,7,8,9,10,11,11,12,13,14,16,17,18,19,20,21,23,24,25,27,28,29,31,32,34,35,37,39,40,42,44,45,47,49,
50,52,54,56,58,60,62,63,65,67,69,71,73,75,77,80,82,84,86,88,90,92,94,97,99,101,103,105,107,110,112,114,
116,119,121,123,125,128};
uint16_t Winkel_u; uint16_t Winkel_v; uint16_t Winkel_w;
uint16_t Winkel_U; uint16_t Winkel_V; uint16_t Winkel_W;
int Counter1=0;
int ZaehlerTop=258 ; //256=100%
float Multiplikator;
float WinkelZeiger;
float Wert4;
unsigned int Zaehler10=0;
unsigned int Zaehler11=0;
uint16_t Drehzahl_Soll;
void setup()
{
noInterrupts();
// Konfiguration PWM Timer 0 Mode 1 WGM22 für PIN 5 und 6
TCCR0A=(1<<COM0A1)+(0<<COM0A0)+(1<<COM0B1)+(0<<COM0B0)+(0<<WGM01)+(1<<WGM00); // (1<<COM0A1)+(1<<COM0A0)+(1<<COM0B1)+(1<<COM0B0)
TCCR0B=(0<<WGM02)+(0<<CS02)+(1<<CS01)+(0<<CS00); //Prescaler 010=8,011=64,100=256,
DDRD|=(1<<PD5)+(1<<PD6); //PD5 und PD6
// Konfiguration PWM Timer 2 Mode 1 WGM22 für PIN 3 und 11
TCCR2A=(1<<COM2A1)+(0<<COM2A0)+(1<<COM2B1)+(0<<COM2B0)+(0<<WGM21)+(1<<WGM20) ; // (1<<COM2A1)+(1<<COM2A0)+(1<<COM2B1)+(1<<COM2B0)
TCCR2B=(0<<WGM22)+(0<<CS22)+(1<<CS21)+(0<<CS20) ; //Prescaler 010=8,100=64,110=256,
DDRD|=(1<<PD3); //PB3 und PD3 WGM20 für Mode 1
DDRB|=(1<<PB3);
// Konfiguration PWM Timer 1 Mode WGM 10 für PIN 2 und 11
// Prescaler CS12;CS11;CS10 möglich ist Systemclock=1 sonst 8,64,256oder1024 gewqähkt 001
// Timer 1 ist für PIN 9 und 10
TCCR1A=(1<<COM1A1)+(0<<COM0A1)+(1<<COM1B1)+(0<<COM0B1)+(0<<WGM11)+(1<<WGM10);
TCCR1B=(0<<WGM13)+(0<<WGM12)+(0<<CS12)+(1<<CS11)+(0<<CS10); //WGM 10 für Mode 1, 010=8,011=64,100=256,
//ICR1=ZaehlerTop; //bei Prescaler 8 3,97 KHz PMW Frequenz
DDRB|=(1<<PB1)+(1<<PB2); // für PIN 9 und 10
TCNT0=0;
TCNT1=0;
TCNT2=0;
interrupts();
//Serial.begin(57600);
}
void loop()
{
if (Wert4<=50) {Wert4=Wert4+0.1;} else {Wert4=0;Zaehler10++;Zaehler11++;Drehzahl_Soll=analogRead(A0);}
Drehzahl_Soll=analogRead(A0); //Poti einlesen
if (Drehzahl_Soll >= 812 && Zaehler11 >= 20 && Multiplikator <= 8.0 && Zaehler10 >= 2 ) //Drehzahlanpassung über Poti Hochlauf
{Multiplikator=Multiplikator+0.06; Zaehler10=0; Zaehler11=220;}
if (Drehzahl_Soll <= 212 && Multiplikator >= 0.50 && Zaehler10 >= 2) //Drehzahlanpassung über Poti Runterlauf
{Multiplikator=Multiplikator-0.03; Zaehler10=0;}
if (WinkelZeiger >= 0.00 && WinkelZeiger <= 359.8) { WinkelZeiger=WinkelZeiger+(1*Multiplikator);}else{WinkelZeiger=0;} // Drehwinkel erzeugen
//WinkelZeiger=map(Drehzahl,0,1023,0,359); //nur zur Simulation der einzelnen Positionen einer Umdrehung 0 bis 359 Grad
//Abfrage der PWM aus Array Phase 1 bis 3
if (WinkelZeiger >= 0 && WinkelZeiger<=119)
{Counter1=WinkelZeiger;
Winkel_u=Counter1[Winkel_U_];
Winkel_v=Counter1[Winkel_V_];
Winkel_w=Counter1[Winkel_W_];
}
else
{ if (WinkelZeiger >= 120 && WinkelZeiger<=239)
{Counter1=WinkelZeiger-120;
Winkel_w=Counter1[Winkel_U_];
Winkel_u=Counter1[Winkel_V_];
Winkel_v=Counter1[Winkel_W_];
}
else
{ if (WinkelZeiger >= 240 && WinkelZeiger<=359)
{
Counter1=WinkelZeiger-240;
Winkel_v=Counter1[Winkel_U_];
Winkel_w=Counter1[Winkel_V_];
Winkel_u=Counter1[Winkel_W_];
}}}
//if (Counter1!=Counter1old||Counter1==0)
//{
OCR0A=Winkel_u; //PIN 6
OCR0B=255;//PWM1L; //PIN 5
OCR1A=Winkel_v; //PIN 9
OCR1B=255;//PWM2L; //PIN 10
OCR2A=Winkel_w; //PIN 11
OCR2B=255;//PWM3L; //PIN 3
//}
}