Fórum témák
- • Keverőpult építése, javítása
- • Arduino
- • Nextion érintőképernyős HMI, UART kommunikációval
- • USB bekötése
- • Eredményjelző
- • Szintetizátor javítás
- • Audiofil, High End Audio
- • Kondenzátor
- • Dobozolási technikák, műszerdobozok
- • Tekercsek
- • Erősítő mindig és mindig
- • Számítógép hiba, de mi a probléma?
- • Villanypásztor
- • LED-es lámpa, meghajtó áramkör
- • Digitális kapcsoló
- • Kemencevezérlés
- • Próbapanel (dugaszolós)
- • Codefon kaputelefon
- • CPLD, FPGA - Miértek, hogyanok
- • Analóg oszcilloszkóp javítása
- • Teljesítmény -LED, powerLED (pl. Cree, Luxeon) vezérlése
- • Tranzisztorok helyettesítése
- • Sprint-Layout NYÁK-tervező
- • Kombikazán működési hiba
- • Vásárlás, hol kapható?
- • Autórádió (fejegység) problémák, kérdések, válaszok
- • Sárga Kazettás Piaci Nintendo (8bit)
- • Transzformátor készítés, méretezés
- • Hibrid erősítő
- • Időzítő
- • Napelem alkalmazása a lakás energia ellátásában
- • Elfogadnám, ha ingyen elvihető
- • Gázkazán vezérlő hibák
- • Nagy áramú pwm vezérlő építése
- • Műhelyünk felszerelése, szerszámai
- • Elektronyika orosz digitális órák
- • Leválasztó transzformátor
- • ESR mérő
- • Biciklilámpa / bringalámpa
- • Ultrahangos párásító
- • Mosogatógép hiba
- • DSP - Miértek, hogyanok
- • Frekvenciaváltó
- • Villanyszerelés
- • LCD TV probléma
- • Opel Astra elektromos hibák
- • LCD monitor probléma
- • Érdekességek
- • Tápegységgel kapcsolatos kérdések
- • Jókívánság
- • Vicces - mókás történetek
- • LCD kijelző vezérlése, életre keltése
- • Projektor
- • Aszinkron motorok tekercselése
- • TV hiba, mi a megoldás?
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Oké, köszi! A köztes érték esetén mi fog történni? Addig nem vált, amíg el nem éri?
Igen, addig nem vált, ez a hiszterézis lényege. Hogy az értékek jók-e, majd meglátod.
Szuper! Köszi, javítom így.
Szia.
Köszönöm,a kondi megoldotta a problémát.
Srácok, van egy program, amelyben a PWM frekijét szeretném megtudni.
Az MCU típusa: Atmega328P
A beállítás: TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
Ennyiből ez látható?
Sajnos több kódrész nem áll rendelkezésre, ami a beállításokat firtatná, vagy is sanszos, hogy a többi az alapértelmezett beállításon van. Az adatlapon túl vagyok, de nekem nem világos a beállítás. Azt nézem, hogy nincs osztó beállítva vagy is teljes sebességgel megy, ami vicces lenne PWM esetén.
A kód forrása itt elérhető: Bővebben: Link
Előre is köszi.
Egy kérdés a szakiktol.
Van egy fütésszabályzo berendezésem. Eredetile, csak egy helyen mért hömérséklet alapján kezelte a fütésrendszerben a padlofütést, de közben kiderült, hogy a szakemberek valami nagyon elnéztek. 6 honapos szenvedés után megtalálták a hibát, igy át lett alakitva a fütésszabályozás, se sajnos a padlofütés nem lett jobb. Igy most megint én probálom kiegésziteni a profi rendszert.
Az uj berendezés egy második termosztatot kapott, egy idözitö orát ( programozhato mikor fütsön) egy bemenet, egy másik meg azt figyeli, hogy a gázkazán mikor füti a bojlert. ( kapcsolja be a keringetö pumpát. Az arduino két keringetö pumpát kapcsol, az egyik a bojlerben keringeti a fütövizet, a másik meg a padlofütés keringetö szivattyuját kezeli.
Az alapfeladat a következö.
Ha az ora bekapcsol, akkor az arduino megméri a bojlerben tárol viz hömérsékletét, s ha az több mint pl 45 fok akkor a fütövizet elkezdi keringetni a bojleren át.
A másik termosztat meg méri a padlofütéshez elérö fütövizet. Ott az nem lehet több mint 34 fok, külölnben a padlofütés lezár, azaz a forro viz nem kerül a rendszerbe.
Eddig kb 4-5 állapotot számoltam össze, melyik lenne a profibb program megoldás, simán megirni a programot bevinni a változokat meg az összefüggéseket, vagy jobb lenne állapot kezelövel ( state machine) kezelni a dolgokat.
Kösz az ötleteket. Szerintem meg tudom irni mindkét változatot.
Mivel elmélet így itt nem számít, hogy ez milyen MCU-ra íródik.
A tartály, gondolom valami nagyobb puffer tartály lehet, én mindenképpen vagy több hőmérőt helyeznék bele a tartályba függőlegesen, mert a víz képes a rétegződésre. Vagy időnként független a hőmérséklettől (főként ha egy helyen mérsz) meg keverném a vizet, hogy elegyedjen.
A másik része, hogy lehet kapni olyan szelepet, amely 35 foknál melegebb vizet nem enged át, tehát mikor fűtést indítód elsőnek a padlófűtést vizét keringetve melegíti fel a rendszer egészen addig, ameddig el nem éri a kívánt hőmérsékletet, majd a padlófűtés keringető leáll és fűti tovább a tartályt, ameddig szeretnéd. A köztes állapotra nincs ötletem, mert ha túl nagy a tartály, akkor lehet csak sokára hűl le a víz és a padlófűtés nem tud beindulni. Vagy 2 tartályt használsz. (utóbbit láttam már élesben is)
A tartály 600 literes, de nem a hidraulikus rendszerrel van a gond. Az mind adott és éntizedekig müködött, csak az uj kazán nem kepes kezelni a keverö szelepet (csak nyitni meg zárni tudta, de azt ki kellett iktatni, mert igy használhatatlan. Olyan szelepet meg már vagy 20 éve nem gyártanak, igy egyetlen uj kazán sem tudja kezelni, de ezt késön vették észre a szerelök. A régi kazán proporcionalisan nyitotta és több höérzékelövel kezelte a primér körben a viz hömérsékletét.
A padlofütés egységben benne van a gyári hömérseklet vezérlés, de eredetileg a keringetö szivattyú egyfolytában ment. Ezt szeretném most redukálni és levásztani az uj kazán vezérléséröl,: mert az használhatatlan erre a feladatra..
Engem gyakorlatilag csak most a programirás érdekelt
Sziasztok!
Egy Arduino Due-t szeretnék összehozni ezzel: PCM5102
Elvileg i2s-en kéne kommunikálniuk.
Ehhez elvileg van egy program itt:
ArduinoDueHifi
Viszont a bekötésre és a konfigurálásra semmi ötletem sincs.
Bármilyen segítséget köszönök!
Köszi.. Közben meglett éppen a válasz megtekintése előtt 1 perccel. Nem magamtól jöttem rá, szóval így + megerősítés..
Massawa: akkor mi a kérdés? Ha csak programozni kell, akkor könnyebb a dolog, hiszen csak írsz egyet és tesztelés, majd ha nem tetszik optimalizálász vagy írsz egy másmilyent. De elég nagy a hisztérzis csak hosszútávon fogod tudni tesztelni. A hozzászólás módosítva: Nov 1, 2022
Szia!
Szerintem állapotgéppel jobb lesz a progid a fűtés vezérlésre.
Én mindig azzal csinálok mindent amit lehet.
Kösz, nem vagyok nagyon profi az arduinoban ( évekig csak ASMben tudtam programozni) ezért bizonytalan voltam melyik a jobbik stilus.
Szerintem a DUE nem tudja meghajtani ezt a DAC-ot! Ezért nem találsz hozzá alkalmazást.
Próbálkozz inkább ESP32 modullal meg hajtani, ahhoz találsz AUDIO.lib-et. Jól használható PCM5102-vel!
Talán itt kapsz segítséget: Bővebben: PCM5102 test A hozzászólás módosítva: Nov 2, 2022
Idézet: „Szerintem a DUE nem tudja meghajtani ezt a DAC-ot!”
Miért nem? Van benne I 2S.
Mivel érdekelt a téma, ezért az elmúlt napon keresgéltem a neten.
És nem találtam biztató eredményeket, csak segítség kéréseket, hogy zajos a DUE-n külső DAC-os alkalmazás. De megoldást nem találtak rá.
Ha te ismersz működő arduinoDUE+MPCM5102-re alkalmazást? Ismertethetnéd az elérhetőségét!
Szívesen kipróbálnám.
Mivel AUDIO alkalmazásoknál Nem elég a DMA+I2S, hanem ki is kel azokat közben szolgálni elég gyorsan, küllőmben elég csúnya hangzást kapunk.
Bár az ESP32-es most olcsóbb mint a DUE. És található hozzá pár AUDIO alkalmazás MPCM5102-sel. Ezért én ezt választanám!
Nem, nem ismerek más(ok) által megírt, kész megoldást. Van benne megfelelő interfész, elvileg meg lehet írni. A sebesség érdekes kérdés. Ha a mikrokontroller elég is lenne, az Arduino környezet eléggé lerontja.
Köszi, még sosem próbáltam az Esp32-őt. Van olyan számítási kapacitása, illetve sebessége mint a Due-nak? Illetve Serial port illetve i2c az LCD-hez? Egyébként köszi a segítséget!
Sajnos szerintem ilyen modult készen nem kapok, illetve a bekötésről továbbra is hiányosak az infóim a képek alapján. Mindenesetre működni látszik az MPCM5202-vel. Én is tettem fel egy linket az eredeti kérdésemnél, ahol szoftveresen megoldották a dolgot. Sajnos a bekötésről ott sincsenek információim. Viszont ez a MPCM5202 kapható kereskedelmi forgalomban, ami nagy előnyt jelent minden más nem kapható alkatrésszel szemben.
Minden felsorolt I/O megtalálható rajta: Bővebben: ESP32 Pinout
Bővebben: Wiki
Ajánlom az:
Bővebben: Link
Idézet: „ESP32-S3
Kétmagos Xtensa LX7 CPU, akár 240 MHz-ig [10]
Hozzáadott utasítások a gépi tanulási alkalmazások felgyorsításához
512 KiB SRAM, 384 KiB ROM és 16 KiB RTC SRAM
WiFi 2,4 GHz (IEEE 802.11 b/g/n) [11]
Bluetooth 5 (LE)
44 programozható GPIO
USB OTG” A hozzászólás módosítva: Nov 3, 2022
És a I2S bekötések lehetnek mivel a belső DAC-ot nem használod:
#define Bit_Clock_BCLK 27
#define Word_Select_WS 26
#define Serial_Data_SD 25
De ez sem kötelező, állítólag szabadon választhatsz!
Bővebben: Példa A hozzászólás módosítva: Nov 3, 2022
Ez neked való project:
Bővebben: Simple_WiFi_Radio
Itt SPI LCD-t használ, szerintem az gyorsabb mint az I2C vezérléses.
Előny a sok tömörítési formátum lejátszása. Ha már SPI ekkor mehet rá SD kártya foglalat is, a legtöbb LCD-n már rajta szokott lenni.
Nagyon nagyon köszönöm, megnézem holnap, ha lesz 2 percem!
Üdv.
Egy olyan kérdésem lenne, hogy arduino alatt kezelgetek egy Arduino Due panelecskét.
Ezzel egyetemben fejlesztettem egy saját panelre egy kis projektet, ahol a due-tól több lábat használok. A due-ra sajnos nincs kivezetve az összes láb, és persze a nem használt lábak nincsenek is lekezelve. A kérdésem a következő: ha a variant.ccp-be beírom a kihagyott lábakat, akkor az működni fog? Sima dikitális kimenetekről van szó. Pl. a (93)PC11-es láb.
Pl.:
{ PIOC, PIO_PC11, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 38
Ha jól gondolom, akkor ez elé kellene betennem:
// END
{ NULL, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }
És ekkor milyen számot fog kapni a port? Ez ami nem teljesen világos nekem.
Mindennemű segítséget köszönök.
Köszönöm a linket. Ez valamennyire megerősített, hogy jó úton járok.
Kreáltam egy saját boardot az arduino alatt, ezen megpróbálom összehozni, és így a már meglévő boardot sem bántom.
Sziasztok.
Akadt egy kis problémám az alábbi programban.
Már minden úgy működik ahogy kell (bár az enkóder még érzékeny, néha kicsit ugrál?), viszont 330Khz felett valami baj van mert összekuszálódik a kimenő jelem.
Addig tű stabil szinusz, háromszög, négyszög megvan, viszont 330Khz felett beállítva olyan mintha folyamatosan változtatná 1Hz és 12,5Mhz között a jelsebességet a szkópon összevisszaság látszik csak.
A modulom AD9833 , az alaplap eredeti arduino uno 328P procival , kijelzőnek I2C-s 4x20-as Hdxxx kijelző.
Remélem valaki észreveszi a hibát amit nem látok.
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#define cols 20
#define rows 4
LiquidCrystal_I2C lcd(0x27,20,4);
char *Blank;
#define bMode 0x2
#define bDiv2 0x8
#define bOpbiten 0x20
#define bSleep12 0x40
#define bSleep1 0x80
#define bReset 0x100
#define bHLB 0x1000
#define bB28 0x2000
#define bCntrl_reg 0x0
#define bFreq_ reg0 0x4000
#define bFreq_ reg1 0x8000
#define bPhase_reg 0xC000
unsigned long Freq;
unsigned long FreqStep;
int Phase;
enum eWaveForm {wfSin, wfTri, wfSqr, wfSqr2};
eWaveForm WaveForm;
#define ShowScrollBar 1
#define ScrollLongCaptions 1
#define ScrollDelay 500
#define BacklightDelay 2000000
#define ReturnFromMenu 1
enum eMenuKey {mkNull, mkBack, mkRoot, mkSetFreq, mkSetPhase, mkForm, mkSin, mkTri, mkSquare,
mkSquareDiv2, mkInc, mkInc1, mkInc10, mkInc100, mkInc1000, mkAbout
};
#define pin_CLK 3
#define pin_DT 4
#define pin_Btn 5
unsigned long CurrentTime, PrevEncoderTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
eEncoderState EncoderState;
int EncoderA, EncoderB, EncoderAPrev, counter;
bool ButtonPrev;
eEncoderState GetEncoderState();
void LCDBacklight(byte v = 2);
eMenuKey DrawMenu(eMenuKey Key);
byte ScrollUp[8] = {0x4, 0xa, 0x11, 0x1f};
byte ScrollDown[8] = {0x0, 0x0, 0x0, 0x0, 0x1f, 0x11, 0xa, 0x4};
byte ItemsOnPage = rows;
unsigned long BacklightOffTime = 0;
unsigned long ScrollTime = 0;
byte ScrollPos;
byte CaptionMaxLength;
struct sMenuItem {
eMenuKey Parent;
eMenuKey Key;
char *Caption;
void (*Handler)();
};
sMenuItem Menu[] = {
{mkNull, mkRoot, "Menu", NULL},
{mkRoot, mkSetFreq, "Freki beallitas", NULL},
{mkRoot, mkSetPhase, "Fazisszog beallit.", NULL},
{mkRoot, mkForm, "Jelalak beallitas", NULL},
{mkForm, mkSin, "Szinusz", NULL},
{mkForm, mkTri, "Haromszog", NULL},
{mkForm, mkSquare, "Negyszog", NULL},
{mkForm, mkSquareDiv2, "Negyszog F/2", NULL},
{mkForm, mkBack, "Vissza", NULL},
{mkRoot, mkInc, "Freki lepcso beall.", NULL},
{mkInc, mkInc1, "1 HZ", NULL},
{mkInc, mkInc10, "10 HZ", NULL},
{mkInc, mkInc100, "100 HZ", NULL},
{mkInc, mkInc1000, "1000 HZ", NULL},
{mkInc, mkBack, "Vissza", NULL},
{mkRoot, mkAbout, "Amugy...", NULL},
{mkRoot, mkBack, "Vissza", NULL}
};
const int MenuLength = sizeof(Menu) / sizeof(Menu[0]);
void LCDBacklight(byte v) {
if (v == 0) {
BacklightOffTime = millis();
lcd.noBacklight();
}
else if (v == 1) {
BacklightOffTime = millis() + BacklightDelay;
lcd.backlight();
}
else {
if (BacklightOffTime < millis())
lcd.noBacklight();
else
lcd.backlight();
}
}
eMenuKey DrawMenu(eMenuKey Key) {
eMenuKey Result;
int k, l, Offset, CursorPos, y;
sMenuItem **SubMenu = NULL;
bool NeedRepaint;
String S;
l = 0;
LCDBacklight(1);
for (byte i = 0; i < MenuLength; i++) {
if (Menu[i].Key == Key) {
k = i;
}
else if (Menu[i].Parent == Key) {
l++;
SubMenu = (sMenuItem**) realloc (SubMenu, l * sizeof(void*));
SubMenu[l - 1] = &Menu[i];
}
}
if (l == 0) {
if ((ReturnFromMenu == 0) and (Menu[k].Handler != NULL)) (*Menu[k].Handler)();
LCDBacklight(1);
return Key;
}
CursorPos = 0;
Offset = 0;
ScrollPos = 0;
NeedRepaint = 1;
do {
if (NeedRepaint) {
NeedRepaint = 0;
lcd.clear();
y = 0;
for (int i = Offset; i < min(l, Offset + ItemsOnPage); i++) {
lcd.setCursor(1, y++);
lcd.print(String(SubMenu[i]->Caption).substring(0, CaptionMaxLength));
}
lcd.setCursor(0, CursorPos);
lcd.print(">");
if (ShowScrollBar) {
if (Offset > 0) {
lcd.setCursor(cols - 1, 0);
lcd.write(0);
}
if (Offset + ItemsOnPage < l) {
lcd.setCursor(cols - 1, ItemsOnPage - 1);
lcd.write(1);
}
}
}
EncoderState = GetEncoderState();
switch (EncoderState) {
case eLeft: {
LCDBacklight(1);
ScrollTime = millis() + ScrollDelay * 5;
if (CursorPos > 0) {
if ((ScrollLongCaptions) and (ScrollPos)) {
lcd.setCursor(1, CursorPos);
lcd.print(Blank);
lcd.setCursor(1, CursorPos);
lcd.print(String(SubMenu[Offset + CursorPos]->Caption).substring(0, CaptionMaxLength));
ScrollPos = 0;
}
lcd.setCursor(0, CursorPos--);
lcd.print(" ");
lcd.setCursor(0, CursorPos);
lcd.print(">");
}
else if (Offset > 0) {
Offset--;
NeedRepaint = 1;
}
break;
}
case eRight: {
LCDBacklight(1);
ScrollTime = millis() + ScrollDelay * 5;
if (CursorPos < min(l, ItemsOnPage) - 1) {
if ((ScrollLongCaptions) and (ScrollPos)) {
lcd.setCursor(1, CursorPos);
lcd.print(Blank);
lcd.setCursor(1, CursorPos);
lcd.print(String(SubMenu[Offset + CursorPos]->Caption).substring(0, CaptionMaxLength));
ScrollPos = 0;
}
lcd.setCursor(0, CursorPos++);
lcd.print(" ");
lcd.setCursor(0, CursorPos);
lcd.print(">");
}
else {
if (Offset + CursorPos + 1 < l) {
Offset++;
NeedRepaint = 1;
}
}
break;
}
case eButton: {
LCDBacklight(1);
ScrollTime = millis() + ScrollDelay * 5;
if (SubMenu[CursorPos + Offset]->Key == mkBack) {
free(SubMenu);
return mkBack;
}
Result = DrawMenu(SubMenu[CursorPos + Offset]->Key);
if ((Result != mkBack) and (ReturnFromMenu)) {
free(SubMenu);
return Result;
}
NeedRepaint = 1;
break;
}
case eNone: {
if (ScrollLongCaptions) {
S = SubMenu[CursorPos + Offset]->Caption;
if (S.length() > CaptionMaxLength)
{
if (ScrollTime < millis())
{
ScrollPos++;
if (ScrollPos == S.length() - CaptionMaxLength)
ScrollTime = millis() + ScrollDelay * 2;
else if (ScrollPos > S.length() - CaptionMaxLength)
{
ScrollPos = 0;
ScrollTime = millis() + ScrollDelay * 5;
}
else
ScrollTime = millis() + ScrollDelay;
lcd.setCursor(1, CursorPos);
lcd.print(Blank);
lcd.setCursor(1, CursorPos);
lcd.print(S.substring(ScrollPos, ScrollPos + CaptionMaxLength));
}
}
}
LCDBacklight();
}
}
} while (1);
}
void setup() {
pinMode(pin_CLK, INPUT);
pinMode(pin_DT, INPUT);
pinMode(pin_Btn, INPUT_PULLUP);
SPI.begin();
//lcd.begin();
lcd.init();
lcd.backlight();
CaptionMaxLength = cols - 1;
Blank = (char*) malloc(cols * sizeof(char));
for (byte i = 0; i < CaptionMaxLength; i++)
Blank[i] = ' ';
if (ShowScrollBar) {
CaptionMaxLength--;
lcd.createChar(0, ScrollUp);
lcd.createChar(1, ScrollDown);
}
Blank[CaptionMaxLength] = 0;
FreqStep = 1;
WaveForm = wfSin;
WriteAD9833(bCntrl_reg | bReset | bB28);
SetFrequency(100);
SetPhase(0);
WriteAD9833(bCntrl_reg | bB28);
LCDRepaint();
LCDBacklight(1);
}
void loop() {
unsigned long F;
switch (GetEncoderState()) {
case eNone: {
LCDBacklight();
return;
}
case eLeft: {
LCDBacklight(1);
if (Freq == 1) return;
if (Freq > FreqStep)
SetFrequency(Freq - FreqStep);
else
SetFrequency(1);
break;
}
case eRight: {
LCDBacklight(1);
if (Freq == 12500000) return;
if (Freq + FreqStep <= 12500000)
SetFrequency(Freq + FreqStep);
else
SetFrequency(12500000);
break;
}
case eButton: {
LCDBacklight(1);
switch (DrawMenu(mkRoot)) {
case mkSetFreq: {
F = InputFreq();
while ((F > 12500000) or (F < 1)) {
lcd.clear();
lcd.print("Fuggveny generator");
lcd.setCursor(0, 1);
lcd.print(" 1Hz tol egeszen");
lcd.setCursor(0, 2);
lcd.print("12.5Mhz -ig");
while (GetEncoderState() == eNone);
F = InputFreq();
}
if (F != Freq)
SetFrequency(F);
break;
}
case mkSetPhase: {
SetPhase(InputPhase());
break;
}
case mkSin: {
SetForm(wfSin);
break;
}
case mkTri: {
SetForm(wfTri);
break;
}
case mkSquare: {
SetForm(wfSqr);
break;
}
case mkSquareDiv2: {
SetForm(wfSqr2);
break;
}
case mkInc1: {
FreqStep = 1;
break;
}
case mkInc10: {
FreqStep = 10;
break;
}
case mkInc100: {
FreqStep = 100;
break;
}
case mkInc1000: {
FreqStep = 1000;
break;
}
case mkAbout: {
lcd.clear();
lcd. print("AD9833 F. generator");
lcd.setCursor(0, 1);
lcd.print(" Zikha");
while (GetEncoderState() == eNone){
LCDBacklight();
}
LCDBacklight(1);
break;
}
}
LCDRepaint();
return;
}
}
lcd.setCursor(0, 0);
lcd.print(Blank);
lcd.setCursor(0, 0);
lcd.print("Freki: ");
lcd.print(Freq);
lcd.print("Hz");
}
void LCDRepaint() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Freki: ");
lcd.print(Freq);
lcd.print("Hz");
lcd.setCursor(0, 1);
lcd.print("Fazis: ");
lcd.print( Phase);
lcd.print(" fok");
lcd.setCursor(0, 3);
lcd.print("AM modulacio max 80%");
lcd.setCursor(0, 2);
lcd.print("Forma: ");
switch (WaveForm) {
case wfSin: {
lcd.print("Szinusz");
break;
}
case wfTri: {
lcd.print("Haromszog");
break;
}
case wfSqr: {
lcd.print("Negyszog");
break;
}
case wfSqr2: {
lcd.print("Negyszog F/2");
break;
}
}
}
eEncoderState GetEncoderState() {
eEncoderState Result = eNone;
CurrentTime = millis();
if (CurrentTime >= (PrevEncoderTime + 5)) {
PrevEncoderTime = CurrentTime;
if (digitalRead(pin_Btn) == LOW ) {
if (ButtonPrev) {
Result = eButton;
ButtonPrev = 0;
}
}
else {
ButtonPrev = 1;
EncoderA = digitalRead(pin_DT);
EncoderB = digitalRead(pin_CLK);
if ((!EncoderA) && (EncoderAPrev)) {
if (EncoderB) Result = eRight;
else Result = eLeft;
}
EncoderAPrev = EncoderA;
}
}
return Result;
}
unsigned long InputFreq() {
unsigned long F = Freq;
int Positions[] = {4, 5, 7, 8, 9, 11, 12, 13};
int Digits[8];
int p = 0;
lcd.clear();
lcd.setCursor(0, 2);
lcd.print("Maximum freki 12Mhz");
lcd.setCursor(2, 0);
lcd.print("Kimeneti Freki:");
lcd.setCursor(14, 1);
lcd.print("Hz");
for (int i = 7; i >= 0; i--) {
Digits[i] = F % 10;
lcd.setCursor(Positions[i], 1);
lcd.print(Digits[i]);
F = F / 10;
}
lcd.setCursor(3, 3);
lcd.print("Kesz Kilep");
lcd.setCursor(Positions[0], 1);
lcd.cursor();
while (1)
{
EncoderState = GetEncoderState();
switch (EncoderState) {
case eNone: {
LCDBacklight();
continue;
}
case eLeft: {
LCDBacklight(1);
if (p == 0) continue;
if (p == 9) {
lcd.setCursor(10, 3); lcd.print(' ');
lcd.setCursor(2, 3); lcd.print('>');
p--;
continue;
}
if (p == 8) {
lcd.setCursor(2, 3); lcd.print(' ');
p--;
lcd.setCursor(Positions[p], 1);
lcd.cursor();
continue;
}
p--;
lcd.setCursor(Positions[p], 1);
continue;;
}
case eRight: {
LCDBacklight(1);
if (p == 9) continue;
if (p == 8) {
lcd.setCursor(2, 3); lcd.print(' ');
lcd.setCursor(10, 3); lcd.print('>');
p++;
continue;
}
if (p == 7) {
lcd.noCursor();
lcd.setCursor(2, 3); lcd.print('>');
p++;
continue;
}
p++;
lcd.setCursor(Positions[p], 1);
continue;;
}
case eButton: {
LCDBacklight(1);
if (p == 9) {
lcd.noCursor();
return Freq;
}
if (p == 8) {
lcd.noCursor();
F = 0;
for (int i = 0; i < 8; i++)
F = F * 10 + Digits[i];
return F;
}
EncoderState = eNone;
lcd.setCursor(Positions[p], 1);
lcd.blink();
while (EncoderState != eButton)
{
EncoderState = GetEncoderState();
switch (EncoderState) {
case eNone: {
LCDBacklight();
continue;
}
case eLeft: {
LCDBacklight(1);
if (Digits[p] == 0) continue;
lcd.setCursor(Positions[p], 1);
lcd.print(--Digits[p]);
lcd.setCursor(Positions[p], 1);
continue;
}
case eRight: {
LCDBacklight(1);
if (Digits[p] == 9) continue;
lcd.setCursor(Positions[p], 1);
lcd.print(++Digits[p]);
lcd.setCursor(Positions[p], 1);
continue;
}
}
}
LCDBacklight(1);
lcd.noBlink();
continue;
}
}
}
}
int InputPhase() {
int w = Phase;
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Kimeno fazis fordit");
lcd.setCursor(8, 1);
lcd.print(w);
lcd.print("Fok");
while (1) {
EncoderState = GetEncoderState();
switch (EncoderState) {
case eNone: {
LCDBacklight();
continue;
}
case eButton: {
LCDBacklight(1);
return w;
}
case eLeft: {
LCDBacklight(1);
if (w > 0) w--;
break;
}
case eRight: {
LCDBacklight(1);
if (w < 360) w++;
break;
}
}
lcd.setCursor(8, 1);
lcd.print(w);
lcd.print("Fok ");
}
}
void SetFrequency(unsigned long val) {
Freq = val;
unsigned long FreqData = round((float) val * 10.73741 + 0.5);
WriteAD9833 (FreqData & 0x3FFF | bFreq_ reg0);
WriteAD9833 ((FreqData >> 14) | bFreq_ reg0);
}
void SetPhase(int val) {
Phase = val;
unsigned long PhaseData = round (float(val) * 11.37777 + 0.5);
WriteAD9833(PhaseData | bPhase_reg);
}
void SetForm(eWaveForm val) {
WaveForm = val;
int16_t CntrlData;
switch (val) {
case wfSin: {
CntrlData = 0;
break;
}
case wfTri: {
CntrlData = bMode;
break;
}
case wfSqr: {
CntrlData = bOpbiten | bDiv2 | bSleep12;
break;
}
case wfSqr2: {
CntrlData = bOpbiten | bSleep12;
break;
}
}
WriteAD9833(CntrlData | bCntrl_reg | bB28);
}
void WriteAD9833(uint16_t Data) {
SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV8, MSBFIRST, SPI_MODE2));
digitalWrite(SS, LOW);
delayMicroseconds(1);
SPI.transfer16(Data);
digitalWrite(SS, HIGH);
SPI.endTransaction();
}
Nem ismerem ezeket a kütyüket, de ránézésre itt van a bibi:
WriteAD9833 (FreqData & 0x3FFF | bFreq_ reg0);
WriteAD9833 ((FreqData >> 14) | bFreq_ reg0);
Az alsó és a felső részletet is a 0-ás regiszterbe írod be.
|
|