• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 1
  • 1
  • 2
  • 3
  • 4
  • 5
duże liczby - zamiana stringa na double lub float
#21
Na elektrodzie jeden użytkownik podał inny sposób też działa.

String test="40000001";
Serial.println(atol(test.c_str()));
 
Odpowiedź
#22
(01-03-2020, 16:14)m72 napisał(a): Liczby typu float muszą być bo takimi liczbami z arduino jest karmiony generator na AD9850 który ma dokładność ułamków Hertza zasięg do kilkudziesięciu MHz więc muszę mieć możliwość zapodania liczby np 19000123.1Hz 

Nieprawda!
Proszę nie wprowadzać czytelników w błąd.
Float operuje sobie "programista", który napisał bibliotekę dla Arduino sterującą AD9850.
Ja nigdy jej nie używałem, ponieważ jest to tak proste, że się nie opłaca katować procka. 

Poczytajmy trochę noty katalogowej: https://www.analog.com/media/en/technical-documentation/data-sheets/AD9850.pdf

Strona 8. THEORY OF OPERATION AND APPLICATION

Wzór na częstotliwość:
fOUT = (∆ Phase × CLKIN)/2^32

gdzie ∆ Phase, to jest 32 bitowe słowo, które wysyłamy do AD9850.
CLKIN to częstotliwość taktowania układu, prawdopodobnie 125MHz.

Więc ∆ Phase = fOUT x 2^32 / 125000000

Przykładowy program w przykładowej bibliotece mógł by wyglądać tak:



Kod:
#define W_CLK 8
#define FQ_UD 9
#define DATA 10
#define RESET 11
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }

void setup() {
  pinMode(FQ_UD, OUTPUT);
  pinMode(W_CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(RESET, OUTPUT);
  pulseHigh(RESET);
  pulseHigh(W_CLK);
  pulseHigh(FQ_UD);

  sendFrequency(1000000);
}

void loop() {

}

void sendFrequency(double frequency) { 
  int32_t freq = frequency * 4294967295/125000000;
  for (int b=0; b<4; b++, freq>>=8) {
    transfer_byte(freq & 0xFF);
  }
  transfer_byte(0x000);
  pulseHigh(FQ_UD);
}

void transfer_byte(byte data)
{
  for (int i=0; i<8; i++, data>>=1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK);
  }
}


Zauważ, że w funkcji wysyłającej dane do modułu, mamy rzutowanie na int32_t, więc wysyłamy słowo 32 bit, żaden float.
W nocie katalogowej piszą, że dla taktowania 125MHz, mamy rozdzielczość 0,0291 Hz.
To znaczy że jeśli wyślemy jedynkę int 32_t freq = 1; to na wyjściu mamy 0,0291 Hz , jeśli jyślesz 2 to otrzymasz 0,0582 Hz itd.
I to powinno być podstawą do napisania własnej funkcji sterującej. Żadnych floatów tu nie ma.

Kod:
void test(int32_t x){
    for (int b=0; b<4; b++, x>>=8) {
    transfer_byte(x & 0xFF);
  }
  transfer_byte(0x000);
  pulseHigh(FQ_UD);
}
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#23
Nie mój level ale dzięki !
Choć fajnie by było to opanować do ułamków Hz, nie powiem.

Generalnie to mniej więcej tak działa. 
Kod jest burdelem strasznym, same "floaty" w zmiennych.

   
   
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości