Hallöchen, ich bin noch relativ frisch in der Arduino Thematik und habe die letzte Woche ein wenig mit einem Mega rumprobiert. Ich steuere drei DC Motoren über PWM. Weil ich mit der Ausleseauflösung nicht zufrieden war bin ich jetzt auf einen DUE gewechselt um 12 bit zu nutzen. Leider zeigt mein code jetzt auf ein mal einiger sehr merkwürdige Fehler/Verhaltensweisen.
Fehler 1: Ich initialisiere im Setup meine Motoren und setze den PWM jeweils auf null. Wenn ich das bei Motor 1 und 3 mache kein Problem, aber bei Motor 2 gibt er mir auf ein mal eine scheinbar Due spezifische Fehlermeldung: assertion "duty <= pPwm->PWM_CH_NUM[ul_channel].PWM_CPRD" failed: file "../source/pwmc.c", line 272, function: PWMC_SetDutyCycle
Fehler 2: Ich lese testweise einen Poti aus, um alle 3 Motoren speedtechnisch zu steuern. Beim Mega kein Problem, beim Due scheint das Board sich nach ein paar Sekunden aufzuhängen, wenn ich die PWM Ausgänge im Loop verändere..
Hier der ein bisschen abgespeckter Code:
//define motor pins
#define m1p1 2
#define m1p2 3
#define m1pwm 4
#define m1fdb 3
#define m2p1 5
#define m2p2 6
#define m2pwm 7
#define m2fdb 4
#define m3p1 8
#define m3p2 9
#define m3pwm 12
#define m3fdb 5
int mspeed[] = { 0, 0, 0 };
bool mdir[] = { false, false, false };
void setup() {
//initialise motors
//motor01
pinMode(m1p1, OUTPUT);
pinMode(m1p2, OUTPUT);
pinMode(m1pwm, OUTPUT);
setMotorDir(0, mdir[0]);
setMotorSpeed(0, mspeed[0]);
delay(200);
//motor02
pinMode(m2p1, OUTPUT);
pinMode(m2p2, OUTPUT);
pinMode(m2pwm, OUTPUT);
setMotorDir(1, mdir[1]);
setMotorSpeed(1, mspeed[1]); //Fehler 1: Wenn ich diese Zeile ausklammer funktioniert alles..!?
delay(200);
//motor03
pinMode(m3p1, OUTPUT);
pinMode(m3p2, OUTPUT);
pinMode(m3pwm, OUTPUT);
setMotorDir(2, mdir[2]);
setMotorSpeed(2, mspeed[2]);
delay(200);
}
//set the direction of a motor
void setMotorDir(int index, bool dir) {
if (index == 0) {
if (dir) {
digitalWrite(m1p1, LOW);
digitalWrite(m1p2, HIGH);
} else {
digitalWrite(m1p1, HIGH);
digitalWrite(m1p2, LOW);
}
} else if (index == 1) {
if (dir) {
digitalWrite(m2p1, LOW);
digitalWrite(m2p2, HIGH);
} else {
digitalWrite(m2p1, HIGH);
digitalWrite(m2p2, LOW);
}
} else {
if (dir) {
digitalWrite(m3p1, LOW);
digitalWrite(m3p2, HIGH);
} else {
digitalWrite(m3p1, HIGH);
digitalWrite(m3p2, LOW);
}
}
mdir[index] = dir;
}
//set the speed of a motor
void setMotorSpeed(int index, int speed) {
if (index == 0) {
analogWrite(m1pwm, speed);
} else if (index == 1) {
analogWrite(m2pwm, speed);
} else {
analogWrite(m3pwm, speed);
}
mspeed[index] = speed;
}
void loop(){
int pRead = analogRead(0);
int pWrite = map(pRead, 0, 1023, 0, 255);
for (int i = 0; i < 3; i++)
//setMotorSpeed(i, 255); //Fester Wert funktioniert
setMotorSpeed(i,pWrite); // Fehler 2: Dynamischer Wert crasht nach ein paar Sekunden
}
Ich hoffe ihr könnt mir hier ein wenig weiterhelfen..