Forum: Mikrocontroller und Digitale Elektronik XMEGA: Waveform generator ungenau


von Curby23523 N. (Gast)


Angehängte Dateien:

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)


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)


Lesenswert?

Was soll denn das?
1
TCE0_CTRLA = 1;

von Curby23523 N. (Gast)


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)


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)


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)


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)


Lesenswert?

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

von Dieter F. (Gast)


Lesenswert?

Nils H. schrieb:
> Der
> TQFP44 hat nur PORTE0-3 ...

Ja - ich vergaß - die A4U-Reihe.

von Curby23523 N. (Gast)


Lesenswert?

Das selbe Problem besteht bei TCD0 ebenfalls.

von Dieter F. (Gast)


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)


Lesenswert?

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

von Dieter F. (Gast)


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)


Lesenswert?

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

von Dieter F. (Gast)


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)


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)


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)


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)


Lesenswert?

Du bist der Chef für Dein Projekt ... :-)

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.