Управление синтезатором частоты AD9958
- Войдите на сайт для отправки комментариев
Управление идёт через атмегу 168 программку я написал вроде компилется без ошибок.
Суть в том что по формуле расчитывается некое число Ftw (десятичное), по которому и определяется нужная частота у синтезатора далее это число должно переводиться в двоичный 32 разрядный код и выдавяться на соот ножку синтезатора. Соот при этом ввод частоты идёт через виртуальный ком порт кот тут же описан (с этим проблем не возникло). Вопрос вот в чём:
1.расчитанное число Ftw будет итерпретироваться как двоичное если оно word?
2.какой оператор выдёт расчитаный двоичный код Ftw ввиде сигнала на соот порт (предположительно shiftOut но могу ошибаться)?
int CSLK = 2;
int CS = 3;
int Sdio = 4;
word Ftw;
void setup()
{
Serial.begin(9600);
pinMode(Sdio, OUTPUT);
pinMode(CSLK, OUTPUT);
pinMode(CS, OUTPUT);
}
void loop()
{
Serial.print ("Enter Fout(kHz):");
while (Serial.available()<5) {};
float Fout = Serial.parseInt();//для кГц
Serial.println (Fout);
Ftw = Fout*pow(2, 32) /50000000;//Для кГц
Serial.print ("load Ftw:");
Serial.println (Ftw);
Serial.println ();
if (0<=Ftw && Ftw<=pow (2, 32))
{Serial.println ("Loading");
}
else
{Serial.println ("Error");}
Serial.println ();
}
///////////////////////// AD9958 ///////////////////////
void loadFtw (word dataFtw)
{
digitalWrite (CS, HIGH);
digitalWrite (CS, LOW);
delay (0.001);
digitalWrite (CS, LOW);
delay (0.2);
{
digitalWrite (CSLK, LOW);
delay (0.001);
for(int i=0; i<=32; i=i++)
{
digitalWrite (CSLK, HIGH);
delay (0.0022);
digitalWrite (CSLK, LOW);
delay (0.0016);
}
}
{shiftOut (Sdio, CSLK, MSBFIRST, 00000001);
shiftOut (Sdio, CSLK, MSBFIRST, Ftw);
}
}
Как минимум вам надо научиться пользоваться дуиновскими функциями.
Почитайте delay() и ознакомьтесь Программирование.
Причём тут Делай().... ?!
Причём тут Делай().... ?!
Останавливает выполнение программы на заданное в параметре количество миллисекунд
Параметры
ms: количество миллисекунд, на которое приостанавливается выполнение программы. (unsigned long)
Описание типа
Unsigned long используется для хранения положительных целых чисел в диапазоне от 0 до 4,294,967,295 (2^32 - 1) изанимает 32 бита (4 байта) в памяти.
Я помойму не спрашивал про задержку и хранение целый положительных чисел!
Спрашивал след:
1.расчитанное число Ftw будет итерпретироваться как двоичное если оно word?
Я помойму не спрашивал ...
Во-первых, все данные в МК хранятся, обрабатываются и передаются в двоичном виде.
Во-вторых, ваш вопрос исходя из выше сказанного если его перевести на молоко будет звучать так: "Два литра молока будут молоком если его налить в двухлитровую банку?" Что ответите на такой вопрос?
Ну а в-третьих, о числах - зачем вы сохраняете результат вычислений с типом float* в word если word может хранить только 16 бит данных, когда вам как вы пишите нужно отправить 32 бита?
* и зачем вы вообще в данном случае пользуетесь типом float ?
[/quote]
Ну а в-третьих, о числах - зачем вы сохраняете результат вычислений с типом float* в word если word может хранить только 16 бит данных, когда вам как вы пишите нужно отправить 32 бита?
* и зачем вы вообще в данном случае пользуетесь типом float ?
[/quote]
Отвечаю: значение реальной частоты в кГц (Fout) кот должен вырабатывать ситезатор ее мы вводим с консоли ну или из "монитора порта" это будет частота от 0-500 МГц (500000 кГц) поэт Float подходит больше всего.
А то что касается про 32 бита (4 байта) в которых должно быть значение Ftw немного изучив понял что оптимално использовать long. ИХМО
ее мы вводим с консоли ну или из "монитора порта" это будет частота от 0-500 МГц (500000 кГц) поэт Float подходит больше всего.
В каком месте оно подходит? Вы разницу понимаете между вещественными и целыми числами?
И, кстати, parseInt() возвращает long.
Я всё понимаю и разницу в том числе. Для работы с частотой больше подходит именно float (именно в нашем случае) поскольку частота может иметь и дробное значение скажем 55000, 5 кГц
И что? Вы же все равно в итоге сохраняеете все в word или long все что после запятой будет "обрезано", а в монитор вы 55000,5 тоже отправить не сможете, так как parseInt() так же обрежет или проигнорирует. Так в каком месте тип float подходит? И зачем вы его используете?