DC Motor mit 3 variablen Leistungsstufen // PWM + Timer 1

Hallo zusammen. Bitte seid umsichtig mit mir, ich bin leider Anfänger und teste grade die Timer mit PWM aus.

Ich würde gerne einen DC-Motor ansteuern, der 3 unterschiedliche Geschwindigkeiten fahren soll. Jede Stufe soll 10s dauern.
Das ganze soll als PWM mit Timer 1 realisiert werden.
Ich arbeite hier mit normalen Schleifen und Abfragen. Es soll wie gesagt ganz unkompliziert funktionieren.
Ich nutze einen ATmega328P und Microchip-Studio.
Im Beispielcode hab ich es mal mit 10, 50 und 100% probiert. Ich hab die Bauteile leider nicht hier, deshalb kann ich es nicht ausprobieren.
Könnt ihr mir noch Tipps geben oder meint ihr das klappt schon so?
Ich habe extra keinen Prescaler gewählt, da die Motoren ja keine hohen Frequenzen mögen.. Danke schonmal!
Grüße, Octupa

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	
int Wert;
DDRB = 0x06;
TCCR1A = 0xB2;
TCCR1B = 0x19;
ICR1 = 10000;
OCR1A = 0;


while (1)
{
	for (Wert = 0; Wert <= 30000; Wert ++)
	{    if (Wert <=10000);
		{ OCR1A = 9000;
			_delay_ms(1);
		}
		
		if (Wert >= 10001 & Wert <= 20000);
		{
			OCR1A = 5000;
			_delay_ms(1);
		}
		
		if (Wert >= 30001);
		{
			OCR1A = 0;
			_delay_ms(1);
		}
	}
}
}

das geht schon mal nicht.

Wo wird eigentlich ein Ausgang geschaltet? Was ist den das eigentliche Ziel? Ist das eine Hausaufgabe?

Dann benutze das Aruino Framework mit millis und analogWrite und du bist in 5 min am Ziel.

Was kommt danach?

Was sind hohe Frequenzen? Wo hast du die Aussage her?

Ich habe hier jetzt 10 ? verbraucht. Also alles sehr unklar.

falsche Usergroup :wink:

// Forensketch
// https://forum.arduino.cc/

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming

//#define DEBUG              // Wenn aktiviert, werden Zwischenwerte ausgegeben

#ifdef DEBUG
  #define DBG_PRINTLN(...) Serial << __VA_ARGS__ << endl
#else
  #define DBG_PRINTLN(...)
#endif

constexpr uint8_t motorPin {8};
constexpr uint32_t intervall {10000};
uint32_t lastmillis;

byte state;

void setup()
{
  Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial << (F("\r\nStart...\r\n")) << endl;
  DBG_PRINTLN(__FILE__);
  DBG_PRINTLN( __TIMESTAMP__);
}

void  loop()

{
  if (millis() - lastmillis > intervall)
  {
    lastmillis = millis();
    state++;
  }
  switch (state)
  {
    case 0:
      analogWrite(motorPin, 0);
      break;
    case 1:
      analogWrite(motorPin, 25);
      break;
    case 2:
      analogWrite(motorPin, 123);
      break;
    case 3:
      analogWrite(motorPin, 255 );
      break;
    default:
      analogWrite(motorPin, 0);
      state = 0;
      break;
  }
}

Wo wird eigentlich ein Ausgang geschaltet? Was ist den das eigentliche Ziel? Ist das eine Hausaufgabe?

Meine Ausgänge sind über den Port B doch genau definiert. Nein, das ist keine Hausaufgabe. Diese Aufgabe war in meiner Klausur dran und ich habe kläglich versagt. Zumindest hab ich das gedacht. Mein Code ist allerdings nicht komplett falsch. Ich wollte mich damit auseinander setzen, da ich mich sehr ärger, dass es nicht besser geklappt hat.

Dann benutze das Aruino Framework mit millis und analogWrite und du bist in 5 min am Ziel.

So hab ich es aber überhaupt nicht gelernt. Wir machen das auf Anfängerniveau.

Was kommt danach?

Danach kommt nichts, das ganze soll in Dauerschleife laufen.

falsche Usergroup :wink:

Sorry, aber danke trotzdem für die Tipps.
Hab das ganze jetzt mit meinem Weg gelöst. Das sollte so funktionieren.

Ich danke euch trotzdem für die Mühe :slight_smile:
Schönes Wochenende!

Nutze das _BV( ) Makro. Das hier kann niemand lesen bzw. ist äußerst mühsam es zu entschlüsseln.

TCCR1A = 0xB2;  
TCCR1B = 0x19; 

Weißt du was du hier konfiguriert hast?
Warum hast du 3 Compare Bits aktiviert?
Prescaler ist 1. Das bedeutet du hast einen Prescaler ausgwählt.
"extra keinen" gibt es in dem Kontext nicht. Entweder man hat einen konfiguriert oder nicht. Der Takt ist 1,6kHz. Es ist übrigens immer eine dumme Idee den Timer einzuschalten bevor er komplett konfiguriert ist.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.