Hallo Leute ich versuche mit einem Arduino Uno R3 und 3 H-Brücken (L298N) und drei Spulen ein Wechselfeld zu simulieren die Spulen sind um einen Kompass herum 120° Phasenverschoben angeordnet.
Jedoch habe ich das Problem das der Kompass sich nicht richtig dreht er dreht wie er will und verharrt dann an einem Punkt.
tippe oder füge den Code #include <TimerOne.h>
#include <math.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //Bibliotheken
LiquidCrystal_I2C lcd(0x27,20,4);
volatile int frequenz = 1.0;
float Phasenverschiebung = (M_PI * 2)/3 ; //360° ^= 2Pi
// Externe Interupt Variablen
const int Taster_External_Interrupt_Pin = 2;
const int Taster_Frequenz_Hoch = 7;
const int Taster_Frequenz_Runter = 8;
const int Taster_Drehrichtungsumkehr = 12;
volatile bool Drehrichtung = 1; // True Rechtslauf | FALSE = Linklslauf
volatile float Interruptauslosezeit_in_ms = 0;
volatile float Periodendauer_T_sek = 0;
volatile float Winkelgeschwindigkeit_in_rad_pro_sek = 0;
//Spule1 PinBelegung
const int Pin_Spule1_Enable = 3;
const int Pin_Spule1_Rechtslauf = A5;
const int Pin_Spule1_Linkslauf = A4;
//Spule2 Pinbelegung
const int Pin_Spule2_Enable = 5;
const int Pin_Spule2_Rechtslauf = A3;
const int Pin_Spule2_Linkslauf = A2;
//Spule3 PinBelegung
const int Pin_Spule3_Enable = 6;
const int Pin_Spule3_Rechtslauf = A1;
const int Pin_Spule3_Linkslauf = A0;
const int Anzahl_Stutzstellen_volle_Periode = 18;
int Tabelle_Sinuswerte_L1[Anzahl_Stutzstellen_volle_Periode] = {};
int Tabelle_Sinuswerte_L2[Anzahl_Stutzstellen_volle_Periode] = {};
int Tabelle_Sinuswerte_L3[Anzahl_Stutzstellen_volle_Periode] = {};
void setup()
{
delay(500);
Serial.begin(9600);
// PinModes für Taster Externer Interrupt
pinMode(Taster_External_Interrupt_Pin, INPUT_PULLUP);
pinMode(Taster_Frequenz_Hoch, INPUT_PULLUP);
pinMode(Taster_Frequenz_Runter, INPUT_PULLUP);
pinMode(Taster_Drehrichtungsumkehr, INPUT_PULLUP);
// pinModes der Spulen 1-3
//Spule1
pinMode(Pin_Spule1_Enable , OUTPUT);
pinMode(Pin_Spule1_Rechtslauf,OUTPUT);
pinMode(Pin_Spule1_Linkslauf,OUTPUT);
//Spule 2
pinMode(Pin_Spule2_Enable , OUTPUT);
pinMode(Pin_Spule2_Rechtslauf,OUTPUT);
pinMode(Pin_Spule2_Linkslauf,OUTPUT);
//Spule3
pinMode(Pin_Spule2_Enable , OUTPUT);
pinMode(Pin_Spule2_Rechtslauf,OUTPUT);
pinMode(Pin_Spule2_Linkslauf,OUTPUT);
Periodendauer_T_sek = 1.0 / frequenz;
Winkelgeschwindigkeit_in_rad_pro_sek = 2 * M_PI * frequenz;
Interruptauslosezeit_in_ms = (Periodendauer_T_sek / Anzahl_Stutzstellen_volle_Periode) * 1000.0;
for( int Aktuelle_TabellenPosition = 0 ; Aktuelle_TabellenPosition < Anzahl_Stutzstellen_volle_Periode; Aktuelle_TabellenPosition ++ )
{
float OmegaZeit_in_s = (Winkelgeschwindigkeit_in_rad_pro_sek * Interruptauslosezeit_in_ms * Aktuelle_TabellenPosition ) / 1000.0;
Tabelle_Sinuswerte_L1[Aktuelle_TabellenPosition] = (int)(255 * (sin( OmegaZeit_in_s + Phasenverschiebung * 0)));
Tabelle_Sinuswerte_L2[Aktuelle_TabellenPosition] = (int)(255 * (sin( OmegaZeit_in_s + Phasenverschiebung * 1)));
Tabelle_Sinuswerte_L3[Aktuelle_TabellenPosition] = (int)(255 * (sin( OmegaZeit_in_s + Phasenverschiebung * 2)));
}
// Timer Interrupt Initialisieren
Timer1.initialize ((Interruptauslosezeit_in_ms * 1000)); // Zeit in mykro sekunden
Timer1.attachInterrupt (ISR_ZeitInterrupt);
//Externen Interrupt Initialisieren
attachInterrupt(digitalPinToInterrupt(2), ISR_External_Buttons, RISING); //ISR_TASTER
lcd.init(); // initialize the lcd
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
}
void ISR_External_Buttons()
{
Timer1.stop();
// Serial.println("Interrupt");
if(digitalRead(Taster_Frequenz_Hoch) == 1)
{
if(frequenz < 50.0)
{
frequenz = frequenz + 1.0;
}
}
if(digitalRead(Taster_Frequenz_Runter) == 1)
{
if(frequenz > 1 ){
frequenz --;
}
}
if(digitalRead(Taster_Drehrichtungsumkehr) == 1){
Drehrichtung = !Drehrichtung;
}
Periodendauer_T_sek = 1.0 / frequenz;
Winkelgeschwindigkeit_in_rad_pro_sek = 2 * M_PI * frequenz;
Interruptauslosezeit_in_ms = (Periodendauer_T_sek / Anzahl_Stutzstellen_volle_Periode) * 1000.0;
for( int Aktuelle_TabellenPosition = 0 ; Aktuelle_TabellenPosition < Anzahl_Stutzstellen_volle_Periode; Aktuelle_TabellenPosition ++ )
{
float OmegaZeit_in_s = (Winkelgeschwindigkeit_in_rad_pro_sek * Interruptauslosezeit_in_ms * Aktuelle_TabellenPosition ) / 1000.0;
Tabelle_Sinuswerte_L1[Aktuelle_TabellenPosition] = (int)(255 * (sin( OmegaZeit_in_s + Phasenverschiebung * 0)));
Tabelle_Sinuswerte_L2[Aktuelle_TabellenPosition] = (int)(255 * (sin( OmegaZeit_in_s + Phasenverschiebung * 1)));
Tabelle_Sinuswerte_L3[Aktuelle_TabellenPosition] = (int)(255 * (sin( OmegaZeit_in_s + Phasenverschiebung * 2)));
}
Timer1.setPeriod(Interruptauslosezeit_in_ms * 1000.0);
}
volatile int akt_PWM_Tastgrad_L1 = 0;
volatile int akt_PWM_Tastgrad_L2 = 0;
volatile int akt_PWM_Tastgrad_L3 = 0;
volatile int ListenPositionsCounter = 0;
void ISR_ZeitInterrupt ()
{
if( Drehrichtung == 0 )
{
akt_PWM_Tastgrad_L1 = Tabelle_Sinuswerte_L1[ListenPositionsCounter];
akt_PWM_Tastgrad_L2 = Tabelle_Sinuswerte_L2[ListenPositionsCounter];
akt_PWM_Tastgrad_L3 = Tabelle_Sinuswerte_L3[ListenPositionsCounter];
}
if( Drehrichtung == 1 )
{
akt_PWM_Tastgrad_L1 = Tabelle_Sinuswerte_L2[ListenPositionsCounter];
akt_PWM_Tastgrad_L2 = Tabelle_Sinuswerte_L1[ListenPositionsCounter];
akt_PWM_Tastgrad_L3 = Tabelle_Sinuswerte_L3[ListenPositionsCounter];
}
// Spule 1
if(akt_PWM_Tastgrad_L1 > 0) // Rechtslauf Spule 1
{
digitalWrite(Pin_Spule1_Linkslauf, LOW);
digitalWrite(Pin_Spule1_Rechtslauf, HIGH);
}
if(akt_PWM_Tastgrad_L1 == 0)
{
digitalWrite(Pin_Spule1_Linkslauf, LOW);
digitalWrite(Pin_Spule1_Rechtslauf, LOW);
}
if(akt_PWM_Tastgrad_L1 < 0) // Rechtslauf Spule 1
{
digitalWrite(Pin_Spule1_Linkslauf, HIGH);
digitalWrite(Pin_Spule1_Rechtslauf, LOW);
// Serial.print("Linkslauf");
}
// Spule 2
if(akt_PWM_Tastgrad_L2 > 0) // Spule 2 Rechtslauf
{
digitalWrite(Pin_Spule2_Linkslauf, LOW);
digitalWrite(Pin_Spule2_Rechtslauf, HIGH);
}
if(akt_PWM_Tastgrad_L2 == 0){
digitalWrite(Pin_Spule2_Linkslauf, LOW);
digitalWrite(Pin_Spule2_Rechtslauf, LOW);
}
if(akt_PWM_Tastgrad_L2 < 0) // Spule 2 Linkslauf
{
digitalWrite(Pin_Spule2_Linkslauf, HIGH);
digitalWrite(Pin_Spule2_Rechtslauf, LOW);
}
// Spule 3
if(akt_PWM_Tastgrad_L3 > 0) //Spule 3 Rechtslauf
{
digitalWrite(Pin_Spule3_Linkslauf, LOW);
digitalWrite(Pin_Spule3_Rechtslauf, HIGH);
}
if(akt_PWM_Tastgrad_L3 == 0) //Spule 3 Null Durchlauf
{
digitalWrite(Pin_Spule3_Linkslauf, LOW);
digitalWrite(Pin_Spule3_Rechtslauf, LOW);
}
if(akt_PWM_Tastgrad_L3 < 0) //Spule 3 Linkslauf
{
digitalWrite(Pin_Spule3_Linkslauf, HIGH);
digitalWrite(Pin_Spule3_Rechtslauf, LOW);
}
analogWrite(Pin_Spule1_Enable, abs(akt_PWM_Tastgrad_L1));
analogWrite(Pin_Spule2_Enable, abs(akt_PWM_Tastgrad_L2));
analogWrite(Pin_Spule3_Enable, abs(akt_PWM_Tastgrad_L3));
Serial.println(akt_PWM_Tastgrad_L1);
ListenPositionsCounter ++;
if(ListenPositionsCounter == Anzahl_Stutzstellen_volle_Periode){
ListenPositionsCounter = 0;
}
//Serial.println(ListenPositionsCounter);
//Serial.println(akt_PWM_Tastgrad_L1);
//Serial.println(akt_PWM_Tastgrad_L2);
}
void loop() {
// put your main code here, to run repeatedly:
}hier ein
hätte jemand eine Idee wo der Fehler liegen könnte bzw. wie ich am besten mit einer Fehlersuche beginne.
Vielen Dank
