SIMULINK_A7DAC  1.0
Control of A7_DAC device
tf_dds.cpp
Go to the documentation of this file.
1 
2 
3 #include <stdio.h>
4 
5 #define _USE_MATH_DEFINES
6 #include <math.h>
7 
8 #include <stdlib.h>
9 #include <stdint.h>
10 //#include <inttypes.h>
11 
12 #include "TF_DDS.h"
13 #include "cl_reg.h"
14 
16 {
17  //! Доступ к регистрам модуля
19 
20 };
21 
22 
24 {
25  td = new TF_DDS_TaskData();
26 
27  td->reg = reg;
28 }
29 
31 {
32  delete td; td=NULL;
33 
34 }
35 
36 //! Подготовка PLL
37 void TF_DDS::Prepare( int flagLoadSinTable )
38 {
39  printf( "Подготовка DDS\n");
40 
41  int regA;
42  td->reg->PkgCmdStart();
43  td->reg->PkgCmdWrite( 0, 0x80, 0x10 );
44  td->reg->PkgCmdRead( 0, 0x0A, &regA );
45  td->reg->PkgCmdExecute();
46 
47  double v;
48  double arg;
49  int d;
50  int kk=0;
51 
52  int flagIsLoaded=0;
53 
54  if( 0xCA01==regA)
55  {
56  printf( " regA=0x%.4X - Таблица уже загружена\n", regA );
57  } else
58  {
59  flagIsLoaded=1;
60  printf( " regA=0x%.4X - Требуется загрузка таблицы\n", regA );
61  }
62 
63 //#if 0
64  if( flagLoadSinTable || flagIsLoaded )
65  {
66  printf( "\n Загрузка таблицы\n" );
67  for( int jj=0; jj<1024; jj++ )
68  {
69  td->reg->PkgCmdStart();
70  for( int ii=0; ii<16; ii++ )
71  {
72  arg = 2 * M_PI * kk / 16384;
73  v = sin( arg ) * 2047;
74  d = v;
75  d^=0x800;
76  td->reg->PkgCmdWrite( 2, kk, d );
77  kk++;
78  }
79  td->reg->PkgCmdExecute();
80  }
81  printf( "\n Загрузка таблицы завершена\n" );
82  td->reg->PkgCmdStart();
83  td->reg->PkgCmdWrite( 0, 0xA, 0xCA01 );
84  td->reg->PkgCmdExecute();
85 
86 
87  }
88 //#endif
89  td->reg->PkgCmdStart();
90  td->reg->PkgCmdWrite( 0, 0x82, 0 ); // PHASE0_START_L
91  td->reg->PkgCmdWrite( 0, 0x83, 0x8000 ); // PHASE0_START_H
92 
93  td->reg->PkgCmdWrite( 0, 0x84, 0 ); // PHASE0_INC_L
94  td->reg->PkgCmdWrite( 0, 0x85, 0x400 ); // PHASE0_INC_H
95 
96  td->reg->PkgCmdWrite( 0, 0x86, 0 ); // PHASE1_START_L
97  td->reg->PkgCmdWrite( 0, 0x87, 0x4000 ); // PHASE1_START_H
98 
99 // td->reg->PkgCmdWrite( 0, 0x88, 0x000100000 );
100  td->reg->PkgCmdWrite( 0, 0x88, 0); // PHASE1_INC_L
101  td->reg->PkgCmdWrite( 0, 0x89, 0x2000 ); // PHASE1_INC_H
102 
103 
104 
105  td->reg->PkgCmdWrite( 0, 0x91, 0x200 );
106  td->reg->PkgCmdWrite( 0, 0x92, 0x1000 );
107  td->reg->PkgCmdWrite( 0, 0x93, 0 );
108 
109  td->reg->PkgCmdWrite( 0, 0x90, 0x00 );
110 
111  td->reg->PkgCmdWrite( 0, 0x80, 0x10 );
112 
113 
114  td->reg->PkgCmdExecute();
115 
116 
117  printf( "DAC START\n" );
118 }
119 
120 void TF_DDS::SetPhase( double syntFreq, double Freq, double Phase, __int64& phase_start, __int64& phase_inc )
121 {
122  long double rate = syntFreq/Freq;
123  long double q = 281474976710656.0L;
124  phase_inc = q / rate;
125 
126  phase_start = (q /360 ) * Phase;
127 
128 }
129 
130 //! Установка частоты
131 void TF_DDS::SetDacFreq( double syntFreq, double Freq0, double Phase0, double Ampl0, double Freq1, double Phase1, double Ampl1 )
132 {
133  __int64 start0, inc0, start1, inc1;
134  SetPhase( syntFreq, Freq0, Phase0, start0, inc0 );
135  SetPhase( syntFreq, Freq1, Phase1, start1, inc1 );
136 
137  td->reg->PkgCmdStart();
138 
139  td->reg->PkgCmdWrite( 0, 0x80, 0x00 );
140 
141  td->reg->PkgCmdWrite( 0, 0x82, start0 & 0xFFFFFFFF ); // PHASE0_START_L
142  td->reg->PkgCmdWrite( 0, 0x83, (start0>>32) & 0xFFFF ); // PHASE0_START_H
143 
144  td->reg->PkgCmdWrite( 0, 0x84, inc0 & 0xFFFFFFFF ); // PHASE0_INC_L
145  td->reg->PkgCmdWrite( 0, 0x85, (inc0>>32) & 0xFFFF ); // PHASE0_INC_H
146 
147  td->reg->PkgCmdWrite( 0, 0x86, start1 & 0xFFFFFFFF ); // PHASE1_START_L
148  td->reg->PkgCmdWrite( 0, 0x87, (start1>>32) & 0xFFFF ); // PHASE1_START_H
149 
150  td->reg->PkgCmdWrite( 0, 0x88, inc1 & 0xFFFFFFFF ); // PHASE1_INC_L
151  td->reg->PkgCmdWrite( 0, 0x89, (inc1>>32) & 0xFFFF ); // PHASE1_INC_H
152 
153  //td->reg->PkgCmdWrite( 0, 0x91, 0x800 );
154  //td->reg->PkgCmdWrite( 0, 0x92, 0x1000 );
155  //td->reg->PkgCmdWrite( 0, 0x93, 0x100000 );
156 
157 // td->reg->PkgCmdWrite( 0, 0x90, 0x07 );
158 
159  td->reg->PkgCmdWrite( 0, 0x80, 0x10 );
160 
161 
162  td->reg->PkgCmdExecute();
163  //printf( "%s \n", __FUNCTION__ );
164  //printf( " Freq0=%-12.0f Phase0=%-5.0f Ampl0=%-5.0f\n", Freq0, Phase0, Ampl0 );
165  //printf( " Freq1=%-12.0f Phase1=%-5.0f Ampl1=%-5.0f\n", Freq1, Phase1, Ampl1 );
166 
167  int inc0_0 = inc0 & 0xFFFFFFFF;
168  int inc0_1 = (inc0>>32) & 0xFFFF;
169 
170  int inc1_0 = inc1 & 0xFFFFFFFF;
171  int inc1_1 = (inc1>>32) & 0xFFFF;
172 
173  int start0_0 = start0 & 0xFFFFFFFF;
174  int start0_1 = (start0>>32) & 0xFFFF;
175 
176  int start1_0 = start1 & 0xFFFFFFFF;
177  int start1_1 = (start1>>32) & 0xFFFF;
178 
179  //printf( " inc0= %.4X %.8X start0=%.4X %.8X\n", inc0_1, inc0_0, start0_1, start0_0);
180  //printf( " inc1= %.4X %.8X start1=%.4X %.8X\n", inc1_1, inc1_0, start1_1, start1_0);
181 
182 }
183 
184 
185 //! Установка счётчиков старта
186 void TF_DDS::SetCntStart( int regCntEnable, int regCntDisable, int regPeriod, int isContinuePeriod, int isCntEnable )
187 {
188  td->reg->PkgCmdStart();
189 
190  int code=0;
191  if( isCntEnable )
192  code |=1;
193 
194  if( isContinuePeriod )
195  code |=2;
196 
197 
198 
199  td->reg->PkgCmdWrite( 0, 0x90, 0x00 );
200 
201 
202  td->reg->PkgCmdWrite( 0, 0x91, regCntEnable );
203  td->reg->PkgCmdWrite( 0, 0x92, regCntDisable );
204  td->reg->PkgCmdWrite( 0, 0x93, regPeriod );
205 
206  td->reg->PkgCmdWrite( 0, 0x80, 0x10 );
207  td->reg->PkgCmdWrite( 0, 0x90, code );
208 
209 
210 
211  td->reg->PkgCmdExecute();
212 
213  int ret = isPeriodComplete();
214 }
215 
216 
217 //! Завершение вывода
219 {
220  int reg0x10=0;
221  td->reg->PkgCmdStart();
222  td->reg->PkgCmdRead( 0, 0x10, &reg0x10 );
223 
224  td->reg->PkgCmdExecute();
225 
226  if( reg0x10 & 0x100 )
227  return 1;
228 
229  return 0;
230 }
231 
232 //! Запуск и останов
233 void TF_DDS::DacStart( int enable, int start )
234 {
235  int code=0x10;
236  if( enable )
237  code |=0x40;
238  if( start )
239  code |=0x20;
240 
241  td->reg->PkgCmdStart();
242  td->reg->PkgCmdWrite( 0, 0x80, code );
243  td->reg->PkgCmdExecute();
244 
245 }
246 
247 
void SetCntStart(int regCntEnable, int regCntDisable, int regPeriod, int isContinuePeriod, int isCntEnable)
Установка счётчиков старта
Definition: tf_dds.cpp:186
virtual void PkgCmdRead(int dev, int adr, int *pData)
Чтение из регистра
Definition: cl_reg.h:28
virtual void PkgCmdStart(void)
Начало выполнения команды
Definition: cl_reg.h:22
virtual ~TF_DDS()
Definition: tf_dds.cpp:30
void DacStart(int enable, int start)
Запуск и останов
Definition: tf_dds.cpp:233
virtual void PkgCmdExecute(void)
Выполнение команды
Definition: cl_reg.h:31
int isPeriodComplete(void)
Завершение вывода
Definition: tf_dds.cpp:218
virtual void PkgCmdWrite(int dev, int adr, int data)
Запись в регистр
Definition: cl_reg.h:25
Доступ к регистраи
Definition: cl_reg.h:13
void Prepare(int flagLoadSinTable)
Подготовка
Definition: tf_dds.cpp:37
TF_DDS(CL_Reg *reg)
Definition: tf_dds.cpp:23
TF_DDS_TaskData * td
Внутренние данные класса
Definition: tf_dds.h:20
CL_Reg * reg
Доступ к регистрам модуля
Definition: tf_dds.cpp:18
void SetPhase(double syntFreq, double Freq, double Phase, __int64 &phase_start, __int64 &phase_inc)
Definition: tf_dds.cpp:120
void SetDacFreq(double syntFreq, double Freq0, double Phase0, double Ampl0, double Freq1, double Phase1, double Ampl1)
Установка частоты
Definition: tf_dds.cpp:131