Takehisa Oneta / Mbed 2 deprecated AD9850_BLE

Dependencies:   BLE_API mbed nRF51822

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers AD9850.cpp Source File

AD9850.cpp

00001 //----------------------------------------------------------------
00002 /**
00003  * 中華DDS AD9850のコントロール
00004  * 
00005  * mbed LPC1768では SPIを操作することで40bitの出力ができるが、
00006  * mbed HRM1017等ではSPIの動作が違うためソフトウェアでシリアルデータを出力する
00007  * 
00008  * 参考資料
00009  *   AD9850データシート
00010  *     http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf
00011  *   mbed LPC1768 SPIでの実装例
00012  *     http://developer.mbed.org/users/liamg/code/AD9850-function-generator-SPI-driver/
00013  */
00014 //----------------------------------------------------------------
00015 
00016 #include "AD9850.h"
00017 
00018 #define AD9850_FREQ_CONST   34.359738368
00019 /*
00020  * AD9850/clock=125MHz 
00021  * 2の32乗=4294967296、DDSクロック==125MHzを前提とすると...
00022  * 1Hz設定時の値 = 4294967296/125000000 = 34.359738368 となる
00023  */
00024 
00025 //----------------------------------------------------------------
00026 /**
00027  * コンストラクタ
00028  *
00029  * @param PinName data   データ転送ピン
00030  * @param PinName w_clk  クロックピン
00031  * @param PinName fu_ud  モジュール選択
00032  * @param PinName reset  リセット
00033  */
00034 AD9850::AD9850(PinName data, PinName w_clk, PinName fu_ud, PinName reset)
00035     : _outBit(data), _w_clk(w_clk), _fu_ud(fu_ud), _reset(reset)
00036 {
00037     init();
00038 }
00039 
00040 //----------------------------------------------------------------
00041 /**
00042  * デストラクタ
00043  */
00044 AD9850::~AD9850()
00045 {
00046 }
00047 
00048 //----------------------------------------------------------------
00049 /**
00050  * 初期化
00051  */
00052 void AD9850::init()
00053 {
00054     reset();
00055 }
00056 
00057 //----------------------------------------------------------------
00058 /**
00059  * リセット
00060  */
00061 void AD9850::reset()
00062 {
00063     _reset = 0; wait_ms(5);
00064     _reset = 1; wait_ms(5);
00065     _reset = 0; wait_ms(5);
00066 }
00067 
00068 //----------------------------------------------------------------
00069 /**
00070  * 周波数設定
00071  *
00072  * @param int freq  設定する周波数(Hz)
00073  *                  AD9850ボードに依存するがクロック125MHzで概ね 1〜40000000(1Hz〜40MHz)程度まで安定して動作する模様
00074  * @param int pdwon パワーダウンビット (W34)
00075  * @param int phase コントロール/フェーズ等データ (W32〜W39)
00076  *
00077  * AD9850へ送信する40bit
00078  *  W0〜W31:
00079  *    freqにAD9850_FREQ_CONSTを乗算した32bit値
00080  *  W32, W33:
00081  *    コントロールビット。常に0
00082  *  W34:
00083  *    1でパワーダウン(通常は0)
00084  *  W35〜W39:
00085  *    位相オフセット調整値 (11.25度単位)
00086  */
00087 void AD9850::setFrequency(int freq, int pdwon, int phase)
00088 {
00089     int freqParam = (int)((double)freq * AD9850_FREQ_CONST);    // 周波数に対応した32bitデータ(W0〜W31)
00090 
00091     _w_clk = 0;
00092     _fu_ud = 0; wait_ms(5);
00093     _fu_ud = 1; wait_ms(5);
00094     _fu_ud = 0;
00095 
00096     for (int i = 0; i < 32; i++) {
00097         int bit = ((freqParam >> i) & 0x01);    // LSBから送信
00098         _w_clk = 0;
00099         _outBit = bit;
00100         wait_ms(0.1);
00101         _w_clk = 1; wait_ms(2);
00102         _w_clk = 0; wait_ms(2);
00103     }
00104 
00105     for (int i = 0; i < 8; i++) {
00106         int bit = ((phase >> (7 - i)) & 0x01);
00107         _w_clk = 0;
00108         _outBit = bit;
00109         wait_ms(0.1);
00110         _w_clk = 1; wait_ms(2);
00111         _w_clk = 0; wait_ms(2);
00112     }
00113 
00114     _fu_ud = 0; wait_ms(5);
00115     _fu_ud = 1; wait_ms(5);
00116     _fu_ud = 0;
00117 }
00118 
00119 //----------------------------------------------------------------
00120 /*
00121 
00122 // mbed HRM1017の場合
00123 AD9850 dds(P0_20, P0_25, P0_24, P0_23);
00124 
00125 int main()
00126 {
00127     int frq = 10 * 1000 * 1000; // 10MHz
00128     int phase = 0;
00129     
00130     dds.setFrequency(frq, phase);
00131     while(1) {
00132         // 
00133     }
00134 }
00135 */