Frequenzerzeugung mit Timer

Ich beschäftige mich damit, einen Schrittmotortreiber mittels Timer1 mit einem Taktsignal zu versorgen.
Soweit funktioniert das auch.
Nur läuft der Motor recht unruhig.
Jetzt habe ich mir mal ein Oszilloskop geliehen und konnte feststellen, das neben dem Rechteckimpuls auch noch einzelne Spikes ausgegeben werden.

edit:
Programm geändert, jetzt ohne Spikes

/* //////////////////////// Hardware, Ein- & Ausgangsbelegung  //////////////////////////////////////////////////////// 

                      Arduino  OQ PCB                                OQ PCB     Arduino             Verwendung
                      -------  ------           ___________          --------   --------            --------------
                               (RESET)-----PC6 |1        28| PC5----(ADC5,SCL)  Dig19 Ana5
                      Dig0(RX) (RXD)-------PD0 |2  o   i 27| PC4----(ADC4,SCA)  Dig18 Ana4
                      Dig1(TX) (TXD)-------PD1 |3  o   i 26| PC3----(ADC3)      Dig17 Ana3
                      Dig2     (INT0)------PD2 |4  o   i 25| PC2----(ADC2)      Dig16 Ana2
                      Dig3     (INT1)------PD3 |5  o   i 24| PC1----(ADC1)      Dig15 Ana1
                      Dig4     (XCK/TO)----PD4 |6  o   i 23| PC0----(ADC0)      Dig14 Ana0  <======= Sollwertvorgabe
                                           VCC |7  o   o 22| GND
                                           GND |8  o   o 21| AREF
                               (XTAL1)-----PB6 |9  i   o 20| AVCC
                               (XTAL2)-----PB7 |10 i   o 19| PB5----(SCK)       Dig13
                      Dig5,PWM (T1)--------PD5 |11 o   o 18| PB4----(MISO)      Dig12
                      Dig6,PWM (AIN0)------PD6 |12 o   o 17| PB3----(MOSI,OC2)  Dig11,PWM
                      Dig7     (AIN1)------PD7 |13 o   o 16| PB2----(SS,OC1B)   Dig10,PWM
                      Dig8     (ICP1)------PB0 |14 o   o 15| PB1----(OC1A)      Dig 9,PWM   =======> Taktausgang
                                                -----------
*/

int Taktausgang   = 9 ;  // Digitalausgang 9 = Taktausgang, ist Hardwaremäßig vorgegeben
int Analogeingang = A0;  // Analogeingang  0 = Sollwertvorgabe zur  Frequenzerzeugung

/////////////////////////// Takterzeugung  //////////////////////////////////////////

uint16_t taktWert = 0;              // Variable für Zählwert 0 - 65535
uint16_t taktSpeed = 0;             // Variable Schrittweite fürs Zählen

SIGNAL(TIMER1_OVF_vect)             // Interruptroutine, wird bei jedem Timerüberlauf aufgerufen
 {                           
 taktWert += taktSpeed;             // taktWert um taktSpeed erhöhen
 if(taktWert >= 45000)              // Rechteck erzeugen, ist Symmetrisch bei 32768
   digitalWrite(Taktausgang, HIGH);
 else
   digitalWrite(Taktausgang, LOW);
 }

//////////////////////// Initialisierung  ///////////////////////////////////////////
void setup() 
{                  
 pinMode(Taktausgang, OUTPUT);        // Taktausgang belegen
 Serial.begin(9600);                  // Kommunikation ermöglichen       
                                      // Timer1 konfigurieren / Registerbits setzen     
 TCCR1A = (1<<WGM10)| (1<<COM1A1);    // Fast PWM 8 bit | Kanal A rücksetzen wenn gleich
 TCCR1B = (1<<CS10) | (1<<WGM12) ;    // Kein Prescaler | Fast PWM 8 bit
 TIMSK1 |= (1<<TOIE1);                // Interruptroutine aktivieren
}
//////////////////////// Programm  //////////////////////////////////////////////////
void loop() 
{
  taktSpeed = analogRead(Analogeingang);          // Schrittmotordrehzahl
  Serial.println(taktSpeed);  // Sollwertausgabe
}

Schirmbild_ardu_Hz.jpg

Wow, schöne regelmäßige Spikes.
Kenn mich mit der direkten Programmierung der Timer nicht gut aus aber mir scheint das ein Timerüberlauf zu sein der den Ausgang kurz H setzt um ihn dann wieder auf L zu setzen.
Grüße Uwe

Danke, zumindest ein Tipp wonach ich weiter suchen könnte.

Das Programm hab ich aus meinem Arduinobuch und dem Forum zusammengepuzzelt.
So wirklich hab ich das mit dem Timer auch noch nicht verstanden.

Da kann ich Dir leider nicht helfen, bin auch nicht so fit mit den Timern.
Grüße Uwe

So, zumindest hab ich mal wieder einiges gelernt :wink:
Der Ausgang war als PWM mit 0 oder 255 geschaltet.
Was für meinen Zweck absolut unnötig ist.
Das kommt dann vom abschreiben unverstandener Programme.

Ich habe das obrige Programm entsprechend abgeändert, sollte jetzt funktionieren.
Kanns erst morgen testen, aber auf meinem alten Hameg siehts ganz gut aus.

Gruß Sascha

SaschaW:
So, zumindest hab ich mal wieder einiges gelernt :wink:
Der Ausgang war als PWM mit 0 oder 255 geschaltet.
Was für meinen Zweck absolut unnötig ist.
Das kommt dann vom abschreiben unverstandener Programme.

Ja, absolut unnötig, auch weil PWM Timer braucht.

Das Abschreiben find ich nicht so schlimm. Schlimm ist, daß die Qualität bestimmter Programme zu wünschen übrig läßt, weil die Programmierer sich zuviel zutrauen, aber nicht auf der Höhe sind.

Hab in einem italienischen Computerjornal mal eine Anleitung gefunden, um mit Arduino von Linux aus ein Relais zu schalten. Die haben doch wiklich um einen Ausgang auf HIGH zu setzen ein neues Programm auf den Arduino geflasht.

SaschaW:
Ich habe das obrige Programm entsprechend abgeändert, sollte jetzt funktionieren.
Kanns erst morgen testen, aber auf meinem alten Hameg siehts ganz gut aus.
Gruß Sascha

Also kennst Du Dich jetzt mit Timer besser aus? :wink: :wink:
Ich halte Dir die Daumen!!

Grüße Uwe