Forum: Mikrocontroller und Digitale Elektronik Frequenz anstelle Pulsbreite (Arduino Step-Dir aus Potisignal)


von Wolfgang B. (Firma: Wolftec GmbH) (wbeppler)


Lesenswert?

hi,

ich muss mit nem arduino ne servoendstufe ansteuern. bisher hatte ich 
nen dc-motor dran und mit PWM die dehzahl abhaengig von nen poti ueber 
die pulsbreite geregelt.

nun habe ich aber Step und Dircetion. Direction ist schon klar, aber wie 
mache anstelle Pulsbreite frequenzaenderung ? nehme ich da auch den 
pwm-ausgang und aendere den teiler staendig oder wie erstelle eine vom 
anlogeingang abhaengige Pulsanzahl/Freqenz am elegantesten ?

danke vorab

gruss

w. :-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wolfgang Beppler schrieb:
> mit nem arduino

Mit welchem? Wenn da z.B. der Mega328 drauf ist, kannst du einen Timer 
in den CTC Modus versetzen und durch Schreiben des Comparematch 
Registers die Ausgangsfrequenz einstellen.
1
 
2
F = F_CPU/2 / Prescaler / Comparematch Wert
Der Ausgang wird auf Toggle programmiert und tut das dann, deswegen noch 
das /2 in der obigen Formel.

von Wolfgang B. (Firma: Wolftec GmbH) (wbeppler)


Lesenswert?

welcher arduino ist mir egal, ich nehm den nur damit ich alles erst mal 
ausprobieren kann und falls ich mehr davon brauche mache ich ne platine

in dem fall gerne 328, den hab ich rumliegen

um den prescaler und compare zu setzten, gibt es das in C oder muss ich 
da auf assembler runter ?

hast du mir ein beispiel ?

danke !

wolfgang :-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wolfgang Beppler schrieb:
> um den prescaler und compare zu setzten, gibt es das in C oder muss ich
> da auf assembler runter ?

Nö, geht in C - etwa so, das hier ist allerdings für das alte Mega8515 
Tier und den 16-bit Timer desselben:
1
// globals
2
uint16_t Prescale,Divisor;
3
// set the generator
4
// to CTC and toggle on compare match
5
static void init_generator(void)
6
{
7
 TCCR1B = (1 << WGM12)| Prescale;
8
 OCR1A = Divisor;
9
 TCCR1A = (0 << COM1A1)|(1 << COM1A0);
10
}
11
12
/* input a frequency and output divider and prescaler
13
 * 
14
 */
15
void setdivider(uint32_t freq) 
16
{
17
  if (freq == 0) freq = 1; // foolproof this
18
  if (freq > 168) {
19
    Prescale = (1 << CS10);
20
  Divisor = 1 + (F_CPU / freq);
21
  }
22
  if ((freq < 169) && (freq > 22)) {
23
    Prescale = (1 << CS11);
24
  Divisor = 1 + ((F_CPU/8) / freq);
25
  }
26
  if (freq < 23) {
27
    Prescale = (1 << CS12);
28
  Divisor = 1 + ((F_CPU/256) / freq);
29
  }
30
  init_generator();
31
}

von Asko B. (dg2brs)


Lesenswert?


von Wolfgang B. (Firma: Wolftec GmbH) (wbeppler)


Lesenswert?

besten dank fuer die anregungen, ist nicht ganz easy zu verstehen aber 
nun weiss ich wie ich weiter googlen muss, DANKE

von Kraut (Gast)


Lesenswert?

Wir haben DC-Motore, die Frage nach Anteuerung einer Endstufe für 
Servomotore und eine Lösung für eine nicht näher genannte Motorenart. 
Möglicherweise braucht der TO was für BLDC.

von Wolfgang B. (Firma: Wolftec GmbH) (wbeppler)


Lesenswert?

hallo kraut,

ich verstehe deinen beitrag nicht, worum geht es ? hast du den text von 
einem uebersetzungsprogramm machen lassen ? ich verstehe auch english.

gruss

w :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.