From 7fb759369c3d4b527a46cc519d76527937d2ae37 Mon Sep 17 00:00:00 2001 From: Daniel Gorbea Date: Sat, 30 Oct 2021 16:33:57 -0500 Subject: [PATCH] Update --- README.md | 18 +++++++++++++++ images/img2.png | Bin 0 -> 45379 bytes src/arduino/oscilloscope/oscilloscope.ino | 27 ++++++++++++++++------ 3 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 images/img2.png diff --git a/README.md b/README.md index bdcd76c..b314e6f 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,21 @@ A simple oscilloscope application that reads the values at serial port generated


Main window

+ +


+ Settings

+ +Flash oscilloscpe.ino to an arduino board. In the Oscilloscope gui settings select the serial port with correct properties. By default 1000000bps, 8bits, no paraty, 1 stop bot and no flow control and an interval of 100ms between analog readings. + +For ATmega based boards there is a PWM signal at pin B2(OC1B). To test the Oscilloscope app connect pin B2 to pin A0 +Adjust PWM signal with PWM_FREQ and PWM_DUTY. Default is 100Hz, 50% duty. + +Pin B2 location: + - Uno, Leonardo: pin 10 + - ATmega2560: pin 12 + +To build the Oscilloscope app: +- install qt +- cd to src/qt folder +- qmake +- make diff --git a/images/img2.png b/images/img2.png new file mode 100644 index 0000000000000000000000000000000000000000..f3db7dde242e30408c805785ae4045d5a576950e GIT binary patch literal 45379 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%0DeU4g7-?n0eKC?>xj#w{#a;bhGEgN zrdnOdbZ7PWo;hhjF*PnUDhm?e0+yn4s>6Qre%1ljF$o&H(mA-qud1n;3@snHdn&O{ z0zNy(G6gv*@@Nzw&IG^-e1CfSN;iY;`SbUYY=G&AUsjP{=ZJ}+?SFY?Ygji9)?TX&))qO?!XG$Z-bQ)&kuiEIkVm}1WOd3bK4S`gb4Ap|@cCo$9o zVjSHSR~$-1O#p=8@eP0dPIBkY_{!X@Q>9ACuc9mle@{2c;{)a(YXoi)iB91_34%4) z{8Tc%H86-!UPx#Nbri1qDy-z!u)Gs89sP6zOso1o2a<9;LPDE%2Kw++jO%M7C4i?-1Rw%{k~WB< zY7TZsLCg0lpk6z*O{6$g5?-Rwi%VQY5`^kR$2|yLjy$CYz}ZKXgfCIjRkgGpzm|}Y zNUlHyrtLquUQAS!bY}?B$Oi1m@53fFt9nzuzyBuDFj1d8MX1+?o|PTODx|#hn9pr- z2DW$y+Zs?))bp?N@?6D=>SZ8a0-F%a0z^gp@=$DAIPL>cr0a-+1GD3~I)T_-%+DT> z)2Bd%ShD*ev+Uiw7hU(^w@osG{UEriD=T38eb^27A&&K}u+;JV3*a F>p`q@A{`9>n698EuyeOjbOurbdS+B&-Qg)}AbO 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 literal 0 HcmV?d00001 diff --git a/src/arduino/oscilloscope/oscilloscope.ino b/src/arduino/oscilloscope/oscilloscope.ino index df74971..9e2555c 100644 --- a/src/arduino/oscilloscope/oscilloscope.ino +++ b/src/arduino/oscilloscope/oscilloscope.ino @@ -1,24 +1,37 @@ -#define FREQ 100 // HZ -#define DUTY 0.5 // %/100 +/* Interval between analog readings. It has to be the same as defined in the Oscilloscope settings */ +#define INTERVAL 100// microseconds (us) + +/* PWM signal properties */ +#define PWM_FREQ 100 // HZ +#define PWM_DUTY 0.5 // %/100 #define MS_TO_COMP(SCALER) (F_CPU / (SCALER * 1000.0)) void setup() { pinMode(A0, INPUT); Serial.begin(1000000); - - // PWM 100Hz, 50% DUTY, PIN B2 + +#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) + /* PWM signal is available at pin B2(OC1B). To test the Oscilloscope app connect pin B2 to pin A0 + Adjust PWM signal with PWM_FREQ and PWM_DUTY + Pin B2: + Uno, Leonardo: pin 10 + ATmega2560: pin 12 + PWM 100Hz, 50% DUTY, PIN B2 + */ DDRB |= _BV(DDB2); TCCR1A = _BV(WGM11) | _BV(WGM10); TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11); // scaler 8 TCCR1A |= _BV(COM1B1); - OCR1A = 1000 / 100 * MS_TO_COMP(8); - OCR1B = 0.5 * OCR1A; + OCR1A = 1000 / PWM_FREQ * MS_TO_COMP(8); + OCR1B = PWM_DUTY * OCR1A; +#endif + } void loop() { static uint16_t ts = 0; - if ((uint16_t)micros() - ts > 100) + if ((uint16_t)micros() - ts > INTERVAL) { ts = micros(); uint8_t val = analogRead(A0) >> 2;