<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=30&amp;t=18693&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-06-26T09:05:56+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=18693&amp;mode</id>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-06-26T09:05:56+01:00</updated>
<published>2017-06-26T09:05:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18693&amp;p=191255#p191255</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18693&amp;p=191255#p191255"/>
<title type="html"><![CDATA[Re: AD9850 /AD9851 Reaktywacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18693&amp;p=191255#p191255"><![CDATA[
Gratuluję zgrabnej biblioteki.<br />Na liście swoich zadań mam te układy, a tu gotowiec na podorędziu.<br />Na pewno wykorzystam, gdy już przyjdzie pora <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 26 cze 2017, o 09:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SP2LUB]]></name></author>
<updated>2017-06-25T17:43:19+01:00</updated>
<published>2017-06-25T17:43:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18693&amp;p=191225#p191225</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18693&amp;p=191225#p191225"/>
<title type="html"><![CDATA[AD9850 /AD9851 Reaktywacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18693&amp;p=191225#p191225"><![CDATA[
Było już trochę powiedziane o układach syntezerów DDS z rodziny AD9850/51. <br />Przyznam że jestem urzeczony tymi układami i ostatni rok czasu spędziłem z nimi wiele fajnych godzin. <br />Na początku na bazie AD9850 chciałem stworzyć sobie swoją własną autorską przystawkę do oscyloskopu, która poszerzała by jego możliwości o coś w rodzaju wobuloskopu pracującego w zakresie od 100KHz do 50MHz. Jako miłośnik raczej wysokich częstotliwości, takie urządzenie mogło by pomóc mi w badaniu filtrów W.CZ oraz P.CZ i tym podobnych czynności. <br />Porzuciłem jednak myśl o budowie przystawi do oscyloskopu i postanowiłem zbudować samodzielne taki właśnie analizator obwodów i filtrów W.CZ. W jednym z wątków przedstawiłem fragmenty moich zmagań z wyświetlaczem graficznym ST7920 który ma posłużyć do obrazowania wykresów pomiarowych w tym urządzeniu. Tutaj chcę przedstawić bibliotekę do właśnie układów DDS AD9850/AD9851.<br /><br />Może to głupie tworzyć bibliotekę do tak prostego układu, i ktoś z bardziej zaawansowanych powie że to przerost formy nad treścią.. Jednak dla mnie to są bardzo fajne informacje których rok temu nie mogłem znaleźć w internecie a przynajmniej podanych w prostej formie zrozumiałej dla takiego elmera jak ja. <br /><br />Układy AD985x to bezpośrednie syntezery częstotliwości które można sterować przez SPI. Można z nich zbudować dokładne generatory sinus i prostokąt z możliwością kontrolowania częstotliwości z dokładnością 1Hz. Prostota ich budowy jest wręcz niebywała. Jeżeli więc ktoś potrzebuje takiego generatora w którym będzie można płynnie zmieniać częstotliwość od niemal zera do 70MHz to zachęcam do sięgnięcia po nie, szczególnie że dostępne są w postaci modułów za śmieszne pieniądze.<br /><br />AD9850 i AD9851 to prawie takie same układy z tą różnicą że AD9850 generuje poprawnego sinusa do 50MHz natomiast AD9851 do 70MHz. Steruje się tymi układami w taki sam sposób, z małą różnicą. Otóż AD9851 wymaga nieco zmienionego bajtu konfiguracyjnego o którym jak zauważyłem bardzo wielu zapomina. W internecie jest sporo narzekających ludzi na rzekomo skopane układy które generują poprawny sinus tylko do 5MHz a powyżej produkują sieczkę. <br />Problem tkwi właśnie w inicjacji tych układów. Reszta to już tylko przyjemna zabawa. <br /><br />Przedstawiam zatem moją elmerską bibliotekę, wypociny lamusa... czy co tam chcecie powiedzieć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />UWAGA ostatni bajt w funkcji SendSpi dla AD9850 powinien być 0x00 natomiast dla AD9851 0x01. Różnica ta wynika z tego że AD9851 sterowany jest zegarem 30MHz i ustawienie tego bitu powoduje włączenie mnożnika tej częstotliwości razy 6 co daje w efekcie 180MHz. Jeżeli o tym zapomnimy i to układ będzie taktowany 30MHz i generowany sinus przestanie praktycznie istnieć powyżej 5MHz.   <br /><br />plik SP_AD9851.c  <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdint.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;SP_AD9851.h&quot;<br /><br /><br /><br /><br /><br /><br />//----------------------------DEFINICJE FUNKCJI-------------------------------------------------//<br /><br /><br />// funkcja inicjalizacji sprzętowego SPI  dla AD985/9851 =LSB First //<br />void InitSpi(void) {<br /><br />DDRB |= MOSI|SCK|LT; // piny SPI jako wyjścia<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;DORD); // włącz SPI i ustaw Master oraz DORD na LSB first<br />SPSR |= (1&lt;&lt;SPI2X); // fosc/2<br />}<br /><br /><br />//.....................................................................//<br /><br />// funkcja Wysyłania słowa 40 bit do AD9851 bajt po bajcie//<br />void SendSpi( uint32_t qrg) {<br /><br />LT_ON;<br />LT_OFF;<br />SPDR = qrg;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />SPDR = qrg&gt;&gt;8;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />SPDR = qrg&gt;&gt;16;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />SPDR = qrg&gt;&gt;24;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />SPDR = 0x01;<br />//bajt konfiguracyjny - 0x01 dla AD9851 ustawia mnożnik zegara x6 w przypadku AD9850 należy wysłac 0x00 //<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />LT_ON;<br />LT_OFF;<br />}<br /><br />//.........................................................................................<br /><br />//Funkcja inicjująca uklad DDS AD9850_9851 Bezpośrednio po wywolaniu inicjalizacji należy<br />// kolejno wywolac funkcje sendspi nawet z ustawieniem zero.<br /><br />void AD985Xinit (void) {<br /><br />RESET_ON; // Reset AD9851 <br />_delay_ms (5);<br />RESET_OFF;<br />SCK_ON;<br />_delay_ms (5);<br />SCK_OFF;<br />LT_ON;<br />_delay_ms (5);<br />LT_OFF;<br /><br />SendSpi ( qrg );  // wyslanie zerowej qrg z bajtem konfiguracyjnym (inicjacja AD985X)<br /><br />}[/syntax]<br /><br />Plik SP_AD9851.h<br />[syntax=c]#ifndef SP_AD9851_SP_AD9851_H_<br />#define SP_AD9851_SP_AD9851_H_<br /><br />/* konfiguracja hardware SPI do AD9851*/<br />#define MOSI (1&lt;&lt;PB3)//   &lt;---- A (SER IN)<br />#define SCK (1&lt;&lt;PB5)//   &lt;---- SHIFT CLOCK (SC)<br />#define LT (1&lt;&lt;PB2)// &lt;---- LATCH CLOCK (LT) FQ_UP<br /><br />#define RESET (1&lt;&lt;PD1)// &lt;---- Reset AD9851 (RESET)<br />#define RESETDIR DDRD<br />#define RESETPORT PORTD<br /><br /><br />// definicje makr LT, SCK, RST //<br />#define LT_ON PORTB |= LT<br />#define LT_OFF PORTB &amp;= ~LT<br /><br />#define SCK_ON PORTB |=SCK<br />#define SCK_OFF PORTB &amp;= ~SCK<br /><br />#define RESET_ON PORTD |= RESET<br />#define RESET_OFF PORTD &amp;= ~RESET<br /><br /><br />uint32_t qrg;<br /><br /><br /><br />//Funkcje obsługi AD9851<br />void InitSpi(void);<br />void SendSpi(uint32_t qrg);<br />void AD985Xinit (void);<br /><br /><br />#endif /* SP_AD9851_SP_AD9851_H_ */[/syntax]<br /><br />w powyższej bibliotece brakuje definicji zegara której z pewnych względów nie chciałem tam umieszczać. Jednak poniżej prezentuję komendy za pomocą których można wysłać żądaną nastawę do DDSa. <br />Zegar w należy zdefiniować zależności od układu<br />AD9850 125MHz (125000000) <br />AD9851 180MHz (180000000)<br />[syntax=c]uint32_t zegar = 180000000; //ustawienie zegara dla AD9851 = 180MHz dla AD9850 = 125MHz[/syntax]<br /><br />komenda ustawiania częstotliwości<br />[syntax=c]qrg = data * 4294967296 / zegar;<br />SendSpi ( qrg );[/syntax]<br />data to właśnie nastawa częstotliwości podana w Hz czyli <br />1MHz / data=1000000<br />30MHz / data=30000000<br />40,261 853MHz / data=40261853<br />itd <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Może prostackie ale ja nie znalazłem nigdzie w necie prostego (dla lamusa) opisu tych układów dla tego przedstawiłem to w ten sposób.<br /><br />Podane ustawienia sprzętowego SPI są dla Atmega32. bardzo ważne jest to że wysyłać dane trzeba LSB first. (DORD na LSB first)<br />Powodzenia w zabawie z generatorkami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12998">SP2LUB</a> — 25 cze 2017, o 17:43</p><hr />
]]></content>
</entry>
</feed>