Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Arduino DDS
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další)
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
jankrizan



Založen: Dec 30, 2007
Příspěvky: 77

PříspěvekZaslal: po srpen 19 2024, 12:02    Předmět: Arduino DDS Citovat

Zdravím. prosím niekoho, kto mi pomôže s programom arduina na dds generátor s AD9833. Potrebujem ovládať jeden výstupny pin konkrétne D12 z polohy "low" na polohu "high" pre spínanie tranzistora. Nie som schopný, kde mám čo zadať, aby sa mi ten pin D12 Arduina aktivoval pri navolení pozície SQUARE, a pri ostatných pozíciach SINUS, TRIANGLE sa opäť deaktivoval. Prosím Vás komu to nebude robiť problém, Poraďte mi. Ďakujem.[/*---------------------------------------------------------------------
* AD9833 Function Generator
* By John Bradnam
* based on:
* DIY Function/Waveform Generator by GreatScottLab
* (https://www.instructables.com/DIY-FunctionWaveform-Generator/)
*
* 230114 - Rewrote code
*/
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include "AD9833.h"
#include "Rotary.h"

//Pins
#define ROTARY_A 2
#define ROTARY_B 3
#define SWITCH A3
#define led 12
#define AD9833_FSYNC 10
#define AD9833_SCLK 13
#define AD9833_SDATA 11






//Modules
AD9833 sigGen(AD9833_FSYNC, 24000000);// Initialise our AD9833 with FSYNC and a master clock frequency of 24MHz
LiquidCrystal_I2C lcd(0x27, 16, 2);
Rotary encoder(ROTARY_A, ROTARY_B); // Initialise the encoder on pins 2 and 3 (interrupt pins)

enum MenuEnum { X1, X10, X100, X1K, X10K, X100K, X1M, WAVEFORM };
enum WaveEnum { SINE, TRANGLE, SQUARE };
#define MENU_TEXT_LEN 10
const String menuText[] = {"x 1 Hz", "x 10 Hz", "x 100 Hz","x 1 kHz", "x 10 kHz", "x 100 kHz", "x 1 MHz", "Waveform"};
const String waveText[] = {" Sinus", "Triang", "Square"};



//EEPROM handling
//Uncomment next line to clear out EEPROM and reset
//#define RESET_EEPROM
#define EEPROM_ADDRESS 0
#define EEPROM_MAGIC 0x0BAD0DAD
typedef struct {
uint32_t magic;
MenuEnum menuState;
WaveEnum waveState;
long frequency;
} EEPROM_DATA;

EEPROM_DATA EepromData; //Current EEPROM settings

#define EEPROM_UPDATE_TIME 60000 //Check for eprom update every minute
unsigned long eepromTimeout = 0;
bool eepromUpdate = false;

#define FREQ_MAX 5000000

volatile bool updateDisplay = false;

//--------------------------------------------------------------------
//Setup hardware
void setup()
{
lcd.init();
lcd.backlight();
digitalWrite(led,LOW);
//Serial.begin(57600);
//Serial.println("Starting...");

//Get last settings
readEepromData();

// Initialise the LCD, start the backlight and print a "bootup" message for two seconds
lcd.begin(16, 2);
lcd.print(" === AD9833 === ");
lcd.setCursor(0, 1);
lcd.print("Signal Generator");
delay(2000);

// Display initial set values
lcd.clear();
displayFrequency();
displayMenu();
displayWaveform();

// Initialise the AD9833 with 1KHz sine output, no phase shift for both
// registers and remain on the FREQ0 register
// sigGen.lcdDebugInit(&lcd);
sigGen.reset(1);
sigGen.setFreq(EepromData.frequency);
sigGen.setPhase(0);
sigGen.setFPRegister(1);
sigGen.setFreq(EepromData.frequency);
sigGen.setPhase(0);
sigGen.setFPRegister(0);
sigGen.mode((int)EepromData.waveState);
sigGen.reset(0);

// Set pins A and B from encoder as interrupts
attachInterrupt(digitalPinToInterrupt(ROTARY_A), encChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(ROTARY_B), encChange, CHANGE);
// Initialise pin as input with pull-up enabled and debounce variable for
// encoder button
pinMode(SWITCH, INPUT_PULLUP);
pinMode (led,OUTPUT);
// Set Cursor to initial possition
lcd.setCursor(0, 1);

eepromTimeout = millis() + EEPROM_UPDATE_TIME;
}

//--------------------------------------------------------------------
//Main loop
void loop()
{
// If button is pressed, change the menu
if (testButton(true))
{
EepromData.menuState = (EepromData.menuState == WAVEFORM) ? X1 : (MenuEnum)((int)EepromData.menuState + 1);
eepromUpdate = true;
updateDisplay = true;
}

// Update display if needed
if (updateDisplay)
{
displayFrequency();
displayMenu();
displayWaveform();
updateDisplay = false;
}

//Update EEPROM if settings changed
if (millis() > eepromTimeout)
{
if (eepromUpdate)
{
writeEepromData();
eepromUpdate = false;
}
eepromTimeout = millis() + EEPROM_UPDATE_TIME;
}
}

//--------------------------------------------------------------------
// Test if button has been pressed
// waitForRelease - True to wait until button gos up
// Returns true if button is pressed
bool testButton(bool waitForRelease)
{
bool pressed = false;
if (digitalRead(SWITCH) == LOW)
{
pressed = true;
while (waitForRelease && digitalRead(SWITCH) == LOW)
{
yield();
}
}
return pressed;
}

//--------------------------------------------------------------------
// Encoder has been rotated
// Change frequency or waveform based on menu selection
void encChange()
{
unsigned char state = encoder.process();
if (state != DIR_NONE)
{
switch (EepromData.menuState)
{
case X1: updateFrequency(state,1); break;
case X10: updateFrequency(state,10); break;
case X100: updateFrequency(state,100); break;
case X1K: updateFrequency(state,1000); break;
case X10K: updateFrequency(state,10000); break;
case X100K: updateFrequency(state,100000); break;
case X1M: updateFrequency(state,1000000); break;
case WAVEFORM: updateWaveform(state); break;
}
}
}

//--------------------------------------------------------------------
//Change the current frequency based on menu and stepValue
// state - Either DIR_CW or DIR_CCW
// stepValue - Current amount to change frequency by
void updateFrequency(unsigned char state, long stepValue)
{
bool update = false;
long old = EepromData.frequency;
if (state == DIR_CW)
{
EepromData.frequency = min(EepromData.frequency + stepValue,FREQ_MAX);
}
else
{
EepromData.frequency = max(EepromData.frequency - stepValue,0);
}
if (old != EepromData.frequency)
{
sigGen.setFreq(EepromData.frequency);
eepromUpdate = true;
updateDisplay = true;
}
}

//--------------------------------------------------------------------
//Change the current waveform
// state - Either DIR_CW or DIR_CCW
void updateWaveform(unsigned char state)
{
if (state == DIR_CW)
{
EepromData.waveState = (EepromData.waveState == SQUARE) ? SINE : (WaveEnum)((int)EepromData.waveState + 1);

}
else
{
EepromData.waveState = (EepromData.waveState == SINE) ? SQUARE : (WaveEnum)((int)EepromData.waveState - 1);
}
sigGen.mode((int)EepromData.waveState);
eepromUpdate = true;
updateDisplay = true;
}

//--------------------------------------------------------------------
//Display current frequency
void displayFrequency()
{
lcd.setCursor(0, 0);
lcd.print(formatNumber(EepromData.frequency,"F: "," Hz",16));
}

//--------------------------------------------------------------------
//Display active menu state
void displayMenu()
{
lcd.setCursor(0, 1);
lcd.print(padString(menuText[(int)EepromData.menuState],MENU_TEXT_LEN));
}

//--------------------------------------------------------------------
//Display active waveform
void displayWaveform()
{
lcd.setCursor(10, 1);
lcd.print(waveText[(int)EepromData.waveState]);

}

//-----------------------------------------------------------------------------------
//Display a number with comma seperators
// number - number to format
// prefix - String to prefix number with
// postfix - String to append to number
// pad - Add spaces to the right pad string
// returns String with formatted number
String formatNumber(long number, String prefix, String postfix, int pad)
{
String s = "";
bool space = true;
for (uint8_t i = 0; i < 8; i++)
{
if ((i==3 || i==6) && !space && number > 0)
{
s = String(',') + s;
}
if (number > 0 || i == 0)
{
s = String((char)((number % 10) + 4Cool) + s;
space = false;
}
else
{
space = true;
}
number = number / 10;
}
s = prefix + s + postfix;
return padString(s, pad);
}

//-----------------------------------------------------------------------------------
//Pad string with spaces
// s - string to pad
// prefix - String to prefix number with
// returns padded String
String padString(String s, int pad)
{
String sOut = String(s);
int len = pad - s.length();
for (uint8_t i = 0; i < len; i++)
{
sOut += ' ';
}
return sOut;
}

//--------------------------------------------------------------------
//Write the EepromData structure to EEPROM
void writeEepromData(void)
{
//This function uses EEPROM.update() to perform the write, so does not rewrites the value if it didn't change.
EEPROM.put(EEPROM_ADDRESS,EepromData);
}

//--------------------------------------------------------------------
//Read the EepromData structure from EEPROM, initialise if necessary
void readEepromData(void)
{
#ifndef RESET_EEPROM
EEPROM.get(EEPROM_ADDRESS,EepromData);
if (EepromData.magic != EEPROM_MAGIC)
{
#endif
EepromData.magic = EEPROM_MAGIC;
EepromData.menuState = WAVEFORM;
EepromData.waveState = SINE;
EepromData.frequency = 1000;
writeEepromData();
#ifndef RESET_EEPROM
}
#endif
}][/code]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jankrizan



Založen: Dec 30, 2007
Příspěvky: 77

PříspěvekZaslal: po srpen 19 2024, 12:37    Předmět: Citovat

Ešte mám jednu chuťovku. Iný typ Arduino DDS generátora. Pri točení enkodéra o jeden krok, sa hodnoty menia po 4 kroky. Napr. krok z 1000 na 2000 sa mení na displeji na 1000-1250-1500-1750-2000. Na internete som nenašiel ako sa to dá zmeniť, všade píšu, že je to normálna funkcia, (trochu blbá - trochu moc). Vedel by niekto vyzrieť nad týmto. Poraďťe, budem vďačný.


signalgeneratorv3_.txt
 Komentář:

Stáhnout
 Soubor:  signalgeneratorv3_.txt
 Velikost:  8.87 kB
 Staženo:  10 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dumitru



Založen: Dec 11, 2015
Příspěvky: 172
Bydliště: Slovensko,Bratislava

PříspěvekZaslal: po srpen 19 2024, 12:44    Předmět: Citovat

Nerobím v arudino ale co som si len rýchlo prebehol kód tak na konci tejto funkcie
kód:

void updateWaveform(unsigned char state)
{
if (state == DIR_CW)
{
EepromData.waveState = (EepromData.waveState == SQUARE) ? SINE : (WaveEnum)((int)EepromData.waveState + 1);

}
else
{
EepromData.waveState = (EepromData.waveState == SINE) ? SQUARE : (WaveEnum)((int)EepromData.waveState - 1);
}
sigGen.mode((int)EepromData.waveState);
eepromUpdate = true;
updateDisplay = true;
}



stačí dať jeden if

nejak takto



kód:

void updateWaveform(unsigned char state)
{
if (state == DIR_CW)
{
EepromData.waveState = (EepromData.waveState == SQUARE) ? SINE : (WaveEnum)((int)EepromData.waveState + 1);

}
else
{
EepromData.waveState = (EepromData.waveState == SINE) ? SQUARE : (WaveEnum)((int)EepromData.waveState - 1);
}
sigGen.mode((int)EepromData.waveState);

if (EepromData.waveState == SQUARE)
{
// zapni D12 príkaz neviem :D
}
else
{
// vypni D12
}

eepromUpdate = true;
updateDisplay = true;
}


Naposledy upravil Dumitru dne po srpen 19 2024, 12:46, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
pocitujlasku



Založen: Dec 12, 2005
Příspěvky: 2289
Bydliště: SR, Poprad

PříspěvekZaslal: po srpen 19 2024, 12:44    Předmět: Citovat

Takto nejako by to nefungovalo?

void updateWaveform(unsigned char state)
{
if (state == DIR_CW)
{
EepromData.waveState = (EepromData.waveState == SQUARE) ? SINE : (WaveEnum)((int)EepromData.waveState + 1);
}
else
{
EepromData.waveState = (EepromData.waveState == SINE) ? SQUARE : (WaveEnum)((int)EepromData.waveState - 1);
}

digitalWrite(D12, EepromData.waveState == SQUARE?HIGH:LOW);

sigGen.mode((int)EepromData.waveState);
eepromUpdate = true;
updateDisplay = true;
}

}

_________________
No vidis, a tak si sa bal
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
asdf



Založen: Oct 06, 2022
Příspěvky: 292

PříspěvekZaslal: po srpen 19 2024, 13:02    Předmět: Citovat

A ještě asi přidat tohle:

//--------------------------------------------------------------------
//Setup hardware
void setup()
{
pinMode(12, OUTPUT);
lcd.init();
lcd.backlight();
digitalWrite(led,LOW);
//Serial.begin(57600);
//Serial.println("Starting...");

//Get last settings
readEepromData();
...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jankrizan



Založen: Dec 30, 2007
Příspěvky: 77

PříspěvekZaslal: po srpen 19 2024, 13:08    Předmět: Citovat

Nefunguje. Po zadaní
digitalWrite(D12, EepromData.waveState == SQUARE?HIGH:LOW);

vypíše
'D12' was not declared in this scope
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dumitru



Založen: Dec 11, 2015
Příspěvky: 172
Bydliště: Slovensko,Bratislava

PříspěvekZaslal: po srpen 19 2024, 13:24    Předmět: Citovat

musíš ten pin asi najprv nastaviť



https://www.tutorialspoint.com/arduino/arduino_io_functions.htm#:~:text=Arduino%20pins%20are%20by%20default,in%20a%20high%2Dimpedance%20state.


že by takto Very Happy

kód:

void setup () {
   pinMode(D12 , OUTPUT); // set the digital pin as output
}

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
pocitujlasku



Založen: Dec 12, 2005
Příspěvky: 2289
Bydliště: SR, Poprad

PříspěvekZaslal: po srpen 19 2024, 13:28    Předmět: Citovat

D12 to som len prepisal z toho tvojho textu, ale asi to bude led, ak spravne pozeram.
_________________
No vidis, a tak si sa bal
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jankrizan



Založen: Dec 30, 2007
Příspěvky: 77

PříspěvekZaslal: po srpen 19 2024, 13:36    Předmět: Citovat

Ale aj tak to nejde. Aj keď som to poprepisoval, tak píše:
'readEepromData' was not declared in this scope
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jankrizan



Založen: Dec 30, 2007
Příspěvky: 77

PříspěvekZaslal: po srpen 19 2024, 13:52    Předmět: Citovat

Ospravedlňujem sa, Ja som neprepísal D12 na moju led. a musel som to zadať 2x.
//--------------------------------------------------------------------
//Change the current waveform
// state - Either DIR_CW or DIR_CCW
void updateWaveform(unsigned char state)
{
if (state == DIR_CW)
{
EepromData.waveState = (EepromData.waveState == SQUARE) ? SINE : (WaveEnum)((int)EepromData.waveState + 1);
digitalWrite(led, EepromData.waveState == SQUARE?HIGH:LOW);
}
else
{
EepromData.waveState = (EepromData.waveState == SINE) ? SQUARE : (WaveEnum)((int)EepromData.waveState - 1);
digitalWrite(led, EepromData.waveState == SQUARE?HIGH:LOW);
}
sigGen.mode((int)EepromData.waveState);
eepromUpdate = true;
updateDisplay = true;
}

Teraz to funguje. VEĽKA VĎAKA.
Ešte by som poprosil ten druhý.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 18314
Bydliště: Nový Bydžov

PříspěvekZaslal: po srpen 19 2024, 16:05    Předmět: Citovat

jankrizan napsal(a):

Ešte by som poprosil ten druhý.

Zkus zakomentovat jeden z řádků:
kód:

attachInterrupt(digitalPinToInterrupt(ROTARY_A), encChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(ROTARY_B), encChange, CHANGE);

Vypadá to na vícenásobný přerušení od n-codéru.

_________________
Jirka

Proč mi nemůže všechno chodit hned ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jankrizan



Založen: Dec 30, 2007
Příspěvky: 77

PříspěvekZaslal: po srpen 19 2024, 17:42    Předmět: Citovat

A kde to mám, prosím ťa, vsunúť?
Do - void updateEncoder()-, alebo do -void setup()- alebo niekde inde?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jankrizan



Založen: Dec 30, 2007
Příspěvky: 77

PříspěvekZaslal: po srpen 19 2024, 17:47    Předmět: Citovat

Prepáčte mi, trochu som zachaosil, tá predošlá príloha je chaos. správne má byť:


DDS_function_generator_.txt
 Komentář:

Stáhnout
 Soubor:  DDS_function_generator_.txt
 Velikost:  6.93 kB
 Staženo:  13 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 18314
Bydliště: Nový Bydžov

PříspěvekZaslal: po srpen 19 2024, 19:05    Předmět: Citovat

jankrizan napsal(a):
A kde to mám, prosím ťa, vsunúť?
Do - void updateEncoder()-, alebo do -void setup()- alebo niekde inde?

Prostě jeden z těch dvou řádků v Setup vymaž a nebo před něj dej dvě //. Nic nikam nepřidávaj.

_________________
Jirka

Proč mi nemůže všechno chodit hned ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jankrizan



Založen: Dec 30, 2007
Příspěvky: 77

PříspěvekZaslal: po srpen 19 2024, 19:20    Předmět: Citovat

Dúfam Celeron, že si ma správne pochopil, že som sa pri prvých príspevkoch pomýlil a zadal som zlý sketch -signal generatorv3. To bolo špatne a zadal som nový správny sketch- DDS_function_generator . Tieto interrupty mi v ňom nefungujú, IDE vyhadzuje -'ROTARY_A' was not declared in this scope.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další) Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.20 sekund