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
}
