Hallo Zusammen,
Ich möchte euch gerne um einen Rat fragen, Ich erzeuge mit dem Arduino für eine Externe Schrittmotorensteuerung ein varriables Rechtecksignal (das heißt dutycycle bleibt "konstant 50/50" nur die Wiederholrate ist frei einstellbar.)
Das Problem ist das ein Zyklus auf dem Oszi betrachtet nicht wie er soll High-Low ist sondern im Low kleine Spannungsspitzen im 68khz rhytmus auftreten.
Welches auch die frequenz des Interruptes ist. Sozusagen schaltet der Pin 65K mal in der sekunde mit jetem durchlauf einmal kurz auf High,was schlecht ist, da meine Schrittmotorsteuerung das noch als schrittsignal interpretiert und somit durchdreht.
Ich habe das Problem notdürftig mit einem RC glied "geglättet"( kleiner Kondensator sowie Wiederstand gegen masse am taktausgangspin), was aber nur dürftig funktioniert.
Bitte um Hilfe diese kleine Spannungsspitzten programmiertechnisch zu beseitigen, ich bin ratlos, ist sicher nur eine kleine Codezeile...ach zum Mäuse melken...
int taktPin = 9;
int Motor_drehrichtung = 8;
int joyPin1 = 0; // JoystickX
int joyPin3 = 2; // JoystickZ
float value1 = 0.00; // aktuelle rohdaten vom joystick
float value1_old = 0.00; // alte geglättete daten vom joystick
float value1_Glatt = 0.00; // aktuelle geglättete daten vom joystick
float valueGlatt_B = 0.00;
int value1T = 0; // ist das selbe wie value1_Glatt
float value1_Final=0;
float value1_Final_old=0;
//////////////////////////////Interrupt///////////////////////////////////////////////////
void writetakt( uint8_t val ) {
OCR1A = (val);
}
uint16_t phase = 0;
uint16_t speed = 0;
uint8_t sample = 0;
SIGNAL(TIMER1_OVF_vect){
writetakt(sample);
phase += speed;
if(phase >= 32768)
sample = 255;
else
sample = 0;
if (value1T < 1)
sample = 0;
}
extern volatile unsigned long timer0_overflow_count;
unsigned long hpticks (void)
{
return (timer0_overflow_count << 8) + TCNT0;
}
//////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
pinMode (taktPin, OUTPUT);
pinMode(Motor_drehrichtung, OUTPUT);
////////////// Auch für Interrupt ////////////////////////////////////////////////////////////
TCCR1A = _BV(WGM10) | _BV(COM1A1);
TCCR1B = _BV(CS10) | _BV(WGM12);
TIMSK1 |= _BV(TOIE1);
}
///////////////////////////////////////////////////////////////////////
void loop() {
////////////////////////////////////Joystick einlesen begränzen und glätten///////////////////////
value1 = analogRead(joyPin1);
if (value1 < 10)
value1 = 10;
if (value1 > 1000)
value1 = 1000;
value1_Glatt =((value1 * 0.005) + (value1_old * 0.995));
value1_old = value1_Glatt;
if ((value1_Glatt > 535) && (value1_Glatt < 557) )
value1_Final = 0;
if (value1_Glatt < 536)
{ value1_Final = ((value1_Glatt * -1)+536)*3;
digitalWrite (Motor_drehrichtung,HIGH);
}
if (value1_Glatt > 556)
{ value1_Final = (value1_Glatt-556)*3;
digitalWrite (Motor_drehrichtung,LOW);
}
////////////////////////////////////////////////////////////////////////////
valueGlatt_B =((value1_Final * 0.01) + (value1_Final_old * 0.99));
value1_Final_old = value1_Final;
value1T = valueGlatt_B;
speed = value1T;
Serial.println(value1T);
}