Forum: Mikrocontroller und Digitale Elektronik XMEGA: Waveform generator ungenau


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Curby23523 N. (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Frage bzgl. der waveform generation des xmega. Ich benutze 
den Atxmega128A4U mit einem 16MHz Quarz. Daraus generiere ich eine 
128MHz PLL (CLK*4) und einen 32MHz CPU Takt.

Ich möchte auf PORTE Pin3 eine ca. 500kHz Rechteckfrequenz ausgeben. 
Dazu benutze ich die hires unit mit der CLK*4.

Folgendes Problem besteht:

Versuche ich auf Pin0 diese Frequenz auszugeben funktioniert alles 
bestens und das Ganze ist stabil wie ein Quarz. Verwende ich PIN3 sehe 
ich zwei Prolemfälle.

1. Ich schreibe nur in TCE0.CCD oder TCE0.CCA den compare-Wert. Dann 
sehe ich nur eine undefinierbare Frequenz auf dem Ausgang. Nichts 
verwertbares (siehe screenshot)

2. Ich schreibe den in beide register, TCE0.CCD und TCE0.CCA. Dann sehe 
ich meine 500kHz Frequenz. Wie man dem Screenshot entnehmen kann, aber 
äußerst ungenau. Es hängt nichts am Pin, dieser hängt frei in der Luft 
bis jetzt.

3. Benutze ich Pin0 und nur TCE0.CCA habe ich absolut wie gesagt kein 
Problem.

Ich habe die Vermutung, dass die hires hier probleme macht und mit 
unterschiedlichen registern arbeitet CCA und CCD. Bei exakt 500kHz, wo 
ein sauberer Teil rauskommt, funktioniert es perfekt. Benutze ich 501kHz 
sehe ich diese drift. Auch hier wieder ber Pin0 und nur CCA funktioniert 
es mit beiden Frequenzen. Mache ich die hires unit aus, funktioniert es 
auch auf CCD, dann aber halt nur in sehr groben Schritten.

Was soll das? Oder mache ich selber etwas falsch?

Danke! Mein Code:
1
#include <avr/io.h>
2
#define F_CPU 32000000UL
3
#include "util/delay.h"
4
#define FRQ 321000UL
5
6
int main(void)
7
{
8
  OSC.XOSCCTRL = OSC_FRQRANGE_2TO9_gc | OSC_XOSCSEL_XTAL_16KCLK_gc;        //setrup crystal
9
  OSC.CTRL = OSC_XOSCEN_bm;                            //enable crystal
10
  while(!(OSC.STATUS & OSC_XOSCRDY_bm));                      //wait for crystal
11
  OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 8;                      /*128MHZ PLL*/
12
  OSC.CTRL |= OSC_PLLEN_bm;                            //enable pll    
13
  while(!(OSC.STATUS & OSC_PLLRDY_bm));                      /*wait for pll*/
14
  CCP = CCP_IOREG_gc;                                /* Disable register security for clock update */
15
  CLK.PSCTRL = CLK_PSBCDIV_2_2_gc;                        /*Divider for system clock*/
16
  CCP = CCP_IOREG_gc;                                /* Disable register security for clock update */
17
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;                          /* Switch to PLL clock (32MHz)*/
18
  
19
  PORTA.DIR = 0xff;
20
  PORTB.DIR = 0xFF;
21
  PORTC.DIR = 0xFF;
22
  PORTD.DIR = 0xFF;
23
  PORTE.DIR = 0xFF;
24
  
25
  HIRESE.CTRLA = HIRES_HRPLUS_bm | HIRES_HREN_TC0_gc;                //High Resolution aktivieren
26
  TCE0.CNT = 0;
27
  TCE0_CTRLA = 1;                                  //Timer für Ref.Freq. Pitch
28
  TCE0.CTRLB = 0b10000001;                            //CCD; Frequenzmodus
29
  
30
  unsigned long dwFreq = 572000;
31
  
32
  TCE0.CCA = (unsigned long long)32000000*8/(dwFreq*2) - 8;
33
  //TCE0.CCD = (unsigned long long)32000000*8/(dwFreq*2) - 8;
34
  
35
  while(1){
36
  }
37
}

von Volker B. (Firma: L-E-A) (vobs)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bist Du Dir sicher, dass Du "Frequency (FRQ) Waveform Generation" mit 
PWM kombinieren kannst?

Ich würde an Deiner Stelle FAST PWM konfigurieren und das Tastverhältnis 
in CCD auf 50% einstellen -- oder das Layout ändern, so dass OCA 
verwendet werden kann.

Grüßle,
Volker.

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Was soll denn das?
1
TCE0_CTRLA = 1;

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
PWM? Ich will keine PWM :). Ich will eine Rechteckfunktion.
Ich benutze Einen Teiler von 1. Dann weise ich dem TCE0 Mode of 
operation = frequency zu. Dann weise ich dem TCE0 den PIN3 zu (CCD). 
Über TCE0.CCA kann ich nun die Frequenz einstellen.

Von PWM habe ich doch nie gesprochen. Bei einer PWM kann ich mit der 
hires die Auflösung der PWM verbessern, aber nicht die Frequenz. Daher 
bringt mir eine PWM mit 50% duty cycle hier nichts, das habe ich bereits 
probiert.

Ich möchte gerne versuchen die bestehende PCB Lösung zu verwenden. Habe 
ich da einen Bug entdeckt? Da stand nichts von in den Errata.

PS: Auf CCA und CCB funktioniert es. CCC und CCD macht probleme.

TCE0.CTR = 1; bedeutet Prescaler = 1.

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nils H. schrieb:
> Ich benutze Einen Teiler von 1.

Würdest Du, wenn Du

TCE0.CTRLA = 1;       (Mit Punkt und nicht mit Unterstrich)

schreiben würdest.

Nils H. schrieb:
> Über TCE0.CCA kann ich nun die Frequenz einstellen.

Nö, wenn Du CCD aktivierst musst Du auch den Compare-Wert für CCD 
bedienen.

Nils H. schrieb:
> TCE0.CTR = 1; bedeutet Prescaler = 1.

Das Register gibt es nicht.

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
TCE0_CTRLA fuktioniert genauso. Verzeihe mir bitte, BITTE vielmals 
meinen Flüchtigkeitsfehler. Ich meinte natürlich TCE0.CTRLA = 1.

Wenn ich nur CCD bediene kommt Mist. Wenn ich beide bediene habe ich auf 
PIN3  diese Ungenauigkeit. Benutze ich nur CCA (das soll die Frequenz 
bestimmen) kommt Mist heraus.

Benutze ich die selbe Vorgehensweise mit CCA oder CCB geht es bestens. 
Bei CCB muss ich den Compare-Wert auch in CCA+CCB schreiben, sonst kommt 
Mist heraus. Ich habe aber keine Frequenzdrift wie bei CCC oder CCD.

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nils H. schrieb:
> Verzeihe mir bitte, BITTE vielmals
> meinen Flüchtigkeitsfehler. Ich meinte natürlich TCE0.CTRLA = 1

Gerne :-) - wenn Du mir verzeihst, dass ich nicht wusste das
TCE0_CTRLA = 1;
auch funktioniert. Interessant.

Es sieht wirklich so aus, als würde die Frequenz-Generierung nur auf 
Kanal A funktionieren. Nur über CCA kann dazu ein Vergleichswert 
eingestellt werden - das impliziert, dass nur auf Kanal A ein 
entsprechender Compare wirksam ist und nur der dazu korrespondierende 
PIN0 getoggelt wird.

Habe ich hier mit einem ATXmega256A3U mal nachgespielt. Die 
irritierenden Impulsformen auf den anderen Kanälen habe ich auch - 
vermutlich "Überschwinger" (= keine Ahnung).

Im Datenblatt steht es ja so:

For frequency generation the period time (T) is controlled by the CCA 
register instead of PER. The waveform generation
(WG) output is toggled on each compare match between the CNT and CCA 
registers, as shown in Figure 14-14 on page
172.

Du kannst die Ausgabe aber damit
1
PORTE.DIRSET = (1<<PIN4);
2
PORTE.REMAP = PORT_TC0A_bm;

auf PIN4 legen. (Leider geht nur PIN4 - kein anderer)

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wenn es bei dir genauso ist, muss ich wohl ein Redesign machen. Der 
TQFP44 hat nur PORTE0-3 ...

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nils H. schrieb:
> Der
> TQFP44 hat nur PORTE0-3 ...

Ja - ich vergaß - die A4U-Reihe.

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das selbe Problem besteht bei TCD0 ebenfalls.

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nils H. schrieb:
> Das selbe Problem besteht bei TCD0 ebenfalls.

Muss ja lt. Datenblatt - aber da kannst Du ja z.B. den PIN4 nutzen. Ggf. 
musst Du doch auf PWM umschwenken. Auch da kannst Du Hires nutzen.

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wo steht denn im Datenblatt, dass ich nur CCA und CCB für eine präzise 
WG benutzen kann?

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nils H. schrieb:
> Wo steht denn im Datenblatt, dass ich nur CCA und CCB für eine präzise
> WG benutzen kann?

Atmel-8331-8-and-16-bit-AVR-Microcontroller-XMEGA-AU_Manual.pdf

Nur CCA (nicht CCB) - Seite 171/172 - bezogen auf Frequency Waveform 
Generation.

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nun, mit CCB funktioniert es und da dieser besser zugänglich ist, änder 
ich mein Layout hierhin.

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nils H. schrieb:
> Nun, mit CCB funktioniert es

Wenn Du meinst ... das Datenblatt interpretiere ich anders - aber ich 
kann mich ja auch irren :-(

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich finde im Datenblatt steht da wenig zu. Da steht, dass im FWG Mode 
CCA die Frequenz bestimmt und mit CTRLB der Pin angegeben werden kann, 
wo die Frequenz ausgegeben werden soll. Ohne die hires geht das auch auf 
allen Pins. Mit hires nur auf CCA/CCB. Warum auch immer.

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nils H. schrieb:
> und mit CTRLB der Pin angegeben werden kann,
> wo die Frequenz ausgegeben werden soll.

Wo genau? Bezogen auf die Frequenz im "Frequency Mode" ...

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
14.12.2
Bit 7:4 – CCxEN: Compare or Capture Enable
Setting these bits in the FRQ or PWM waveform generation mode of 
operation will override the port output register
for the corresponding OCn output pin.
When input capture operation is selected, the CCxEN bits enable the 
capture operation for the corresponding CC
channel.

von Dieter F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du bist der Chef für Dein Projekt ... :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.