Frequenz anstelle Pulsbreite (Arduino Step-Dir aus Potisignal)

OP (Firma: Wolftec GmbH) #4092320
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. :-)
(Firma: matzetronics) #4092338
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.
OP (Firma: Wolftec GmbH) #4092365
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 :-)
(Firma: matzetronics) #4092399
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.