

Zobrazuje v prvnim radku krivku prubehu proudu samplovanou po dobu 15 milisekund, ve druhem radku zobrazuje minimalni a maximalni namerenou hodnotu vzorku hexadecimalne a v 8 bitovem rozliseni, takze 00..FF max a za lomitkem se strida namerena frekvence v HZ a presna doba trvani samplovaci funkce, obvykle 15444 mikrosekund.
Video z mereni pri zaple 2kW rychlovarne konvici je zde: http://mypower.cz/docs/video/ac-cal.htm
Bocnik mam od mateje, ktery k nemu pridal operacni zesilovac a tak tedy je signal z bocniku zesilen kvuli lepsimu rozliseni na arduinu, nicmene zda se mi ze signal se prilis dlouho drzi v nule. V matejove zapojeni je trimr, kterym se da pohnout se signalem nahoru nebo dolu. Ja potrebuji o kousek nahoru a to tak, aby minimalni namereny vzorek idealne lehce problikaval mezi 00 a 01. Tim ziskam jistotu, ze signal neni zespoda orezan a ze tedy merim cely rozsah krivky.
Badal jsem proc behem 15ms vidim jednu a pul vlny. Preci na 50Hz jedna vlna trva 20ms a tak bych pri 15ms vzorkovani mel videt 3/4 jedne vlny. Puvodne jsem myslel ze menic jede na 60Hz i pres to ze na jeho displayi je zobrazeno 50Hz. Inu matej na to nakonec prisel a figl je v tom, ze bocnikem merim DC stranu. Ta je usmernena a kmita ne na 50Hz ale na 100Hz. Takze vlastne jedna cela vlna trva 10ms a na displayi vidim pri 15ms jednu a pul vlny, coz sedi

Bomba, mam z toho radost, posunulo me to zase o kousek dal, chystam pro mistni komunitu obrovske prekvapeni a asi i konkurenci jistym komercnim resenim. S ohledem na to ze vysledek brzy vydam jako opensource, asi me nektere firmy nebudou mit moc rady, nebo me konecne zamestnaji a ja najdu konecne praci

Nize prikladam zdrojovy kod tohoto Arduino AsciiArt Osciloskopu.
- Kód: Vybrat vše
#define inputpin 11
// --------------------
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
Serial.begin(115200);
delay(1000);
pinMode(40, OUTPUT);
lcd.begin(16, 2); lcd.clear();
byte b[8];
for (byte x=0;x<8;x++)
{
for (byte l=0;l<8;l++)
if (l==x) b[l]=B11111; else b[l]=B00000;
lcd.createChar(7-x, b);
}
}
int SamplerHZexec(int qmin,int qmax)
{
int xcnt=0;
byte qsmp;
int xr=0;
int lxr=0;
int qh=((qmax-qmin)/2)+qmin;
unsigned long xms=millis();
unsigned long xmq=xms;
unsigned long xme=xms+1000;
while (true)
{
qsmp=(byte)(analogRead(inputpin)>>2);
if (qsmp>qh) xr=1; else xr=0;
if ((lxr!=xr) && ((xms-xmq)>5))
{
if ((xr==0) && (lxr==1))
{
xmq=xms;
xcnt++;
}
lxr=xr;
}
if (xms>=xme) break;
xms=millis();
}
return xcnt;
}
byte samples[128];
void SamplerExec()
{
for (int x=0;x<sizeof(samples);x++) samples[x]=0;
int xms,xm1;
xms=(int)(micros()>>6);
for (int x=0;x<sizeof(samples);x++)
{
samples[x]=(byte)(analogRead(inputpin)>>2);
while (true) { xm1=(int)(micros()>>6); if (xm1!=xms) break; }
xms=xm1;
}
}
byte qt=0;
int xhz=0;
void loop()
{
qt++;
unsigned long qms,qme;
digitalWrite(40, HIGH);
qms=micros();
SamplerExec();
qme=micros();
digitalWrite(40, LOW);
int qpmin=0xFF;
int qpmax=0x00;
int qmin=0xFF;
int qmax=0x00;
int qdsmp[16];
for (int x=0;x<16;x++) qdsmp[x]=0;
for (int x=0;x<sizeof(samples);x++)
{
byte xsmp=samples[x];
qdsmp[x>>3]+=xsmp;
if (xsmp<qmin) qmin=xsmp;
if (xsmp>qmax) qmax=xsmp;
}
for (int x=0;x<16;x++)
{
qdsmp[x]=(qdsmp[x]>>3);
byte xf=qdsmp[x];
if (xf<qpmin) qpmin=xf;
if (xf>qpmax) qpmax=xf;
}
int rdif=qpmax-qpmin;
int qtx;
lcd.setCursor(0, 0);
for (byte i=0;i<16;i++)
if (rdif==0)
lcd.print(" ");
else
{
qtx=(qdsmp[i]-qpmin)*7/rdif;
lcd.print((char)(qtx));
}
lcd.setCursor(0, 1);
char xstr[30]="";
if ((qt&0x02)==0)
sprintf(xstr,"%02X..%02X / %05dus",qmin,qmax,qme-qms);
else
sprintf(xstr,"%02X..%02X / %05dhz",qmin,qmax,xhz);
lcd.print(xstr);
xhz=SamplerHZexec(qmin,qmax);
}
Poznamky: Mereni AC probiha na analogovem pinu 11, ktery se da definovat uplne nahore v programu, dioda je napevno na digitalnim pinu 40 a sviti jen po dobu samplovani - kazdou vterinu tedy zlehoucka problikne. Display je LCD Keypad Shield k sehnani napriklad ve zdejsim shopu, bocnik se zesilovacem je od mateje.
