<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Martin+d69</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Martin+d69"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Martin_d69"/>
	<updated>2026-04-16T11:43:54Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105181</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105181"/>
		<updated>2022-05-04T17:28:31Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Neue Fotos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 04.05.2022&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
[[Datei:MoBo.jpg|560px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V mit Hallsensoren&lt;br /&gt;
* Motorcontroller: MP6532 3ph BLDC&lt;br /&gt;
* CPU: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
Die ersten Versuche fanden an einem Original Arduino MKR1000 statt. Dieser ist mit einem Atmel SAMD21 Core ausgestattet. Nachdem klar war, dass die Hardware funktioniert, wurde ein Layout für ein komplettes Mainboard erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cubli_Mainboard.png|360px|Cubli Mainboard TOP]]&lt;br /&gt;
[[Datei:Cubli_Mainboard.bottom.png|360px|Cubli Mainboard BOT]]&lt;br /&gt;
&lt;br /&gt;
===BLDC Endstufe===&lt;br /&gt;
Die ersten Tests mit der Hardware ergaben ein Problem mit der Drehzahlregelung bei kleinen Drehzahlen (n &amp;lt; 0,3 s^-1).&lt;br /&gt;
Ursächlich hierfür war, für den Interrupt nur die steigende Flanke von H1 zu nutzen.&lt;br /&gt;
Somit ergab sich eine Auflösung von 8/rev. (bei 8 Polpaaren) welche für eine saubere Regelung ungenügend war.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung ist das interrupten auf jede Flanke aller 3 Hallsensoren. Somit ergibt sich eine Auflösung von 48/rev. welche schon ausreichend für eine saubere Regelung ist. Hier die Umsetzung mittels kleinem PIC12F1572 und dessen Software.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cubli_BLDC.png|360px|Cubli BLDC TOP]]&lt;br /&gt;
[[Datei:Cubli_BLDC.bottom.png|360px|Cubli BLDC BOT]]&lt;br /&gt;
[[Datei:bldc-endstufe.jpeg|500px|Cubli BLDC Foto]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:11px&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    // initialize the device&lt;br /&gt;
    SYSTEM_Initialize();&lt;br /&gt;
    // Enable the Global Interrupts&lt;br /&gt;
    INTCONbits.GIE = 1;&lt;br /&gt;
    // Enable the Peripheral Interrupts&lt;br /&gt;
    INTCONbits.PEIE = 1;&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // Motor pole pairs: 8 * (6 hall signal edges) = 48 interrupts per rev.&lt;br /&gt;
        // Minimum Motor frequency down to 0,2 Hz * 48 = 9,6 Hz = 104,1666 ms period&lt;br /&gt;
        // The Motors are capable up to 131 Hz * 48 = 7,874 kHz = 127,0002 us period&lt;br /&gt;
        // Check for rotor stall t &amp;gt; 300 ms&lt;br /&gt;
        if(dt &amp;gt;= 30000) {&lt;br /&gt;
            lasttime = 0;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            dt = dt_max;&lt;br /&gt;
            // Set 50% PWM signal&lt;br /&gt;
            for(i = 0; i &amp;lt; 5; i ++)&lt;br /&gt;
                duty[i] = duty_mid;&lt;br /&gt;
        }&lt;br /&gt;
        // Calculate only at continues movement&lt;br /&gt;
        if(hall &amp;gt; 0) {&lt;br /&gt;
            hall = 0;&lt;br /&gt;
            // Update loop period&lt;br /&gt;
            lasttime = time;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            if(dt &amp;lt;= dt_min)&lt;br /&gt;
                dt = dt_min;&lt;br /&gt;
            // Calculate Hall equivalent PWM signal&lt;br /&gt;
            // Range of dt [13 .. 424528]&lt;br /&gt;
            duty[i ++] = duty_mid + (sign * (dt_max / dt));&lt;br /&gt;
        }&lt;br /&gt;
        // Writing to registers&lt;br /&gt;
        if(i &amp;gt;= 4) {&lt;br /&gt;
            // Calculate arithmetic mean&lt;br /&gt;
            for(i = 0; i &amp;lt; 4; i ++)&lt;br /&gt;
                dc += duty[i];&lt;br /&gt;
            // Set calculated DC&lt;br /&gt;
            // Bit shift by extra 2 &amp;lt;-&amp;gt; dc /= 4;&lt;br /&gt;
            PWM1DCH = dc &amp;gt;&amp;gt; 10;     // Writing 8 MSBs to PWMDCH register&lt;br /&gt;
            PWM1DCL = dc &amp;gt;&amp;gt; 2;      // Writing 8 LSBs to PWMDCL register&lt;br /&gt;
            // Clear buffer vars&lt;br /&gt;
            dc = i = 0;&lt;br /&gt;
            // Load settings from Buffer&lt;br /&gt;
            PWM1LDCONbits.LDA = 1;&lt;br /&gt;
        }&lt;br /&gt;
        // Generate a pulse on RA4 (to verify the loop frequency)&lt;br /&gt;
        LATAbits.LATA4 = 1;&lt;br /&gt;
        LATAbits.LATA4 = 0;&lt;br /&gt;
        // Calculate delta t&lt;br /&gt;
        dt = time - lasttime;&lt;br /&gt;
        // Clear WDT&lt;br /&gt;
        CLRWDT();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void __interrupt() INTERRUPT_InterruptManager(void)&lt;br /&gt;
{&lt;br /&gt;
    if(INTCONbits.IOCIE == 1 &amp;amp;&amp;amp; INTCONbits.IOCIF == 1) {&lt;br /&gt;
        // The IOCIF Flag bit is read-only and cleared when all the Interrupt-On-Change flags&lt;br /&gt;
        // in the IOCxF registers have been cleared by software&lt;br /&gt;
        // Clear all IOCxF flags&lt;br /&gt;
        IOCAF = 0x00;&lt;br /&gt;
        // Update field-orientation buffer&lt;br /&gt;
        fo &amp;lt;&amp;lt;= 3;&lt;br /&gt;
        fo |= PORTA &amp;amp; 0x07;&lt;br /&gt;
        // Increment hall signal edges&lt;br /&gt;
        hall ++;&lt;br /&gt;
        // Determine rotation direction&lt;br /&gt;
        switch(fo &amp;amp; 0x3F) {&lt;br /&gt;
            // All positive sequences&lt;br /&gt;
            case 0x2C: sign = 1; break;&lt;br /&gt;
            case 0x26: sign = 1; break;&lt;br /&gt;
            case 0x32: sign = 1; break;&lt;br /&gt;
            case 0x13: sign = 1; break;&lt;br /&gt;
            case 0x19: sign = 1; break;&lt;br /&gt;
            case 0x0D: sign = 1; break;&lt;br /&gt;
            // All negative sequences&lt;br /&gt;
            case 0x0B: sign = -1; break;&lt;br /&gt;
            case 0x1A: sign = -1; break;&lt;br /&gt;
            case 0x16: sign = -1; break;&lt;br /&gt;
            case 0x34: sign = -1; break;&lt;br /&gt;
            case 0x25: sign = -1; break;&lt;br /&gt;
            case 0x29: sign = -1; break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(PIE1bits.TMR2IE == 1 &amp;amp;&amp;amp; PIR1bits.TMR2IF == 1) {&lt;br /&gt;
        // Clear the TMR2 interrupt flag&lt;br /&gt;
        PIR1bits.TMR2IF = 0;&lt;br /&gt;
        // Increment every 10 us&lt;br /&gt;
        time ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin wurde das PWM-Signal, was die Geschwindigkeit des Rotors darstellt, auf 50% DC für 0 rpm geändert. Damit ist auch ein Feedback der momentanen Richtung möglich. Ohne dieses Feedback würde der Regelkreis nur das Vorzeichen der Vorsteuerung kennen.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Cubli_BLDC.bottom.png&amp;diff=105180</id>
		<title>Datei:Cubli BLDC.bottom.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Cubli_BLDC.bottom.png&amp;diff=105180"/>
		<updated>2022-05-04T17:23:56Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
{{subst:Mehrlizenzdateien|Bild-CC-by-sa/3.0/de|Bild-CC-by-sa/3.0|Bild-GFDL-Neu}}&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Cubli_BLDC.png&amp;diff=105179</id>
		<title>Datei:Cubli BLDC.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Cubli_BLDC.png&amp;diff=105179"/>
		<updated>2022-05-04T17:23:08Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
{{subst:Mehrlizenzdateien|Bild-CC-by-sa/3.0/de|Bild-CC-by-sa/3.0|Bild-GFDL-Neu}}&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.bottom.png&amp;diff=105178</id>
		<title>Datei:Cubli Mainboard.bottom.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.bottom.png&amp;diff=105178"/>
		<updated>2022-05-04T17:15:17Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
{{subst:Mehrlizenzdateien|Bild-CC-by-sa/3.0/de|Bild-CC-by-sa/3.0|Bild-GFDL-Neu}}&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.png&amp;diff=105177</id>
		<title>Datei:Cubli Mainboard.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.png&amp;diff=105177"/>
		<updated>2022-05-04T17:13:19Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Martin d69 lud eine neue Version von Datei:Cubli Mainboard.png hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
{{subst:Mehrlizenzdateien|Bild-CC-by-sa/3.0/de|Bild-CC-by-sa/3.0|Bild-GFDL-Neu}}&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.png&amp;diff=105176</id>
		<title>Datei:Cubli Mainboard.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.png&amp;diff=105176"/>
		<updated>2022-05-04T17:12:14Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Martin d69 setzte Datei:Cubli Mainboard.png auf eine alte Version zurück&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
{{subst:Mehrlizenzdateien|Bild-CC-by-sa/3.0/de|Bild-CC-by-sa/3.0|Bild-GFDL-Neu}}&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.png&amp;diff=105175</id>
		<title>Datei:Cubli Mainboard.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.png&amp;diff=105175"/>
		<updated>2022-05-04T17:07:59Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Martin d69 lud eine neue Version von Datei:Cubli Mainboard.png hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
{{subst:Mehrlizenzdateien|Bild-CC-by-sa/3.0/de|Bild-CC-by-sa/3.0|Bild-GFDL-Neu}}&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105174</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105174"/>
		<updated>2022-05-04T16:58:02Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Schreibfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 04.05.2022&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
[[Datei:MoBo.jpg|560px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V mit Hallsensoren&lt;br /&gt;
* Motorcontroller: MP6532 3ph BLDC&lt;br /&gt;
* CPU: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
Die ersten Versuche fanden an einem Original Arduino MKR1000 statt. Dieser ist mit einem Atmel SAMD21 Core ausgestattet. Nachdem klar war, dass die Hardware funktioniert, wurde ein Layout für ein komplettes Mainboard erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cubli_Mainboard.png|360px|Cubli Mainboard]]&lt;br /&gt;
&lt;br /&gt;
===BLDC Endstufe===&lt;br /&gt;
Die ersten Tests mit der Hardware ergaben ein Problem mit der Drehzahlregelung bei kleinen Drehzahlen (n &amp;lt; 0,3 s^-1).&lt;br /&gt;
Ursächlich hierfür war, für den Interrupt nur die steigende Flanke von H1 zu nutzen.&lt;br /&gt;
Somit ergab sich eine Auflösung von 8/rev. (bei 8 Polpaaren) welche für eine saubere Regelung ungenügend war.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung ist das interrupten auf jede Flanke aller 3 Hallsensoren. Somit ergibt sich eine Auflösung von 48/rev. welche schon ausreichend für eine saubere Regelung ist. Hier die Umsetzung mittels kleinem PIC12F1572 und dessen Software.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bldc-endstufe.jpeg|360px|BLDC Endstufe]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:11px&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    // initialize the device&lt;br /&gt;
    SYSTEM_Initialize();&lt;br /&gt;
    // Enable the Global Interrupts&lt;br /&gt;
    INTCONbits.GIE = 1;&lt;br /&gt;
    // Enable the Peripheral Interrupts&lt;br /&gt;
    INTCONbits.PEIE = 1;&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // Motor pole pairs: 8 * (6 hall signal edges) = 48 interrupts per rev.&lt;br /&gt;
        // Minimum Motor frequency down to 0,2 Hz * 48 = 9,6 Hz = 104,1666 ms period&lt;br /&gt;
        // The Motors are capable up to 131 Hz * 48 = 7,874 kHz = 127,0002 us period&lt;br /&gt;
        // Check for rotor stall t &amp;gt; 300 ms&lt;br /&gt;
        if(dt &amp;gt;= 30000) {&lt;br /&gt;
            lasttime = 0;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            dt = dt_max;&lt;br /&gt;
            // Set 50% PWM signal&lt;br /&gt;
            for(i = 0; i &amp;lt; 5; i ++)&lt;br /&gt;
                duty[i] = duty_mid;&lt;br /&gt;
        }&lt;br /&gt;
        // Calculate only at continues movement&lt;br /&gt;
        if(hall &amp;gt; 0) {&lt;br /&gt;
            hall = 0;&lt;br /&gt;
            // Update loop period&lt;br /&gt;
            lasttime = time;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            if(dt &amp;lt;= dt_min)&lt;br /&gt;
                dt = dt_min;&lt;br /&gt;
            // Calculate Hall equivalent PWM signal&lt;br /&gt;
            // Range of dt [13 .. 424528]&lt;br /&gt;
            duty[i ++] = duty_mid + (sign * (dt_max / dt));&lt;br /&gt;
        }&lt;br /&gt;
        // Writing to registers&lt;br /&gt;
        if(i &amp;gt;= 4) {&lt;br /&gt;
            // Calculate arithmetic mean&lt;br /&gt;
            for(i = 0; i &amp;lt; 4; i ++)&lt;br /&gt;
                dc += duty[i];&lt;br /&gt;
            // Set calculated DC&lt;br /&gt;
            // Bit shift by extra 2 &amp;lt;-&amp;gt; dc /= 4;&lt;br /&gt;
            PWM1DCH = dc &amp;gt;&amp;gt; 10;     // Writing 8 MSBs to PWMDCH register&lt;br /&gt;
            PWM1DCL = dc &amp;gt;&amp;gt; 2;      // Writing 8 LSBs to PWMDCL register&lt;br /&gt;
            // Clear buffer vars&lt;br /&gt;
            dc = i = 0;&lt;br /&gt;
            // Load settings from Buffer&lt;br /&gt;
            PWM1LDCONbits.LDA = 1;&lt;br /&gt;
        }&lt;br /&gt;
        // Generate a pulse on RA4 (to verify the loop frequency)&lt;br /&gt;
        LATAbits.LATA4 = 1;&lt;br /&gt;
        LATAbits.LATA4 = 0;&lt;br /&gt;
        // Calculate delta t&lt;br /&gt;
        dt = time - lasttime;&lt;br /&gt;
        // Clear WDT&lt;br /&gt;
        CLRWDT();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void __interrupt() INTERRUPT_InterruptManager(void)&lt;br /&gt;
{&lt;br /&gt;
    if(INTCONbits.IOCIE == 1 &amp;amp;&amp;amp; INTCONbits.IOCIF == 1) {&lt;br /&gt;
        // The IOCIF Flag bit is read-only and cleared when all the Interrupt-On-Change flags&lt;br /&gt;
        // in the IOCxF registers have been cleared by software&lt;br /&gt;
        // Clear all IOCxF flags&lt;br /&gt;
        IOCAF = 0x00;&lt;br /&gt;
        // Update field-orientation buffer&lt;br /&gt;
        fo &amp;lt;&amp;lt;= 3;&lt;br /&gt;
        fo |= PORTA &amp;amp; 0x07;&lt;br /&gt;
        // Increment hall signal edges&lt;br /&gt;
        hall ++;&lt;br /&gt;
        // Determine rotation direction&lt;br /&gt;
        switch(fo &amp;amp; 0x3F) {&lt;br /&gt;
            // All positive sequences&lt;br /&gt;
            case 0x2C: sign = 1; break;&lt;br /&gt;
            case 0x26: sign = 1; break;&lt;br /&gt;
            case 0x32: sign = 1; break;&lt;br /&gt;
            case 0x13: sign = 1; break;&lt;br /&gt;
            case 0x19: sign = 1; break;&lt;br /&gt;
            case 0x0D: sign = 1; break;&lt;br /&gt;
            // All negative sequences&lt;br /&gt;
            case 0x0B: sign = -1; break;&lt;br /&gt;
            case 0x1A: sign = -1; break;&lt;br /&gt;
            case 0x16: sign = -1; break;&lt;br /&gt;
            case 0x34: sign = -1; break;&lt;br /&gt;
            case 0x25: sign = -1; break;&lt;br /&gt;
            case 0x29: sign = -1; break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(PIE1bits.TMR2IE == 1 &amp;amp;&amp;amp; PIR1bits.TMR2IF == 1) {&lt;br /&gt;
        // Clear the TMR2 interrupt flag&lt;br /&gt;
        PIR1bits.TMR2IF = 0;&lt;br /&gt;
        // Increment every 10 us&lt;br /&gt;
        time ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin wurde das PWM-Signal, was die Geschwindigkeit des Rotors darstellt, auf 50% DC für 0 rpm geändert. Damit ist auch ein Feedback der momentanen Richtung möglich. Ohne dieses Feedback würde der Regelkreis nur das Vorzeichen der Vorsteuerung kennen.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.png&amp;diff=105154</id>
		<title>Datei:Cubli Mainboard.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Cubli_Mainboard.png&amp;diff=105154"/>
		<updated>2022-04-27T06:15:45Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
{{subst:Mehrlizenzdateien|Bild-CC-by-sa/3.0/de|Bild-CC-by-sa/3.0|Bild-GFDL-Neu}}&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105153</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105153"/>
		<updated>2022-04-27T05:43:53Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Neues Kapitel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 25.04.2022&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
[[Datei:MoBo.jpg|560px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V mit Hallsensoren&lt;br /&gt;
* Motorcontroller: MP6532 3ph BLDC&lt;br /&gt;
* CPU: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
Die ersten Versuche fanden an einem Original Arduino MKR1000 statt. Dieser ist mit einem Atmel SAMD21 Core ausgestattet. Nachdem klar war, dass die Hardware funktioniert, wurde ein Layout für ein komplettes Mainboard erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cubli_Mainboard.png|360px|Cubli Mainboard]]&lt;br /&gt;
&lt;br /&gt;
===BLDC Endstufe===&lt;br /&gt;
Die ersten Tests mit der Hardware ergaben ein Problem mit der Drehzahlregelung bei kleinen Drehzahlen (n &amp;lt; 0,3 s^-1).&lt;br /&gt;
Ursächlich hierfür war, für den Interrupt nur die steigende Flanke von H1 zu nutzen.&lt;br /&gt;
Somit ergab sich eine Auflösung von 8/rev. (bei 8 Polpaaren) welche für eine saubere Regelung ungenügend war.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung ist das interrupten auf jede Flanke aller 3 Hallsensoren. Somit ergibt sich eine Auflösung von 48/rev. welche schon ausreichend für eine saubere Regelung ist. Hier die Umsetzung mittels kleinem PIC12F1572 und dessen Software.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bldc-endstufe.jpeg|360px|BLDC Endstufe]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:11px&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void) {&lt;br /&gt;
    // initialize the device&lt;br /&gt;
    SYSTEM_Initialize();&lt;br /&gt;
    // Enable the Global Interrupts&lt;br /&gt;
    INTCONbits.GIE = 1;&lt;br /&gt;
    // Enable the Peripheral Interrupts&lt;br /&gt;
    INTCONbits.PEIE = 1;&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Motor poles: 8 -&amp;gt; 8 * (6 hall signal edges) = 48 interrupts per rev&lt;br /&gt;
        // Minimum Motor frequency down to 0,2 Hz * 48 = 9,6 Hz = 104,1666 ms period&lt;br /&gt;
        // The Motors are capable up to 131 Hz * 48 = 7874 Hz = 127,0 us period&lt;br /&gt;
        // Check for rotor stall t &amp;gt; 300 ms&lt;br /&gt;
        if(dt &amp;gt;= 30000) {&lt;br /&gt;
            lasttime = 0;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            dt = dt_max;&lt;br /&gt;
            // Set 50% PWM signal&lt;br /&gt;
            for(i = 0; i &amp;lt; 5; i ++)&lt;br /&gt;
                duty[i] = duty_mid;&lt;br /&gt;
        }&lt;br /&gt;
        // Calculate only at continues movement&lt;br /&gt;
        if(hall &amp;gt; 0) {&lt;br /&gt;
            hall = 0;&lt;br /&gt;
            // Update loop period&lt;br /&gt;
            lasttime = time;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            if(dt &amp;lt;= dt_min)&lt;br /&gt;
                dt = dt_min&lt;br /&gt;
            // Calculate Hall equivalent PWM signal&lt;br /&gt;
            // Range of dt [13 .. 104167]&lt;br /&gt;
            duty[i++] = duty_mid + (sign * (dt_max / dt));&lt;br /&gt;
        }&lt;br /&gt;
        // Writing to registers&lt;br /&gt;
        if(i &amp;gt;= 4) {&lt;br /&gt;
            for(i = 0; i &amp;lt; 4; i ++)&lt;br /&gt;
                dc += duty[i];&lt;br /&gt;
            // Set calculated DC&lt;br /&gt;
            // Bit shift by extra 2 &amp;lt;-&amp;gt; dc /= 4;&lt;br /&gt;
            PWM1DCH = dc &amp;gt;&amp;gt; 10;     // Writing 8 MSBs to PWMDCH register&lt;br /&gt;
            PWM1DCL = dc &amp;gt;&amp;gt; 2;      // Writing 8 LSBs to PWMDCL register&lt;br /&gt;
            // Clear buffer vars&lt;br /&gt;
            dc = i = 0;&lt;br /&gt;
            // Load settings from Buffer&lt;br /&gt;
            PWM1LDCONbits.LDA = 1;&lt;br /&gt;
        }&lt;br /&gt;
        // Generate a pulse on RA4 (to verify the loop frequency)&lt;br /&gt;
        LATAbits.LATA4 = 1;&lt;br /&gt;
        LATAbits.LATA4 = 0;&lt;br /&gt;
        // Calculate delta t&lt;br /&gt;
        dt = time - lasttime;&lt;br /&gt;
        // Clear WDT&lt;br /&gt;
        CLRWDT();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void __interrupt() INTERRUPT_InterruptManager(void) {&lt;br /&gt;
    if(INTCONbits.IOCIE == 1 &amp;amp;&amp;amp; INTCONbits.IOCIF == 1) {&lt;br /&gt;
        // The IOCIF Flag bit is read-only and cleared when all the Interrupt-On-Change flags&lt;br /&gt;
        // in the IOCxF registers have been cleared by software&lt;br /&gt;
        // Clear all IOCxF flags&lt;br /&gt;
        IOCAF = 0x00;&lt;br /&gt;
        // Update field-orientation buffer&lt;br /&gt;
        fo &amp;lt;&amp;lt;= 3;&lt;br /&gt;
        fo |= PORTA &amp;amp; 0x07;&lt;br /&gt;
        // Increment hall signal edges&lt;br /&gt;
        hall ++;&lt;br /&gt;
        // Determine rotation direction&lt;br /&gt;
        switch(fo &amp;amp; 0x3F) {&lt;br /&gt;
            // All positive sequences&lt;br /&gt;
            case 0x2C: sign = 1; break;&lt;br /&gt;
            case 0x26: sign = 1; break;&lt;br /&gt;
            case 0x32: sign = 1; break;&lt;br /&gt;
            case 0x13: sign = 1; break;&lt;br /&gt;
            case 0x19: sign = 1; break;&lt;br /&gt;
            case 0x0D: sign = 1; break;&lt;br /&gt;
            // All negative sequences&lt;br /&gt;
            case 0x0B: sign = -1; break;&lt;br /&gt;
            case 0x1A: sign = -1; break;&lt;br /&gt;
            case 0x16: sign = -1; break;&lt;br /&gt;
            case 0x34: sign = -1; break;&lt;br /&gt;
            case 0x25: sign = -1; break;&lt;br /&gt;
            case 0x29: sign = -1; break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(PIE1bits.TMR2IE == 1 &amp;amp;&amp;amp; PIR1bits.TMR2IF == 1) {&lt;br /&gt;
        // Clear the TMR2 interrupt flag&lt;br /&gt;
        PIR1bits.TMR2IF = 0;&lt;br /&gt;
        // Increment every 10 us&lt;br /&gt;
        time ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin wurde das PWM-Signal, was die Geschwindigkeit des Rotors darstellt, auf 50% DC für 0 rpm geändert. Damit ist auch ein Feedback der momentanen Richtung möglich. Ohne dieses Feedback würde der Regelkreis nur das Vorzeichen der Vorsteuerung kennen.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105152</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105152"/>
		<updated>2022-04-26T16:50:17Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Foto hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 25.04.2022&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
[[Datei:MoBo.jpg|560px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V mit Hallsensoren&lt;br /&gt;
* Motorcontroller: MP6532 3ph BLDC&lt;br /&gt;
* CPU: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
Die ersten Tests mit der Hardware ergaben ein Problem mit der Drehzahlregelung bei kleinen Drehzahlen (n &amp;lt; 0,3 s^-1).&lt;br /&gt;
Ursächlich hierfür war, für den Interrupt nur die steigende Flanke von H1 zu nutzen.&lt;br /&gt;
Somit ergab sich eine Auflösung von 8/rev. (bei 8 Polpaaren) welche für eine saubere Regelung ungenügend war.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung ist das interrupten auf jede Flanke aller 3 Hallsensoren. Somit ergibt sich eine Auflösung von 48/rev. welche schon ausreichend für eine saubere Regelung ist. Hier die Umsetzung mittels kleinem PIC12F1572 und dessen Software.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bldc-endstufe.jpeg|360px|BLDC Endstufe]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:11px&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void) {&lt;br /&gt;
    // initialize the device&lt;br /&gt;
    SYSTEM_Initialize();&lt;br /&gt;
    // Enable the Global Interrupts&lt;br /&gt;
    INTCONbits.GIE = 1;&lt;br /&gt;
    // Enable the Peripheral Interrupts&lt;br /&gt;
    INTCONbits.PEIE = 1;&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Motor poles: 8 -&amp;gt; 8 * (6 hall signal edges) = 48 interrupts per rev&lt;br /&gt;
        // Minimum Motor frequency down to 0,2 Hz * 48 = 9,6 Hz = 104,1666 ms period&lt;br /&gt;
        // The Motors are capable up to 131 Hz * 48 = 7874 Hz = 127,0 us period&lt;br /&gt;
        // Check for rotor stall t &amp;gt; 300 ms&lt;br /&gt;
        if(dt &amp;gt;= 30000) {&lt;br /&gt;
            lasttime = 0;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            dt = dt_max;&lt;br /&gt;
            // Set 50% PWM signal&lt;br /&gt;
            for(i = 0; i &amp;lt; 5; i ++)&lt;br /&gt;
                duty[i] = duty_mid;&lt;br /&gt;
        }&lt;br /&gt;
        // Calculate only at continues movement&lt;br /&gt;
        if(hall &amp;gt; 0) {&lt;br /&gt;
            hall = 0;&lt;br /&gt;
            // Update loop period&lt;br /&gt;
            lasttime = time;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            if(dt &amp;lt;= dt_min)&lt;br /&gt;
                dt = dt_min&lt;br /&gt;
            // Calculate Hall equivalent PWM signal&lt;br /&gt;
            // Range of dt [13 .. 104167]&lt;br /&gt;
            duty[i++] = duty_mid + (sign * (dt_max / dt));&lt;br /&gt;
        }&lt;br /&gt;
        // Writing to registers&lt;br /&gt;
        if(i &amp;gt;= 4) {&lt;br /&gt;
            for(i = 0; i &amp;lt; 4; i ++)&lt;br /&gt;
                dc += duty[i];&lt;br /&gt;
            // Set calculated DC&lt;br /&gt;
            // Bit shift by extra 2 &amp;lt;-&amp;gt; dc /= 4;&lt;br /&gt;
            PWM1DCH = dc &amp;gt;&amp;gt; 10;     // Writing 8 MSBs to PWMDCH register&lt;br /&gt;
            PWM1DCL = dc &amp;gt;&amp;gt; 2;      // Writing 8 LSBs to PWMDCL register&lt;br /&gt;
            // Clear buffer vars&lt;br /&gt;
            dc = i = 0;&lt;br /&gt;
            // Load settings from Buffer&lt;br /&gt;
            PWM1LDCONbits.LDA = 1;&lt;br /&gt;
        }&lt;br /&gt;
        // Generate a pulse on RA4 (to verify the loop frequency)&lt;br /&gt;
        LATAbits.LATA4 = 1;&lt;br /&gt;
        LATAbits.LATA4 = 0;&lt;br /&gt;
        // Calculate delta t&lt;br /&gt;
        dt = time - lasttime;&lt;br /&gt;
        // Clear WDT&lt;br /&gt;
        CLRWDT();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void __interrupt() INTERRUPT_InterruptManager(void) {&lt;br /&gt;
    if(INTCONbits.IOCIE == 1 &amp;amp;&amp;amp; INTCONbits.IOCIF == 1) {&lt;br /&gt;
        // The IOCIF Flag bit is read-only and cleared when all the Interrupt-On-Change flags&lt;br /&gt;
        // in the IOCxF registers have been cleared by software&lt;br /&gt;
        // Clear all IOCxF flags&lt;br /&gt;
        IOCAF = 0x00;&lt;br /&gt;
        // Update field-orientation buffer&lt;br /&gt;
        fo &amp;lt;&amp;lt;= 3;&lt;br /&gt;
        fo |= PORTA &amp;amp; 0x07;&lt;br /&gt;
        // Increment hall signal edges&lt;br /&gt;
        hall ++;&lt;br /&gt;
        // Determine rotation direction&lt;br /&gt;
        switch(fo &amp;amp; 0x3F) {&lt;br /&gt;
            // All positive sequences&lt;br /&gt;
            case 0x2C: sign = 1; break;&lt;br /&gt;
            case 0x26: sign = 1; break;&lt;br /&gt;
            case 0x32: sign = 1; break;&lt;br /&gt;
            case 0x13: sign = 1; break;&lt;br /&gt;
            case 0x19: sign = 1; break;&lt;br /&gt;
            case 0x0D: sign = 1; break;&lt;br /&gt;
            // All negative sequences&lt;br /&gt;
            case 0x0B: sign = -1; break;&lt;br /&gt;
            case 0x1A: sign = -1; break;&lt;br /&gt;
            case 0x16: sign = -1; break;&lt;br /&gt;
            case 0x34: sign = -1; break;&lt;br /&gt;
            case 0x25: sign = -1; break;&lt;br /&gt;
            case 0x29: sign = -1; break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(PIE1bits.TMR2IE == 1 &amp;amp;&amp;amp; PIR1bits.TMR2IF == 1) {&lt;br /&gt;
        // Clear the TMR2 interrupt flag&lt;br /&gt;
        PIR1bits.TMR2IF = 0;&lt;br /&gt;
        // Increment every 10 us&lt;br /&gt;
        time ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin wurde das PWM-Signal, was die Geschwindigkeit des Rotors darstellt, auf 50% DC für 0 rpm geändert. Damit ist auch ein Feedback der momentanen Richtung möglich. Ohne dieses Feedback würde der Regelkreis nur das Vorzeichen der Vorsteuerung kennen.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:MoBo.jpg&amp;diff=105151</id>
		<title>Datei:MoBo.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:MoBo.jpg&amp;diff=105151"/>
		<updated>2022-04-26T16:48:18Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mainboard mit 2x BLDC Endstufe&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105150</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105150"/>
		<updated>2022-04-25T14:00:42Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 25.04.2022&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V mit Hallsensoren&lt;br /&gt;
* Motorcontroller: MP6532 3ph BLDC&lt;br /&gt;
* CPU: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
Die ersten Tests mit der Hardware ergaben ein Problem mit der Drehzahlregelung bei kleinen Drehzahlen (n &amp;lt; 0,3 s^-1).&lt;br /&gt;
Ursächlich hierfür war, für den Interrupt nur die steigende Flanke von H1 zu nutzen.&lt;br /&gt;
Somit ergab sich eine Auflösung von 8/rev. (bei 8 Polpaaren) welche für eine saubere Regelung ungenügend war.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung ist das interrupten auf jede Flanke aller 3 Hallsensoren. Somit ergibt sich eine Auflösung von 48/rev. welche schon ausreichend für eine saubere Regelung ist. Hier die Umsetzung mittels kleinem PIC12F1572 und dessen Software.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bldc-endstufe.jpeg|360px|BLDC Endstufe]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:11px&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void) {&lt;br /&gt;
    // initialize the device&lt;br /&gt;
    SYSTEM_Initialize();&lt;br /&gt;
    // Enable the Global Interrupts&lt;br /&gt;
    INTCONbits.GIE = 1;&lt;br /&gt;
    // Enable the Peripheral Interrupts&lt;br /&gt;
    INTCONbits.PEIE = 1;&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Motor poles: 8 -&amp;gt; 8 * (6 hall signal edges) = 48 interrupts per rev&lt;br /&gt;
        // Minimum Motor frequency down to 0,2 Hz * 48 = 9,6 Hz = 104,1666 ms period&lt;br /&gt;
        // The Motors are capable up to 131 Hz * 48 = 7874 Hz = 127,0 us period&lt;br /&gt;
        // Check for rotor stall t &amp;gt; 300 ms&lt;br /&gt;
        if(dt &amp;gt;= 30000) {&lt;br /&gt;
            lasttime = 0;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            dt = dt_max;&lt;br /&gt;
            // Set 50% PWM signal&lt;br /&gt;
            for(i = 0; i &amp;lt; 5; i ++)&lt;br /&gt;
                duty[i] = duty_mid;&lt;br /&gt;
        }&lt;br /&gt;
        // Calculate only at continues movement&lt;br /&gt;
        if(hall &amp;gt; 0) {&lt;br /&gt;
            hall = 0;&lt;br /&gt;
            // Update loop period&lt;br /&gt;
            lasttime = time;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            if(dt &amp;lt;= dt_min)&lt;br /&gt;
                dt = dt_min&lt;br /&gt;
            // Calculate Hall equivalent PWM signal&lt;br /&gt;
            // Range of dt [13 .. 104167]&lt;br /&gt;
            duty[i++] = duty_mid + (sign * (dt_max / dt));&lt;br /&gt;
        }&lt;br /&gt;
        // Writing to registers&lt;br /&gt;
        if(i &amp;gt;= 4) {&lt;br /&gt;
            for(i = 0; i &amp;lt; 4; i ++)&lt;br /&gt;
                dc += duty[i];&lt;br /&gt;
            // Set calculated DC&lt;br /&gt;
            // Bit shift by extra 2 &amp;lt;-&amp;gt; dc /= 4;&lt;br /&gt;
            PWM1DCH = dc &amp;gt;&amp;gt; 10;     // Writing 8 MSBs to PWMDCH register&lt;br /&gt;
            PWM1DCL = dc &amp;gt;&amp;gt; 2;      // Writing 8 LSBs to PWMDCL register&lt;br /&gt;
            // Clear buffer vars&lt;br /&gt;
            dc = i = 0;&lt;br /&gt;
            // Load settings from Buffer&lt;br /&gt;
            PWM1LDCONbits.LDA = 1;&lt;br /&gt;
        }&lt;br /&gt;
        // Generate a pulse on RA4 (to verify the loop frequency)&lt;br /&gt;
        LATAbits.LATA4 = 1;&lt;br /&gt;
        LATAbits.LATA4 = 0;&lt;br /&gt;
        // Calculate delta t&lt;br /&gt;
        dt = time - lasttime;&lt;br /&gt;
        // Clear WDT&lt;br /&gt;
        CLRWDT();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void __interrupt() INTERRUPT_InterruptManager(void) {&lt;br /&gt;
    if(INTCONbits.IOCIE == 1 &amp;amp;&amp;amp; INTCONbits.IOCIF == 1) {&lt;br /&gt;
        // The IOCIF Flag bit is read-only and cleared when all the Interrupt-On-Change flags&lt;br /&gt;
        // in the IOCxF registers have been cleared by software&lt;br /&gt;
        // Clear all IOCxF flags&lt;br /&gt;
        IOCAF = 0x00;&lt;br /&gt;
        // Update field-orientation buffer&lt;br /&gt;
        fo &amp;lt;&amp;lt;= 3;&lt;br /&gt;
        fo |= PORTA &amp;amp; 0x07;&lt;br /&gt;
        // Increment hall signal edges&lt;br /&gt;
        hall ++;&lt;br /&gt;
        // Determine rotation direction&lt;br /&gt;
        switch(fo &amp;amp; 0x3F) {&lt;br /&gt;
            // All positive sequences&lt;br /&gt;
            case 0x2C: sign = 1; break;&lt;br /&gt;
            case 0x26: sign = 1; break;&lt;br /&gt;
            case 0x32: sign = 1; break;&lt;br /&gt;
            case 0x13: sign = 1; break;&lt;br /&gt;
            case 0x19: sign = 1; break;&lt;br /&gt;
            case 0x0D: sign = 1; break;&lt;br /&gt;
            // All negative sequences&lt;br /&gt;
            case 0x0B: sign = -1; break;&lt;br /&gt;
            case 0x1A: sign = -1; break;&lt;br /&gt;
            case 0x16: sign = -1; break;&lt;br /&gt;
            case 0x34: sign = -1; break;&lt;br /&gt;
            case 0x25: sign = -1; break;&lt;br /&gt;
            case 0x29: sign = -1; break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(PIE1bits.TMR2IE == 1 &amp;amp;&amp;amp; PIR1bits.TMR2IF == 1) {&lt;br /&gt;
        // Clear the TMR2 interrupt flag&lt;br /&gt;
        PIR1bits.TMR2IF = 0;&lt;br /&gt;
        // Increment every 10 us&lt;br /&gt;
        time ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin wurde das PWM-Signal, was die Geschwindigkeit des Rotors darstellt, auf 50% DC für 0 rpm geändert. Damit ist auch ein Feedback der momentanen Richtung möglich. Ohne dieses Feedback würde der Regelkreis nur das Vorzeichen der Vorsteuerung kennen.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105149</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105149"/>
		<updated>2022-04-24T19:16:30Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Source code hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 24.04.2022&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V mit Hallsensoren&lt;br /&gt;
* Motorcontroller: MP6532 3ph BLDC&lt;br /&gt;
* CPU: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
Die ersten Tests mit der Hardware ergaben ein Problem mit der Drehzahlregelung bei kleinen Drehzahlen (n &amp;lt; 0,3 s^-1).&lt;br /&gt;
Ursächlich hierfür war, für den Interrupt nur die steigende Flanke von H1 zu nutzen.&lt;br /&gt;
Somit ergab sich eine Auflösung von 8/rev. (bei 8 Polpaaren) welche für eine saubere Regelung ungenügend war.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung ist das interrupten auf jede Flanke aller 3 Hallsensoren. Somit ergibt sich eine Auflösung von 64/rev. welche schon ausreichend für eine saubere Regelung ist. Hier die Umsetzung mittels kleinem PIC12F1572 und dessen Software.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bldc-endstufe.jpeg|360px|BLDC Endstufe]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:10px&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void) {&lt;br /&gt;
    // initialize the device&lt;br /&gt;
    SYSTEM_Initialize();&lt;br /&gt;
    // Enable the Global Interrupts&lt;br /&gt;
    INTCONbits.GIE = 1;&lt;br /&gt;
    // Enable the Peripheral Interrupts&lt;br /&gt;
    INTCONbits.PEIE = 1;&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Motor poles: 8 -&amp;gt; 8 * (6 hall signal edges) = 48 interrupts per rev&lt;br /&gt;
        // Minimum Motor frequency down to 0,2 Hz * 48 = 9,6 Hz = 104,1666 ms period&lt;br /&gt;
        // The Motors are capable up to 131 Hz * 48 = 7874 Hz = 127,0 us period&lt;br /&gt;
        // Check for rotor stall t &amp;gt; 300 ms&lt;br /&gt;
        if(dt &amp;gt;= 30000) {&lt;br /&gt;
            lasttime = 0;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            dt = dt_max;&lt;br /&gt;
            // Set 50% PWM signal&lt;br /&gt;
            for(i = 0; i &amp;lt; 5; i ++)&lt;br /&gt;
                duty[i] = duty_mid;&lt;br /&gt;
        }&lt;br /&gt;
        // Calculate only at continues movement&lt;br /&gt;
        if(hall &amp;gt; 0) {&lt;br /&gt;
            hall = 0;&lt;br /&gt;
            // Update loop period&lt;br /&gt;
            lasttime = time;&lt;br /&gt;
            // Prevent over- or underflow at uint16 duty&lt;br /&gt;
            if(dt &amp;lt;= 13)&lt;br /&gt;
                dt = dt_min&lt;br /&gt;
            // Calculate Hall equivalent PWM signal&lt;br /&gt;
            // Range of dt [127 .. 104167]&lt;br /&gt;
            duty[i++] = duty_mid + (sign * (dt_max / dt));&lt;br /&gt;
        }&lt;br /&gt;
        // Writing to registers&lt;br /&gt;
        if(i &amp;gt;= 4) {&lt;br /&gt;
            for(i = 0; i &amp;lt; 4; i ++)&lt;br /&gt;
                dc += duty[i];&lt;br /&gt;
            // Set calculated DC&lt;br /&gt;
            // Bit shift by extra 2 -&amp;gt; dc /= 4;&lt;br /&gt;
            PWM1DCH = dc &amp;gt;&amp;gt; 10;     // Writing 8 MSBs to PWMDCH register&lt;br /&gt;
            PWM1DCL = dc &amp;gt;&amp;gt; 2;      // Writing 8 LSBs to PWMDCL register&lt;br /&gt;
            // Clear buffer vars&lt;br /&gt;
            dc = i = 0;&lt;br /&gt;
            // Load settings from Buffer&lt;br /&gt;
            PWM1LDCONbits.LDA = 1;&lt;br /&gt;
        }&lt;br /&gt;
        // Generate a pulse on RA4 (to verify the loop frequency)&lt;br /&gt;
        LATAbits.LATA4 = 1;&lt;br /&gt;
        LATAbits.LATA4 = 0;&lt;br /&gt;
        // Calculate delta t&lt;br /&gt;
        dt = time - lasttime;&lt;br /&gt;
        // Clear WDT&lt;br /&gt;
        CLRWDT();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void __interrupt() INTERRUPT_InterruptManager(void) {&lt;br /&gt;
    if(INTCONbits.IOCIE == 1 &amp;amp;&amp;amp; INTCONbits.IOCIF == 1) {&lt;br /&gt;
        // The IOCIF Flag bit is read-only and cleared when all the Interrupt-On-Change flags&lt;br /&gt;
        // in the IOCxF registers have been cleared by software&lt;br /&gt;
        // Clear all IOCxF flags&lt;br /&gt;
        IOCAF = 0x00;&lt;br /&gt;
        // Update field-orientation buffer&lt;br /&gt;
        fo &amp;lt;&amp;lt;= 3;&lt;br /&gt;
        fo |= PORTA &amp;amp; 0x07;&lt;br /&gt;
        // Increment hall signal edges&lt;br /&gt;
        hall ++;&lt;br /&gt;
        // Determine rotation direction&lt;br /&gt;
        switch(fo &amp;amp; 0x3F) {&lt;br /&gt;
            // All positive sequences&lt;br /&gt;
            case 0x2C: sign = 1; break;&lt;br /&gt;
            case 0x26: sign = 1; break;&lt;br /&gt;
            case 0x32: sign = 1; break;&lt;br /&gt;
            case 0x13: sign = 1; break;&lt;br /&gt;
            case 0x19: sign = 1; break;&lt;br /&gt;
            case 0x0D: sign = 1; break;&lt;br /&gt;
            // All negative sequences&lt;br /&gt;
            case 0x0B: sign = -1; break;&lt;br /&gt;
            case 0x1A: sign = -1; break;&lt;br /&gt;
            case 0x16: sign = -1; break;&lt;br /&gt;
            case 0x34: sign = -1; break;&lt;br /&gt;
            case 0x25: sign = -1; break;&lt;br /&gt;
            case 0x29: sign = -1; break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(PIE1bits.TMR2IE == 1 &amp;amp;&amp;amp; PIR1bits.TMR2IF == 1) {&lt;br /&gt;
        // Clear the TMR2 interrupt flag&lt;br /&gt;
        PIR1bits.TMR2IF = 0;&lt;br /&gt;
        // Increment every 10 us&lt;br /&gt;
        time ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105148</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=105148"/>
		<updated>2022-04-24T18:49:40Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 24.04.2022&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V mit Hallsensoren&lt;br /&gt;
* Motorcontroller: MP6532 3ph BLDC&lt;br /&gt;
* CPU: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
Die ersten Tests mit der Hardware ergaben ein Problem mit der Drehzahlregelung bei kleinen Drehzahlen (n &amp;lt; 0,3 s^-1).&lt;br /&gt;
Ursächlich hierfür war, für den Interrupt nur die steigende Flanke von H1 zu nutzen.&lt;br /&gt;
Somit ergab sich eine Auflösung von 8/rev. (bei 8 Polpaaren) welche für eine saubere Regelung ungenügend war.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung ist das interrupten auf jede Flanke aller 3 Hallsensoren. Somit ergibt sich eine Auflösung von 64/rev. welche schon ausreichend für eine saubere Regelung ist. Hier die Umsetzung mittels kleinem PIC12F1572.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bldc-endstufe.jpeg|360px|BLDC Endstufe]]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bldc-endstufe.jpeg&amp;diff=105147</id>
		<title>Datei:Bldc-endstufe.jpeg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bldc-endstufe.jpeg&amp;diff=105147"/>
		<updated>2022-04-24T18:41:09Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: BLDC Endstufe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
BLDC Endstufe&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
{{subst:Mehrlizenzdateien|Bild-CC-by-sa/3.0/de|Bild-CC-by-sa/3.0|Bild-GFDL-Neu}}&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Martin_d69&amp;diff=104297</id>
		<title>Benutzer:Martin d69</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Martin_d69&amp;diff=104297"/>
		<updated>2021-04-21T09:26:06Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Infos über mich:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Ich habe 2011 studiert an der TUHH mit der Fachrichtung Maschinenbau. Elektronik ist mein großes Hobby, dazu zählt auch der Modellbau.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Meine Ausstattung:&lt;br /&gt;
* Rigol MSO5074&lt;br /&gt;
* Ersa MS6000&lt;br /&gt;
* Atten 858D+&lt;br /&gt;
* Batronix BXM85&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Bevorzugte Bauteile:&lt;br /&gt;
* RCL 0805/0603&lt;br /&gt;
* SSOP/QFN/SOT&lt;br /&gt;
* Microchip PIC (8/16-bit)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Meine Basteleien richten sich alle in die Richtung: etwas sehen, etwas meckern und dann besser nachbauen!&amp;lt;br /&amp;gt;&lt;br /&gt;
Generell bin ich von bedrahteten Bauteilen weg gegangen, da die Leiterplatten zu groß werden und weil es einfach schöner aussieht.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ich kenne mich im Bereich Schaltregler bis derzeit 1Mhz gut aus. Regelschleifen berechnen, Kompensationsnetzwerke anpassen macht mir spaß.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Mein aktuelles Projekt ist ein Punktschweißgerät für Batteriepacks, zum verschweißen der Nickelbänder.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Front 1.jpg&lt;br /&gt;
Front 2.jpg&lt;br /&gt;
PCB 1.jpg&lt;br /&gt;
PCB 2.jpg&lt;br /&gt;
Housing.jpg&lt;br /&gt;
Assembly 1.jpg&lt;br /&gt;
Assembly 2.jpg&lt;br /&gt;
Assembly 3.jpg&lt;br /&gt;
Final.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Final.jpg&amp;diff=104296</id>
		<title>Datei:Final.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Final.jpg&amp;diff=104296"/>
		<updated>2021-04-21T09:19:16Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Betriebsbereit&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Assembly_3.jpg&amp;diff=104295</id>
		<title>Datei:Assembly 3.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Assembly_3.jpg&amp;diff=104295"/>
		<updated>2021-04-21T09:18:28Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zusammenbau Fertig&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Assembly_2.jpg&amp;diff=104294</id>
		<title>Datei:Assembly 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Assembly_2.jpg&amp;diff=104294"/>
		<updated>2021-04-21T09:17:30Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zusammenbau Fertig&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Assembly_1.jpg&amp;diff=104293</id>
		<title>Datei:Assembly 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Assembly_1.jpg&amp;diff=104293"/>
		<updated>2021-04-21T09:16:55Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zusammenbau Anfang&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Housing.jpg&amp;diff=104292</id>
		<title>Datei:Housing.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Housing.jpg&amp;diff=104292"/>
		<updated>2021-04-21T09:15:55Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gehäuse&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:PCB_2.jpg&amp;diff=104291</id>
		<title>Datei:PCB 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:PCB_2.jpg&amp;diff=104291"/>
		<updated>2021-04-21T09:15:05Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Leiterplatte&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:PCB_1.jpg&amp;diff=104290</id>
		<title>Datei:PCB 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:PCB_1.jpg&amp;diff=104290"/>
		<updated>2021-04-21T09:14:42Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Leiterplatte&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Front_1.jpg&amp;diff=104289</id>
		<title>Datei:Front 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Front_1.jpg&amp;diff=104289"/>
		<updated>2021-04-21T09:13:54Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Frontplatte Außen&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Front_2.jpg&amp;diff=104288</id>
		<title>Datei:Front 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Front_2.jpg&amp;diff=104288"/>
		<updated>2021-04-21T09:12:54Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Frontplatte Innenseite&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97543</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97543"/>
		<updated>2017-10-16T11:15:46Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: Motorcontroller test und ergebnis&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 16.10.2017&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V mit Hallsensoren&lt;br /&gt;
* Motorcontroller: MP6532&lt;br /&gt;
* CPU: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
Die ersten Tests mit der Hardware ergaben ein Problem mit der Drehzahlregelung bei kleinen Drehzahlen (n &amp;lt; 0,3 s^-1).&lt;br /&gt;
Ursächlich hierfür war, für den Interrupt nur die steigende Flanke von H1 zu nutzen.&lt;br /&gt;
Somit ergab sich eine Auflösung von 8/rev. (bei 8 Polpaaren) welche für eine saubere Regelung ungenügend war.&lt;br /&gt;
Eine mögliche Lösung ist das interrupten auf jede Flanke aller 3 Hallsensoren. Somit ergibt sich eine Auflösung von 64/rev. welche schon ausreichend für eine saubere Regelung ist.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:ARM Cortex Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97057</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97057"/>
		<updated>2017-08-28T12:43:06Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 28.08.2017&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V&lt;br /&gt;
* Controller: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpVGp4QVF3Nk95NjQ/view?usp=sharing Schaltplan MoBo]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://drive.google.com/file/d/0B25GsnP9k-kpYVA5c0FNRkx2WFU/view?usp=sharing Schaltplan BLDC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:ARM Cortex Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97056</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97056"/>
		<updated>2017-08-28T12:28:31Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 28.08.2017&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V&lt;br /&gt;
* Controller: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:ARM Cortex Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97055</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97055"/>
		<updated>2017-08-28T12:24:52Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 28.08.2017&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|360px|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
== Technik ==&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V&lt;br /&gt;
* Controller: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM Cortex Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Cubli.png&amp;diff=97054</id>
		<title>Datei:Cubli.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Cubli.png&amp;diff=97054"/>
		<updated>2017-08-28T12:14:07Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97053</id>
		<title>Cubli, ein Würfel mit Lageregelung zum Aufrichten und Ballancieren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cubli,_ein_W%C3%BCrfel_mit_Lageregelung_zum_Aufrichten_und_Ballancieren&amp;diff=97053"/>
		<updated>2017-08-28T12:12:48Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: cubli - a cube that can jump up and balance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Fast jeder kennt Ihn, den Würfel welche Forscher des &#039;&#039;Instituts für dynamische Systeme&#039;&#039; der &#039;&#039;ETH Zürich&#039;&#039; entwickelt haben. Es wurde schon häufig versucht Ihn zu kopieren, jedoch sind ebenso viele daran gescheitert. Die Technik gleicht einem inversen Pendel. Die Mathematik dahinter sind Differentialgleichungen eines nichtlinearem Systems 4. Ordnung.&lt;br /&gt;
&lt;br /&gt;
Ich möchte mit euch zusammen dieses tolle Projekt erneut entwickeln. Der aktuelle Projektstand wird regelmäßig von mir aktualisiert. Letztes Update 28.08.2017&lt;br /&gt;
&lt;br /&gt;
[[Datei:cubli.png|Cubli Konstruktion]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technik&#039;&#039;&#039;&lt;br /&gt;
* Motoren: Maxon EC45 flat 12V&lt;br /&gt;
* Controller: Basierend auf Arduino MKR1000&lt;br /&gt;
* Sensoren: MPU-9250 (Anzahl u. Anordnung TBD)&lt;br /&gt;
* Akku: LiPo 3S 1500mAh&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Martin_d69&amp;diff=86515</id>
		<title>Benutzer:Martin d69</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Martin_d69&amp;diff=86515"/>
		<updated>2015-01-06T13:34:27Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Infos über mich:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Ich bin seit 10/2011 Student an der TUHH mit der Fachrichtung Maschinenbau. Elektronik ist mein großes Hobby!&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Meine Ausstattung:&lt;br /&gt;
* OWON PDS8102T&lt;br /&gt;
* Ersa MS6000&lt;br /&gt;
* Atten 858D+&lt;br /&gt;
* Batronix BXM85&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Bevorzugte Bauteile:&lt;br /&gt;
* RCL 0805/0603&lt;br /&gt;
* SSOP/QFN/SOT&lt;br /&gt;
* Microchip PIC&lt;br /&gt;
* Infineon XMC&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Meine Basteleien richten sich alle in die Richtung: etwas sehen, etwas meckern und dann besser nachbauen!&amp;lt;br /&amp;gt;&lt;br /&gt;
Generell bin ich von bedrahteten Bauteilen weg gegangen, da die Leiterpletten zu groß werden und weil es einfach schöner aussieht.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ich kenne mich im bereich Schaltregler bis derzeit 1Mhz gut aus. Regelschleifen berechnen, Kompensationsnetzwerke anpassen macht mir spaß. Mein aktuelles Projekt ist ein SMPS mit Planartrafo (3.5kW max).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Bezugsquellen sind eigentlich nur Reichelt, Mouser und Völkner.&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83767</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83767"/>
		<updated>2014-07-17T20:01:40Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* Bilder zum Projekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
Die Software wurde in Microsoft&amp;amp;#174; VisualStudio C# programmiert und ist auch als Sourcecode im Downloadbereich zu finden. Es wurde während der Programmierung besonders auf ein sauberes exception handling geachtet um Programmabstürze zu verhindern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die special GPIO Version gibt dem Nachbauer außerdem die Chance seinen eigenen Code auf einfache Weise zu ergänzen um z.B. Ausgänge zu schalten welche weitere Funktionen triggern uvm.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png|400px]] || [[Bild:xmcontrol_v1.1.2.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (basic version incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|thumb|260px|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|thumb|260px|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|thumb|260px|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|thumb|260px|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|thumb|260px|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|thumb|260px|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|thumb|260px|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|thumb|260px|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|thumb|260px|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:30px;padding-bottom:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:testaufbau_v01.jpg|thumb|170px|Basic Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:70px;transform:rotate(-8deg);&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:final_v01.jpg|thumb|270px|Extended Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:-10px;transform:rotate(6deg);&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_mit_boden_v1.2.jpg|thumb|270px|Ohne Gehäuseoberteil]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_s1000.jpg|thumb|260px|Messung Sinussignal 1000Hz [500µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_t1000.jpg|thumb|260px|Messung Dreiecksignal 1000Hz [500µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_q100k.jpg|thumb|260px|Messung Rechtecksignal 100kHz [5µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83766</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83766"/>
		<updated>2014-07-17T19:59:07Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* Bilder zum Projekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
Die Software wurde in Microsoft&amp;amp;#174; VisualStudio C# programmiert und ist auch als Sourcecode im Downloadbereich zu finden. Es wurde während der Programmierung besonders auf ein sauberes exception handling geachtet um Programmabstürze zu verhindern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die special GPIO Version gibt dem Nachbauer außerdem die Chance seinen eigenen Code auf einfache Weise zu ergänzen um z.B. Ausgänge zu schalten welche weitere Funktionen triggern uvm.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png|400px]] || [[Bild:xmcontrol_v1.1.2.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (basic version incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|thumb|260px|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|thumb|260px|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|thumb|260px|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|thumb|260px|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|thumb|260px|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|thumb|260px|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|thumb|260px|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|thumb|260px|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|thumb|260px|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:30px;padding-bottom:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:testaufbau_v01.jpg|thumb|170px|Basic Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:60px;transform:rotate(-8deg);&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:final_v01.jpg|thumb|270px|Extended Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:0px;transform:rotate(11deg);&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_mit_boden_v1.2.jpg|thumb|270px|Extended Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_s1000.jpg|thumb|260px|Messung Sinussignal 1000Hz [500µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_t1000.jpg|thumb|260px|Messung Dreiecksignal 1000Hz [500µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_q100k.jpg|thumb|260px|Messung Rechtecksignal 100kHz [5µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Platine_bestueckt_mit_boden_v1.2.jpg&amp;diff=83765</id>
		<title>Datei:Platine bestueckt mit boden v1.2.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Platine_bestueckt_mit_boden_v1.2.jpg&amp;diff=83765"/>
		<updated>2014-07-17T19:58:52Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83731</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83731"/>
		<updated>2014-07-16T19:26:40Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* Bilder zum Projekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
Die Software wurde in Microsoft&amp;amp;#174; VisualStudio C# programmiert und ist auch als Sourcecode im Downloadbereich zu finden. Es wurde während der Programmierung besonders auf ein sauberes exception handling geachtet um Programmabstürze zu verhindern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die special GPIO Version gibt dem Nachbauer außerdem die Chance seinen eigenen Code auf einfache Weise zu ergänzen um z.B. Ausgänge zu schalten welche weitere Funktionen triggern uvm.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png|400px]] || [[Bild:xmcontrol_v1.1.2.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (basic version incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|thumb|260px|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|thumb|260px|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|thumb|260px|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|thumb|260px|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|thumb|260px|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|thumb|260px|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|thumb|260px|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|thumb|260px|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|thumb|260px|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:100px;padding-bottom:40px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:testaufbau_v01.jpg|thumb|170px|Basic Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:100px;transform:rotate(8deg);&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:final_v01.jpg|thumb|310px|Extended Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_s1000.jpg|thumb|260px|Messung Sinussignal 1000Hz [500µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_t1000.jpg|thumb|260px|Messung Dreiecksignal 1000Hz [500µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_q100k.jpg|thumb|260px|Messung Rechtecksignal 100kHz [5µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83730</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83730"/>
		<updated>2014-07-16T19:25:47Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* Bilder zum Projekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
Die Software wurde in Microsoft&amp;amp;#174; VisualStudio C# programmiert und ist auch als Sourcecode im Downloadbereich zu finden. Es wurde während der Programmierung besonders auf ein sauberes exception handling geachtet um Programmabstürze zu verhindern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die special GPIO Version gibt dem Nachbauer außerdem die Chance seinen eigenen Code auf einfache Weise zu ergänzen um z.B. Ausgänge zu schalten welche weitere Funktionen triggern uvm.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png|400px]] || [[Bild:xmcontrol_v1.1.2.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (basic version incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|thumb|260px|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|thumb|260px|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|thumb|260px|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|thumb|260px|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|thumb|260px|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|thumb|260px|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|thumb|260px|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|thumb|260px|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|thumb|260px|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:100px;padding-bottom:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:testaufbau_v01.jpg|thumb|170px|Basic Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:100px;transform:rotate(8deg);&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:final_v01.jpg|thumb|310px|Extended Edition]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_s1000.jpg|thumb|260px|Messung Sinussignal 1000Hz [500µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_t1000.jpg|thumb|260px|Messung Dreiecksignal 1000Hz [500µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:messung_q100k.jpg|thumb|260px|Messung Rechtecksignal 100kHz [5µs/cm]]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83729</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83729"/>
		<updated>2014-07-16T18:46:12Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* Windows Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
Die Software wurde in Microsoft&amp;amp;#174; VisualStudio C# programmiert und ist auch als Sourcecode im Downloadbereich zu finden. Es wurde während der Programmierung besonders auf ein sauberes exception handling geachtet um Programmabstürze zu verhindern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die special GPIO Version gibt dem Nachbauer außerdem die Chance seinen eigenen Code auf einfache Weise zu ergänzen um z.B. Ausgänge zu schalten welche weitere Funktionen triggern uvm.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png|400px]] || [[Bild:xmcontrol_v1.1.2.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (basic version incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|thumb|260px|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|thumb|260px|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|thumb|260px|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|thumb|260px|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|thumb|260px|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|thumb|260px|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|thumb|260px|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|thumb|260px|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|thumb|260px|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83724</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83724"/>
		<updated>2014-07-16T15:39:01Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* Windows Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
Die Software wurde in Microsoft&amp;amp;#174; VisualStudio C# programmiert und ist auch als Sourcecode im Downloadbereich zu finden. Es wurde während der Programmierung besonders auf ein sauberes exception handling geachtet um Programmabstürze zu verhindern.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die special GPIO Version gibt dem Nachbauer außerdem die Chance seinen eigenen Code auf einfache Weise zu ergänzen um z.B. Ausgänge zu schalten welche weitere Funktionen triggern uvm.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (basic version incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|thumb|260px|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|thumb|260px|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|thumb|260px|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|thumb|260px|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|thumb|260px|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|thumb|260px|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|thumb|260px|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|thumb|260px|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|thumb|260px|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83722</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83722"/>
		<updated>2014-07-16T15:23:54Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* Gehäuse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|thumb|260px|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|thumb|260px|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|thumb|260px|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|thumb|260px|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|thumb|260px|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|thumb|260px|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|thumb|260px|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|thumb|260px|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|thumb|260px|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83721</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83721"/>
		<updated>2014-07-16T15:23:31Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* Leiterplatte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|thumb|260px|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|thumb|260px|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|thumb|260px|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|thumb|260px|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|thumb|260px|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|thumb|260px|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|miniatur|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|miniatur|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|miniatur|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83719</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83719"/>
		<updated>2014-07-16T15:20:46Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* App Connectivity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|thumb|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|miniatur|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|miniatur|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|miniatur|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|miniatur|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|miniatur|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|miniatur|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|miniatur|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|miniatur|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|miniatur|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83718</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83718"/>
		<updated>2014-07-16T15:19:30Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* App Connectivity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:50px;padding-bottom:120px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|250px|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|miniatur|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|miniatur|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|miniatur|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|miniatur|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|miniatur|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|miniatur|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|miniatur|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|miniatur|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|miniatur|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83717</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83717"/>
		<updated>2014-07-16T15:17:49Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* AD9833 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
[[Bild:ad9833.png|thumb|top|200px|AD9833 Modul]]&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28\;bit}}{25\cdot 10^6\;Hz}=10,73741824s&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:80px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|miniatur|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|miniatur|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|miniatur|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|miniatur|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|miniatur|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|miniatur|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|miniatur|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|miniatur|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|miniatur|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|miniatur|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83715</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83715"/>
		<updated>2014-07-16T15:07:04Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: /* XMC2Go */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
[[Bild:xmc2go.png|thumb|400px|XMC2Go Kit with XMC1100]]&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28}}{25\cdot 10^6}=10,73741824&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Bild:ad9833.png]]&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:80px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|miniatur|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|miniatur|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|miniatur|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|miniatur|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|miniatur|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|miniatur|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|miniatur|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|miniatur|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|miniatur|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|miniatur|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83714</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83714"/>
		<updated>2014-07-16T15:00:42Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;padding-left:250px;padding-top:20px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Bild:xmc2go.png]]&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28}}{25\cdot 10^6}=10,73741824&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Bild:ad9833.png]]&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:80px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|miniatur|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|miniatur|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|miniatur|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|miniatur|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|miniatur|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|miniatur|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|miniatur|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|miniatur|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|miniatur|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|miniatur|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83713</id>
		<title>DDS-Signalgenerator per USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DDS-Signalgenerator_per_USB&amp;diff=83713"/>
		<updated>2014-07-16T14:55:42Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [http://www.mikrocontroller.net/articles/Benutzer:Martin_d69 &#039;&#039;M. Dittrich&#039;&#039;]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center info=&amp;quot;schön das mir diese idee jeder klaut&amp;quot;&amp;gt;&#039;&#039;Dieser Artikel nimmt am Artikelwettbewerb [http://www.mikrocontroller.net/topic/infineon-xmc-design-contest-2014 Infineon XMC Design Contest 2014] teil.&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;anchor:fix;top:170px;left:250px;&amp;quot;&amp;gt;[[Bild:banner.png|600px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Wer kennt es nicht, eine Simulation bringt schönste Ergebnisse und der Testaufbau zeigt starke abweichungen. Solche Probleme könnte man umgehen wenn man frühzeitig an realen Bauteilen testen könnte. Ein Signalgenerator währe das Werkzeug der Wahl! Der Trend elektrischer Geräte geht mehr und mehr in Richtung USB. So laufen moderne Logic Analyzer, genau wie moderne Messgeräte über USB. Lösung ist ein [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS], dies steht für &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis&#039;&#039; und ist ein Verfahren zur Erzeugung periodischer Signale. Dies kann sowohl ein Sinus-, Dreieck- oder Rechtecksignal sein. Nimmt man nun noch einen PWM-Kanal dazu, so hat man wirklich alles wünschenswerte an Signalen parat.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses Projekt beschreibt wie man sich einen qualitativ sehr hochwertigen Signalgenerator für unter 25€ selbst zusammenbauen kann.&amp;lt;br /&amp;gt;Mehr zum Thema DDS findet ihr [http://www.mikrocontroller.net/articles/DDS hier].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Wer jetzt noch der Meinung ist, ein digitaler Signalgenerator sollte auch Protokolle wie I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C oder SPI ausgeben können, der darf gerne weiterlesen! Es gibt eine [[DDS-Signalgenerator_per_USB#Extendet_Edition|&#039;&#039;&#039;extended edition&#039;&#039;&#039;]] welche dies unterstützt.&lt;br /&gt;
Preislich kommen dann noch eine Platine und ein paar Bauteile für ca. 25€ dazu.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Die verwendete Hardware ist ein Infineon &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/evaluation-boards/KIT_XMC_2GO_XMC1100_V1/productType.html?productType=db3a304443537c4e01436ccecb5d154f XMC2Go]&#039;&#039;&#039; und ein &#039;&#039;&#039;[http://www.analog.com/en/rfif-components/direct-digital-synthesis-dds/ad9833/products/product.html#product-documentation AD9833]&#039;&#039;&#039; Modul.&lt;br /&gt;
=== XMC2Go ===&lt;br /&gt;
Die von Infineon entwickelte Hardware basiert auf dem XMC1100 32-bit ARM® Cortex™-M0 Prozessor:&lt;br /&gt;
* 32MHz CPU&lt;br /&gt;
* 64k Flash&lt;br /&gt;
* 16k RAM&lt;br /&gt;
* On-Board J-Link Debugger&lt;br /&gt;
Besonders von Bedeutung ist das XMC4200 Debug IC. Dies ermöglicht uns &#039;&#039;Breakpoints&#039;&#039; im Programm zu definieren, welches ein stückweises Abarbeiten des Programmablaufs ermöglicht. Es ist dabei möglich zwischen jedem Schritt die Werte von Variablen zu beobachten und somit Fehler im Programmcode schnell zu entdecken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Bild:xmc2go.png]]&lt;br /&gt;
=== AD9833 ===&lt;br /&gt;
Der von Analog Devices entwickelte Chip hat folgende Eckdaten:&lt;br /&gt;
* 25MHz Clock&lt;br /&gt;
* 28bit Resolution&lt;br /&gt;
* 2,3V to 5,5V Power supply&lt;br /&gt;
* 12,65mW Power consumption at 3V&lt;br /&gt;
In diesem Projekt können damit Frequenzen bis zu 10MHz generiert werden. Man sollte noch erwähnen, das bei der Umrechnung in HEX Rundungsfehler auftreten. Ein Beispiel:&amp;lt;br /&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{2^{28}}{25\cdot 10^6}=10,73741824&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Gerundet ergibt dies 11, jedoch als Integer nur 10! Dieses Beispiel sollte zeigen das es nicht immer möglich ist die Frequenz exakt vorzugeben.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Bild:ad9833.png]]&lt;br /&gt;
=== GPIO ===&lt;br /&gt;
Das Kürzel GPIO steht für &#039;&#039;&#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;I&#039;&#039;&#039;nput/&#039;&#039;&#039;O&#039;&#039;&#039;utput&#039;&#039; und kennzeichnet Pins welche man wahlweise als als Ein- oder Ausgang konfigurieren kann. Das XMC2Go hat 14 Ports welche diverse Funktionen übernehmen können. Was genau sieht man [http://www.mikrocontroller.net/wikifiles/e/e5/Xmc2go_portlist.png hier]. In diesem Projekt werden die folgenden Pins verwendet:&lt;br /&gt;
* T1 = P0.6&lt;br /&gt;
* LED1 = P1.0&lt;br /&gt;
* LED2 = P1.1&lt;br /&gt;
Mehr dazu und zu den folgenden Punkten findet ihr im [http://www.infineon.com/dgdl/Board_Users_Manual_XMC_2Go_Kit_with_XMC1100_R1.0.pdf?folderId=db3a30433580b3710135a47f3eb76c98&amp;amp;fileId=db3a3043444ee5dc014453d6c75078c6&amp;amp;ack=t XMC2Go Users Manual].&lt;br /&gt;
=== PWM ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Pulsweitenmodulation PWM] steht für &#039;&#039;&#039;&#039;&#039;P&#039;&#039;&#039;ulse-&#039;&#039;&#039;W&#039;&#039;&#039;idth &#039;&#039;&#039;M&#039;&#039;&#039;odulation&#039;&#039; und beschreibt ein Rechtecksignal mit einstellbarem Tastgrad (engl. Duty Cycle). Zum Betrieb dieses Moduls wird lediglich die Frequenz und der Tastgrad angegeben. In diesem Projekt wird der folgende Pin verwendet:&lt;br /&gt;
* PWM = P0.5&lt;br /&gt;
Auf die Programmierung des Moduls wird später genauer eingegangen.&lt;br /&gt;
=== SPI ===&lt;br /&gt;
Das Kürzel [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI] steht für &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;I&#039;&#039;&#039;nterface&#039;&#039; und beschreibt ein Modul zur seriellen Datenübertragung. Zum Betrieb dieses Moduls werden maximal 4 GPIO Pins benötigt:&lt;br /&gt;
* SDI/MISO = P0.6&lt;br /&gt;
* SDO/MOSI = P0.7&lt;br /&gt;
* CLK/SCLK = P0.8&lt;br /&gt;
* CS/SS/FSYNC = P0.9&lt;br /&gt;
Man unterscheidet jedoch zwischen Vollduplex, Halbduplex und Simplex. Wenn Daten nur in der Richtung XMC -&amp;gt; AD9833 gesendet werden sollen, spricht man auch von MTSR also &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;T&#039;&#039;&#039;ransmit &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;R&#039;&#039;&#039;eceive&#039;&#039;. Dies wird dann als Simplex Kommunikation beschrieben und benötigt lediglich die SDO, CLK und CS Pins des XMC&#039;s. Halbduplex wähe der Fall das man Master &amp;lt;-|-&amp;gt; Slave (senden oder empfangen) kann und Vollduplex währe für Master &amp;lt;-&amp;amp;-&amp;gt; Slave (gleichzeitig senden und empfangen). Hierbei benötigt man die SDI, SDO, CLK und CS Pins des XMC&#039;s. Mehr dazu findet ihr [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface hier].&lt;br /&gt;
=== UART ===&lt;br /&gt;
Das [http://www.mikrocontroller.net/articles/UART UART] Modul ist anfangs sehr komplex, es zeigt sich jedoch als sehr nützlich. Wenn man die interne USB &amp;lt;-&amp;gt; UART Bridge verwenden möchte, konfiguriert man wie folgt:&lt;br /&gt;
* Tx = P2.1&lt;br /&gt;
* Rx = P2.2&lt;br /&gt;
Man beachte das diese Pins auf dem XMC2Go nicht herausgeführt wurden! Nach Inbetriebnahme kann man mit beliebigen Terminal-Programmen mit dem XMC kommunizieren. Ich empfehle hierzu [http://www.der-hammer.info/terminal HTerm].&lt;br /&gt;
=== Extendet Edition ===&lt;br /&gt;
Vorteil der Extended Edition sind nicht nur die zusätzlichen Funktionen sondern auch ein schickes Gehäuse. Jedoch reicht in diesem Fall der Hardwareumfang des XMC2Go nicht mehr ganz aus. Der Grund warum zusätzliche Hardware von nöten ist, ist einfach begründet: Der XMC2Go verfügt nur über zwei USIC Channel. Einer wird für die Kommunikation über UART reserviert, der andere für die Kommunikation über SPI. Dies ist aber keineswegs schlecht weil eh ein Kurzschlußschutz der GPIO Pins benötigt wird! Diese fähigkeit sowie die Spannungsfestigkeit bis 5V aller GPIO&#039;s bringt der SC18IS600 Chip mit sich.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zusammengefasst ergibt uns die Erweiterung folgende Schnittstellen:&lt;br /&gt;
* PWM out&lt;br /&gt;
* AD in&lt;br /&gt;
* GPIO in/out&lt;br /&gt;
* SPI in/out&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C in/out&lt;br /&gt;
Das erweitert die Einsetzbarkeit dieses Werkzeugs enorm!&lt;br /&gt;
==== NXP SC18IS600 Chip ====&lt;br /&gt;
Bei diesem IC handelt es sich um ein SPI zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C Umsetzer. Desweiteren ergänzt dieser Chip ein vorhandenes System um sechs GPIO Pins, von denen zwei quasi-bidirectional sein können.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Als Entwicklungsumgebung bietet Infineon DAVE3 an. Der vorteil dieser IDE ist eine grafische Benutzeroberfläche. Diese bietet vorgefertigte Apps, quasi Templates, zur schnellen Initialisierung verschiedenster Module.&lt;br /&gt;
=== App Connectivity ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:dave_apps.png]] || &amp;lt;div style=&amp;quot;padding-left:80px;padding-bottom:210px;&amp;quot;&amp;gt;[[Bild:dave_apps_extended.png|miniatur|DAVE3 App Connectivity (extended version)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;DAVE3 App Connectivity (basic version)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Frequency Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 28bit stream /*/&lt;br /&gt;
long CalcFreqValue(uint32_t hz) {&lt;br /&gt;
	uint64_t temp;&lt;br /&gt;
	uint32_t freq;&lt;br /&gt;
	temp = hz*(pow(2,28)/25e6);&lt;br /&gt;
	freq = temp;&lt;br /&gt;
	return freq;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Phase Calculation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Calculation of the 14bit stream /*/&lt;br /&gt;
int CalcPhaseValue(uint32_t deg) {&lt;br /&gt;
	uint32_t phase;&lt;br /&gt;
	phase = deg*(pow(2,11)/180);&lt;br /&gt;
	return phase;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== UART Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ If data received via UART /*/&lt;br /&gt;
if((USIC0_CH0-&amp;gt;TRBSR &amp;amp; 0x00000008) == 0) {&lt;br /&gt;
	bool stop_bit = 0;&lt;br /&gt;
	uint8_t cnt = 0;&lt;br /&gt;
	uint8_t pos = 0;&lt;br /&gt;
&lt;br /&gt;
	/*/ Turn on LED1 to show there are incoming data /*/&lt;br /&gt;
	LED(1, 1);&lt;br /&gt;
	&lt;br /&gt;
	/*/ Clear all Arrays to avoid Errors /*/&lt;br /&gt;
	bzero(&amp;amp;Buffer, sizeof(Buffer));&lt;br /&gt;
	bzero(&amp;amp;Freq, sizeof(Freq));&lt;br /&gt;
	bzero(&amp;amp;Phase, sizeof(Phase));&lt;br /&gt;
	bzero(&amp;amp;Value, sizeof(Value));&lt;br /&gt;
&lt;br /&gt;
	/*/ Store FIFO data into Buffer[0...n] /*/&lt;br /&gt;
	while(!stop_bit) {&lt;br /&gt;
		Buffer[pos] = (USIC0_CH0-&amp;gt;OUTR &amp;amp; 0x0000FFFF);&lt;br /&gt;
		if(Buffer[pos] == &#039;\0&#039;)&lt;br /&gt;
			stop_bit = 1;&lt;br /&gt;
		pos++;&lt;br /&gt;
	}&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
	.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== SPI Communication ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*/ Clear status flags /*/&lt;br /&gt;
void SPI001_Clear() {&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
	SPI001_ClearFlag(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Wait until data has been sent /*/&lt;br /&gt;
void SPI001_WaitForOK() {&lt;br /&gt;
	uint8_t Status1 = 0;&lt;br /&gt;
	uint8_t Status2 = 0;&lt;br /&gt;
	do {&lt;br /&gt;
		Status1 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_RECV_IND_FLAG);&lt;br /&gt;
		Status2 = SPI001_GetFlagStatus(&amp;amp;SPI001_Handle0,SPI001_ALT_RECV_IND_FLAG);&lt;br /&gt;
	} while(!((Status1 == SPI001_SET) || (Status2 == SPI001_SET)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 2x 14bit /*/&lt;br /&gt;
Data[1] = (CalcFreqValue(DesiredFreq) &amp;amp; 0x3FFF) + 0x4000;&lt;br /&gt;
Data[2] = (CalcFreqValue(DesiredFreq) &amp;gt;&amp;gt; 14) + 0x4000;&lt;br /&gt;
&lt;br /&gt;
/*/ Shifting 12bit /*/&lt;br /&gt;
Data[5] = (CalcPhaseValue(DesiredPhase) &amp;amp; 0x3FFF) + 0xC000;&lt;br /&gt;
&lt;br /&gt;
/*/ Send data to Chip /*/&lt;br /&gt;
SPI001_Clear();&lt;br /&gt;
EnableStartOfFrame(SPI001_Handle0);&lt;br /&gt;
for(int i=0; i&amp;lt;sizeof(Data)/sizeof(Data[0]); i++) {&lt;br /&gt;
	SPI001_WriteData(&amp;amp;SPI001_Handle0,&amp;amp;Data[i],SPI001_STANDARD);&lt;br /&gt;
}&lt;br /&gt;
SPI001_WaitForOK();&lt;br /&gt;
EnableEndOfFrame(SPI001_Handle0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Special GPIO Pins ===&lt;br /&gt;
This is a user defined Area. You can write any kind of code inside this Prototype or leave it blank if it&#039;s not used.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the &amp;lt;io:***&amp;gt; Parameter is unused.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Example: &amp;lt;io:255&amp;gt; gives the following&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t Special[] = {2, 5, 5, \0}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing with HTerm ===&lt;br /&gt;
For first Tests we can use HTerm. Take advantage of the following settings:&lt;br /&gt;
* 115200 Baud&lt;br /&gt;
* 8 Data bits&lt;br /&gt;
* 1 Stop bit&lt;br /&gt;
* Parity: none&lt;br /&gt;
Example ASC-Command: s,f:2000000,p:180,io:63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Or the same in short form: s,2000000,180,63 &amp;lt;NULL on Enter&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Result: Sine Wave, 2MHz, 180° Phase shift, 6-bit special GPIO register&lt;br /&gt;
=== Windows Application ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:xmcontrol_v1.0.4.png]] || [[Bild:xmcontrol_v1.1.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;XMControl v1.0.4 (basic version)&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;XMControl v1.1.2 (incl. special GPIO register)&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fertigung ==&lt;br /&gt;
Die Fertigung der Einzelteile beschränkt sich auf die &#039;&#039;&#039;extended edition&#039;&#039;&#039;, da es nur für diese Version externe Hardware benötigt. Daher kann dieser Schritt für den Bau der basic edition übersprungen werden.&lt;br /&gt;
=== Leiterplatte ===&lt;br /&gt;
Die Platine wurde in Eagle entworfen. Diese beinhaltet einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.analog.com/static/imported-files/data_sheets/AD8368.pdf AD8368] VGA/AGC amplifier und einen &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;[http://www.nxp.com/documents/data_sheet/SC18IS600.pdf SC18IS600] IO-Interface Chip.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s01_v1.2.png|miniatur|Schaltplan des XMC2Go/AD9833]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s02_v1.2.png|miniatur|Schaltplan des SC18IS600]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:schaltplan_s03_v1.2.png|miniatur|Schaltplan des AD8368]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_nested_v1.2.png|miniatur|Board komplett]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_top_v1.2.jpg|miniatur|Patine (roh)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:platine_bestueckt_v1.2.jpg|miniatur|Patine (bestückt)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;optional&lt;br /&gt;
=== Gehäuse ===&lt;br /&gt;
Bei dem Gehäuse habe ich mich, passend zum Wettbewerb, an ein 3D-gedrucktes Teil aus ABS gehalten. Dieses wurde mir netterweise von Claudio H. ([http://www.mikrocontroller.net/topic/335794 siehe Beitrag]) angefertigt. Entworfen wurde das Gehäuse in SolidWorks. Dabei wurde auch die Montagefähigkeit überprüft, da die Platine schräg eingeklappt wird. Die STL-Dateien findet man ebenfalls im Downloadbereich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;display:table;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_01.jpg|miniatur|Gehäuse leicht angeschliffen]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_02.jpg|miniatur|Gehäuse Innenansicht]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;display:table-cell;padding-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:gehäuse_03.jpg|miniatur|Gehäuse nach Aceton-Dampf-Behandlung]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder zum Projekt ==&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;180px&amp;quot;&amp;gt;&lt;br /&gt;
Datei:testaufbau_v01.jpg|&amp;lt;center&amp;gt;Basic Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:final_v01.jpg|&amp;lt;center&amp;gt;Extended Edition&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_s1000.jpg|&amp;lt;center&amp;gt;Messung Sinussignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_t1000.jpg|&amp;lt;center&amp;gt;Messung Dreiecksignal 1000Hz [500µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
Datei:messung_q100k.jpg|&amp;lt;center&amp;gt;Messung Rechtecksignal 100kHz [5µs/cm]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
[http://fileserv.eu/xmcontrol/XMC2Go_Source.zip XMC2Go Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_Source.zip XMControl Sourcecode (basic, newest)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.1.exe XMControl GUI v1.1.2 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/UARTcom_v1.0.exe XMControl GUI v1.0.4 (basic)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Eagle_CAD_v1.2.zip Eagle CAD-Daten v1.2 (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fileserv.eu/xmcontrol/Gehaeuse_CAD.zip Gehäuse STL-Daten (extended)]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Duplex_%28Nachrichtentechnik%29 http://de.wikipedia.org/wiki/Duplex]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Kippschwingung&amp;lt;br /&amp;gt;&lt;br /&gt;
http://de.wikipedia.org/wiki/Pulsweitenmodulation&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.infineonforums.com/forums/8-XMC-Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:Infineon XMC]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:SPI]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;br /&gt;
[[Kategorie:Infineon_XMC_Design_Contest_2014]]&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Banner.png&amp;diff=83712</id>
		<title>Datei:Banner.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Banner.png&amp;diff=83712"/>
		<updated>2014-07-16T14:51:25Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Final_v01.jpg&amp;diff=83711</id>
		<title>Datei:Final v01.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Final_v01.jpg&amp;diff=83711"/>
		<updated>2014-07-16T14:04:36Z</updated>

		<summary type="html">&lt;p&gt;Martin d69: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Martin d69</name></author>
	</entry>
</feed>