XMEGA: Waveform generator ungenau

Gast #5052972
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
}
Angehängte Dateien:
(Firma: L-E-A) #5053009
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.
Gast #5053025
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.
Gast #5053035
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.
Gast #5053045
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.
Gast #5053096
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)
Gast #5053268
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.
Gast #5053347
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.

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.