Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822
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 */
Generated on Tue Jul 12 2022 21:12:59 by
1.7.2