PWM timer Uno & Mega2560

Guten Abend/Tag zusammen,

hier mal ein "PWM tester" fuer den Arduino Uno und Mega2560.
Hab diesen hier erstellt, da ich für meine kleine Schrittmotoren Bibliothek, genauer gesagt
für Microstepping, Pins mit der selben PWM Frequenz brauchte.

/*PWM tester UNO and MEGA2560 by grillgemuese 08.2018
  -http://playground.arduino.cc/Main/TimerPWMCheatsheet
  -TCCR0B [timer 0] will change (millis(),delay(),...)
  ----For Arduino Uno R3----
  timer 0x01  0x02  0x03  0x04...
  [0    62500 7812  976   244]  (pin 5, 6)
  1     31250 3906  488   122   (pin 9, 10)
  2     31250 3906  976   488   (pin 3, 11)
  ----For Arduino Mega2560----
  timer 0x01  0x02  0x03  0x04...
  [0    62500 7812  976   244]  (pin 13, 4)
  1     31250 3906  488   122   (pin 12, 11)
  2     31250 3906  976   488   (pin 10, 9)
  3     31250 3906  488   122   (pin 5, 3, 2)
  4     31250 3906  488   122   (pin 8, 7, 6)
  5     31250 3906  488   122   (pin 44, 45, 46)
  ----------------------------
  31250(to fast for semiconductor), 3906(good but noisy), 488(ok but slow)
*/
const uint8_t PWM_Signal = 127; //0-255
#if defined(ARDUINO_AVR_UNO)
const uint8_t PWM_Pin[6] = {3, 5, 6, 9, 10, 11};
#elif defined(ARDUINO_AVR_MEGA2560)
const uint8_t PWM_Pin[15] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46};
#endif

void setup()
{
  //------------timer setting PWM frequency------------
#if defined(ARDUINO_AVR_MEGA2560) || defined(ARDUINO_AVR_UNO)
  //TCCR0B = (TCCR0B & 0b11111000) | 0x03; //0x03 976.5Hz
  TCCR1B = (TCCR1B & 0b11111000) | 0x03; //0x03 490.2Hz
  TCCR2B = (TCCR2B & 0b11111000) | 0x04; //0x03 976.5Hz
#endif
#if defined(ARDUINO_AVR_MEGA2560)
  //---------------------MEGA 2560---------------------
  TCCR3B = (TCCR3B & 0b11111000) | 0x03; //0x03 490.2Hz
  TCCR4B = (TCCR4B & 0b11111000) | 0x03; //0x03 490.2Hz
  TCCR5B = (TCCR5B & 0b11111000) | 0x03; //0x03 490.2Hz
#endif
  //---------------------------------------------------
  for (uint8_t o = 0; o < sizeof(PWM_Pin); o++) pinMode(PWM_Pin[o], OUTPUT);
  for (uint8_t a = 0; a < sizeof(PWM_Pin); a++) analogWrite(PWM_Pin[a], PWM_Signal);
}

void loop() {}

Gruß
grillgemuese :slight_smile:

Erklährst Du mir bitte mal was Microstepping mit PWM zu tun hat?
Grüße Uwe

uwefed:
Erklährst Du mir bitte mal was Microstepping mit PWM zu tun hat?
Grüße Uwe

Aber gerne doch...

Microstepping unterteil meines wissens nach die normale Fullstep Maske in beliebig viele (meist 1/4,1/16)
Schritte. Dies wird möglich durch eine variable Ansteuerung der einzelnen Pole zwischen einem Wechsel von Schritt zu Schritt.
Idealerweise sollte dies durch eine Strombegrenzung erfolgen, da ich aber nur eine H-Brücke und PWM zur verfügung stehen habe versuchte ich damit mein Glück.
stepping+pwm

Microstepping ist bei Stromregelung möglich indem den beiden Spulen pro Microschritt variable Stromstärke beaufschlagt wird.

Das hat nichts mit PWM zu tun.

Zur Stromsteuerung brauchst Du H-Brücken mit extra herausgeführten Masseanschluß an den ein Strommeßwiderstand gegen Masse angeschlossen wird. Einen komparator der den Spannungsabfall am Stromwiderstand mit einer Referenzspannung vergleicht und die H-Brücke anschaltet. Bei Microschritte braucht es dazu ein DAC der die Referenzspannung in Funktion des Microschrittes generiert. Dazu noch eine Verzögerungsschaltung um nicht gleich wieder einzuschalten und eine Decay-Logik um den Strom bei Stromveringerung schnell abzusenken.

Zum Verständnis schau Dir mal die Kombination L297-L298 Für Voll und Halbschritte an.

Grüße Uwe