- Meggyi001: RTX 5060 - Az új népkártya?
- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- gban: Ingyen kellene, de tegnapra
- eBay-es kütyük kis pénzért
- sziku69: Szólánc.
- pr1mzejEE: Viszlát CoD2, CoD4, CS:GO!
- Magga: PLEX: multimédia az egész lakásban
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- bitpork: Phautós tali a Balcsinál 2025 Augusztus 2 napján (szombat)
Hirdetés
Talpon vagyunk, köszönjük a sok biztatást! Ha segíteni szeretnél, boldogan ajánljuk Előfizetéseinket!
-
LOGOUT
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
Gergosz2
veterán
válasz
JozsBiker #19050 üzenetére
Ennyit finomítanék a kódon :
#include <Arduino.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define ADC_BUFFER_SIZE 20
#define ADC_PIN A0
#define ADC_OFFSET 512.0f
#define ADC_GAIN 0.0f // be kell állítani
#define RMS_GAIN 0.05f // delta_T/T
volatile uint8_t bufferIterator = 0;
volatile uint16_t ADC_BUFFER[ADC_BUFFER_SIZE];
volatile bool CalcRMS = false;
uint16_t ADC_BUFFER_CALC[ADC_BUFFER_SIZE];
float RMS_Current;
unsigned long SerialTimer = 0u;
unsigned long SerialPrintTimeout = 1000;
void setup()
{
//Gergosz2 2023
Serial.begin(51200);
setupPWMInterrupt();
bufferIterator = 0;
SerialTimer = millis();
memset(ADC_BUFFER, (uint16_t)0, ADC_BUFFER_SIZE*sizeof(uint16_t));
}
void loop()
{
if (true == CalcRMS)
{
CalcRMS = false;
memcpy(ADC_BUFFER_CALC, ADC_BUFFER, ADC_BUFFER_SIZE*sizeof(uint16_t));
RMS_Current = 0.0f;
int iterator = 0;
for (iterator = 0; iterator < ADC_BUFFER_SIZE; iterator++)
{
float SI_val = (((float)ADC_BUFFER_CALC[iterator] - ADC_OFFSET)*ADC_GAIN);
RMS_Current = RMS_Current + SI_val*SI_val* RMS_GAIN;
}
RMS_Current = sqrt(RMS_Current);
}
if ((millis() - SerialTimer) > SerialPrintTimeout)
{
SerialTimer = millis();
Serial.println(RMS_Current);
}
}
void setupPWMInterrupt()
{
noInterrupts(); // disable all interrupts
TCCR2A = 0; // set entire TCCR2A register to 0
TCCR2B = 0; // same for TCCR2B
TCNT2 = 0; //initialize counter value to 0
// set compare match register for 1khz increments
OCR2A = 124; // = (16*10^6) / (2*1000*64) - 1 (must be <256)
TCCR2A |= (1 << WGM21); // turn on CTC mode
TCCR2B |= (1 << CS22); // Set CS01 and CS00 bits for 64 prescaler
sbi(TIMSK2, OCIE2A); // enable timer compare interrupt
interrupts(); // enable all interrupts
}
ISR(TIMER2_COMPA_vect)
{
ADC_BUFFER[bufferIterator] = analogRead(ADC_PIN);
bufferIterator ++;
if (bufferIterator > ( ADC_BUFFER_SIZE - 1u) )
{
CalcRMS = true;
bufferIterator = 0u;
}
}Láttam hogy van szkópod szóval ezeket így lehetne kalibrálni:
ADC_OFFSET : egyszerűen nulla terheléssel, értsd nincs rajta semmilyen fogyasztó, mekkora feszültség értéket ad vissza a szkóp? Tegyük fel, hogy 2.5V, akkor az ADC_OFFSET értéke (2.5/5)*1023 lesz, ami 512-re jön ki kerekítve.
ADC_GAIN : ha megvan az ADC_OFFSET, akkor ismert terhelésre megkéne nézni mit ad vissza a mérőműszer a kimenetén. Ehhez kéne a szkóp és multiméter is. Célszerű itt egy sima izzót használni, semmi fancy LED dolgot. Tegyük fel hogy az ADC_OFFSET 2.5V lett és mondjuk 2A csúcs folyt izzón amit a multiméterről olvastál le, amire 3V csúcsfeszültséget mértél a szópon. Ilyenkor az ADC_GAIN nem lesz más mint (5/1023)* 2 /(3-2.5).
Ha ezekről adsz képet és vagy mérési eredményt kiszámolom neked.
RMS_GAIN : ehhez nem nyúlj, kivéve ha a megszakítást akarod változtatni.
Az interrupt kezelő rész fontos bele ? Mit csinál tulajdonképpen ?
1kHz mintavételezési időt valósít meg , így gyakorlatilag 20 mintát vesz 1 hálózati periódusból.
Új hozzászólás Aktív témák
- Motorolaj, hajtóműolaj, hűtőfolyadék, adalékok és szűrők topikja
- Autós topik
- Samsung Galaxy Watch7 - kötelező kör
- Óra topik
- PlayStation 3
- Hardcore café
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- RC modell földön, vízen, levegőben
- AMD Navi Radeon™ RX 9xxx sorozat
- RAM topik
- További aktív témák...
- XFX RX-69XTATBD9 Xfx Radeon RX 6900 XT 16 GB GDDR6 videókártya csere Rtx 4070Ti
- AKCIÓ!!! GAMER PC: RYZEN 5 4500-5600X +RX 9060XT/9070/9070XT +16-64GB DDR4! GAR/SZÁMLA!!!
- AKCIÓ!!! DDR5 GAMER PC: RYZEN 5 8400F/9600X +RX 9060XT/9070/9070XT +16-64GB DDR5! GAR/SZÁMLA!!!
- Asus X299 TUF / Beszámítás OK!
- AKCIÓ!!! GAMER PC: RYZEN 7 5700/5800X +RX 9060XT/9070/9070XT +16-64GB DDR4! GAR/SZÁMLA!!!
- DELL Latitude 7340 i7-1365U 16GB 512GB 13.3" FHD+ TouchScren 1 év garancia
- Bomba ár! HP ProBook 440 G7 - i5-10GEN I 8GB I 256SSD I HDMI I 14" FHD I Cam I W11 I Gar
- Bomba ár HP X360 11 G5 - Intel N4020 I 4GB I 128GB SSD I 11,6" HD Touch I Cam I W11 I Garancia!
- PS 5 kontroller // Számla // Garancia //
- Bezámítás! HP Elitebook 840 G11 üzleti notebook- Intel Core Ultra 5 135U 16GB DDR5 RAM 256GB SSD W11
Állásajánlatok
Cég: FOTC
Város: Budapest