они не подтянуты, а подключены к минусу через резистор, подтяжка бы выглядела если кнопки подключены допустим к +5 вольт напрямую, а резистор был подключен одним концом к контакту кнопки который идет к ардуино, а другим на массу
Прошу прощения, что-то я зарисовался и мозг отключил... исправил, спасибо за внимательность. Хотя, если подтянуть к +5 програмно, то будет работать, только скетч нужно править))
Всем привет. Вышел на эту тему через youtube. Вопрос ко всем:
1) С чего вдруг такая зацикленность на мини-дисплеях? Разве вывод сигнала через USB не более практичен?
2) С чего вдруг такая зацикленность на Mega328, если платформа Arduino давно уже поддерживает такие же дешёвые STM32F103, который в стоке работает на 72 МГц?
Почитайте страницу автора, он там популярно изложил поставленные перед собой задачи перед разработкой данного устройства, вопросы сразу отпадут. Насчет стм тоже уже не раз отвечали про их ацп...
Здравия вам умные люди. Прошу прощения за глупые вопросы... Быть может кто то вразумит или сможет помочь.....
Так случилось что пришло понимание что требуется осцил (точнее компактный вариант...) Облазив инет (опухши голова от не знакомых слов) понял что либо тратить много денег либо много нервов....ни то не другое не вариант...
В спомнив что завалялся камень от ардуино , наткнулся на ваше решение. думаю вариант в полне хорош. надеюсь его воплотить.
Вот такие вопросы появились:
1. камень 328 есть, плата стравится .... понравился вариант от karl2233 с русской прошивкой( быть может и найдётся кварц на 27+ )....надеюсь что 34063 найдется в нашей деревне....
оказалась проблема в экране.... ну нет в ближайшем откопать из хлама 5110... зато нашёлся LPH8731-3C от Siemes A62 , даже есть какая то инфа http://cxem.net/mc/mc218.php
Возможно ли мне как человеку не могучему в программировании прицепится к нему? или всё не так плохо?
2. и так. потолок измерений прибора 2МГц ... теоретически покрывает большинство шимок (или я не прав?) , тоесть как тест индикатор например работоспособности фазы питания видеокарты вполне.... не забывая о максимум 5В входа..... Кажется подобный вопрос возникал, но не могу вспомнить, пишу сообщение уже 3 раз перескакивая по ссылкам. Возможно ли улучшить ( обезопасить вход "простыми" методами) http://oldoctober.com/ru/oscilloscope/ для хотябы 12-15В...? Боюсь сним лазить в БП где бывает и 250 не выйдет.
или всё же требуется ОУ ....или с ним лучше....? Быть может уже путаюсь с соседней темой осцилографа VirtOS ... В архивах просто вроде нет схем с ОУ. (а то TL082 вроде заволялись).
аттенюаторы (делители) еще никто не отменял. тем более что ипользоваться будет как индикатор наличия колебаний, после 20 кГц форма сигнала отображается весьма условно. частоту измеряет точно. может поможет ссылочка http://oldoctober.com/ru/oscilloscope/
...после 20 кГц форма сигнала отображается весьма условно. частоту измеряет точно.
Голословно малость... свой шим (понижайка) с отключением после 3.3В. ESP-12E. Отлаживаю схему на работе, ваяю код. В общем неделя любви - норм. Приношу домой - труп. Все. Есп падает в исключения и более не дает внятного на 9600, хотя espflasher прошивает ее успешно. Ок. Вторая... третья. Плюнул с четвертой поехал на осцил по боля. И на тебе всплеск (ни частоту ни вольтаж не измерял, плюнул, было очень обидно). Получислоь так что этот всплеск по питанию убивал какую-то часть есп, но при этом эта же схема под 5В (с 2-х последовательных литиев, т.е. там просттерл был куда больше чем 4.2 для 3.3есп, выходит в потолке 8.4 от 5В положеных, но опять же я предпологаю) не убивала mega328u... в общем шимки сразу сломал, остальное под деталье, к нг сделаю себе подарок на 200МГц нормальный осцил. А тут... вообще ровная прямая была... я так обрадовался
Здравствуйте. Если вам не сложно, не могли бы вы в кратце обьяснить как это сие чудо устроено и работает. Просто я в области радиоэлектроники почти абсолюный ноль, а разобраться и научится хочется.
Здравствуйте. Если вам не сложно, не могли бы вы в кратце обьяснить как это сие чудо устроено и работает. Просто я в области радиоэлектроники почти абсолюный ноль, а разобраться и научится НЕ хочется.
Вкратце так. Микроконтроллер, установленый в Ардуино способен замерять наряжение на аналоговом входе. В определенных пределах, конечно.
И способен рисовать точку на дисплее, соответствующую этому уровню напряжения.
И эту процедуру он может повторять с определенной частотой, называемой частотой выборок.
В Авторском варианте до 600 000 раз в секунду.
А управляет этим процессом программа, залитая в микроконтроллер.
И эта программа заставляет контроллер нарисовать линию от каждой предыдущей точки до каждой последующей. В результате на дисплее видим некую линию. Прямую, кривую. Любую.
Серьезные цифровые осциллографы, ну кроме сложности схемы, отличаются от Пультоскопа сложностью програмного кода, его размером, а главное частотой выборок.
Чтобы построить более менее адекватно скажем один период синусоиды, нужно не менее 10 выборок (точек графика). А лучше 20.
Вот собственно этим цифровой осциллограф и занимается - строит графики по точкам.
Чем сложнее форма сигнала, тем больше точек нужно для ее адекватного построения.
всех приветствую!!! все 3 тысячи постов не могу прочитать заново, извините!!! собрал все это в корпусе внешнего жесткого диска, и пришла необходимость использовать делитель, что бы мерить выше пяти вольт. в начале я встречал посты как делать делитель. но хотелось бы услышать как вы сделали его на практике. просто эти переключатели очень грамозкие
Здравствуйте господа. Собрал версию пультоскопа на дисплее 7735 128/64. Загузил вот это скетч:
//страничка проекта <a href="<a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>" rel="nofollow"><a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a></a>
// форум <a href="<a href="http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783" rel="nofollow">http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783</a>" rel="nofollow"><a href="http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783" rel="nofollow">http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783</a></a>
// скетч и библиотеку изменил под LCD_ls020 VetalST
// скетч и библиотеку изменил под LCD 1.8 дюйма 160х128 ST7735 Владимир Иванов ( 240265 )
// LCD_ls020 подключаем:
// к ардуине на ATmega328
//**********************************************************
#include <Adafruit_GFX.h> //<a href="https://github.com/adafruit/Adafruit-GFX-Library" rel="nofollow">https://github.com/adafruit/Adafruit-GFX-Library</a>
#include <Adafruit_ST7735.h> //<a href="https://github.com/adafruit/Adafruit-ST7735-Library" rel="nofollow">https://github.com/adafruit/Adafruit-ST7735-Library</a>
#include <SPI.h>
#include <FreqCount.h> //<a href="http://www.pjrc.com/teensy/td_libs_FreqCount.html" rel="nofollow">http://www.pjrc.com/teensy/td_libs_FreqCount.html</a>
#include <PWM.h> //<a href="https://puzzlebox.io/orbit/development/browser/orbit/arduino/libraries/PWM/PWM.h" rel="nofollow">https://puzzlebox.io/orbit/development/browser/orbit/arduino/libraries/PWM/PWM.h</a>
// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8" TFT shield
#define TFT_CS 10
#define TFT_RST A0 // можно подключить к D9
#define TFT_DC 8
// Option 1 (recommended): must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// Option 2: use any pins but a little slower!
//#define TFT_SCLK 13 // set these to be whatever pins you like!
//#define TFT_MOSI 11 // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#define Out 9 //пин для генератор сигналов и DSS(не менять)
#define dds 9 //пин для генератора dds (не менять)
//#################№№№№№№####пользовательские настройки!
#define levo 2
#define ok 3
#define pravo 4
#define akb A3 //любой своюодный аналоговый пин для измерения напряжения АКБ
#define delit 6 //включен или отключен делитель на х10
#define overclock 27 //Частота на которой работает Ардуино
byte SinU=30; // =30; //уровень синхронизации 0 до 255
int PWM = 128;//стартовое значение ШИМ от 0 до 255
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=4.9; //напряжение питания, меряем мультиметром
byte pultoskop=1; //флаг выбора генератора или осциллографа
//###########################################################
byte menuDDS=0;
byte sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1};
byte pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255};
byte RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
byte trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1};
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[256];//массив АЦП
//byte massDEL[401];
byte menu=1;//переменная верхнего меню
byte razv=5;//значение развертки
byte x=30; //счетчик оси Х
int Vmax=0;// максимальное напряжение
unsigned long pause=0;//переменная для замены Delay
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
long countX=0;
byte sinhMASS=0;
unsigned long count =0;
int prokr=0;
char str[10];
int temp;
float armcurrent;
int d=0;
String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB8; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
//********************* ОТРИСОВКА ЛИНИИ *********************************
void Line(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
uint16_t color) {
bool vektor = abs(x0 - x1) > abs (y0 - y1);
if (vektor) {
if (y1 > y0) {
int h = x1 - x0 + 1;
int d = y1 - y0 + 1;
h = h / d;
for (; y0 <= y1; y0++) {
tft. drawFastHLine(x0, y0, h, color);
x0 = x0 + h;
}
}
else {
int h = x1 - x0 + 1;
int d = y0 - y1 + 1;
h = h / d;
for (; y0 >= y1; y0--) {
tft. drawFastHLine(x0, y0, h, color);
x0 = x0 + h;
}
}
}
else {
if (y1 > y0) {
int h = y1 - y0 + 1;
int d = x1 - x0 + 1;
h = h / d;
for (; x1 >= x0; x0++) {
tft. drawFastVLine(x0, y0, h, color);
y0 = y0 + h;
}
}
else {
int h = y0 - y1 + 1;
int d = x1 - x0 + 1;
h = h / d;
for (; x1 >= x0; x1--) {
tft.drawFastVLine(x1, y1, h, color);
y1 = y1 + h;
}
}
}
}
//********************* МЕНЮ DDS *********************
void DDS_Menu () {
tft.setCursor(35, 30);
tft.setTextColor(ST7735_WHITE);
tft.setTextSize(1);
tft.println(utf8rus("СИНУС"));
tft.setCursor(35, 50);
tft.println(utf8rus("ТРЕУГОЛЬНИК"));
tft.setCursor(35, 70);
tft.println(utf8rus("ПИЛА"));
tft.setCursor(35, 90);
tft.println(utf8rus("ПИЛА ОБР"));
}
//***************** ОТРИСОВКА В ПАУЗЕ ОСЦИЛОГРАФА *******************
void Pause(){
tft.fillRect(0, 12, 160, 3, ST7735_BLACK);//стиране шкалы прокрутки
tft.fillRect(6, 12, 154, 99, ST7735_BLACK);//стиране поле графика
// tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ
//////////////////////////////////////////////////////////////
tft.drawLine(prokr/4,12,prokr/4+25,12, ST7735_YELLOW);//шкала прокрутки
tft.drawLine(prokr/4,13,prokr/4+25,13, ST7735_YELLOW);//шкала прокрутки
tft.drawLine(prokr/4,14,prokr/4+25,14, ST7735_YELLOW);//шкала прокрутки
//++++++++++++++++ СЕТКА
for(byte i=110;i>18;i=i-3){
tft.drawPixel(6,i, ST7735_BLUE);
tft.drawPixel(25,i, ST7735_BLUE);
tft.drawPixel(44,i, ST7735_BLUE);
tft.drawPixel(63,i, ST7735_BLUE);
tft.drawPixel(82,i, ST7735_BLUE);
tft.drawPixel(101,i, ST7735_BLUE);
tft.drawPixel(120,i, ST7735_BLUE);
tft.drawPixel(139,i, ST7735_BLUE);
tft.drawPixel(158,i, ST7735_BLUE);
// tft.drawPixel(159,i, ST7735_BLUE);
}
for(byte i=6;i<160;i=i+3){
tft.drawPixel(i,25, ST7735_BLUE);
tft.drawPixel(i,42, ST7735_BLUE);
tft.drawPixel(i,59, ST7735_BLUE);
tft.drawPixel(i,76, ST7735_BLUE);
tft.drawPixel(i,93, ST7735_BLUE);
tft.drawPixel(i,110, ST7735_BLUE);
}
//////////////////////////////////////////////////////
x=5;
for(int y=prokr;y<prokr+146;y++){
if(razv<7){ x++;}
if(razv==7){x=x+2;}
if(razv==8){ x=x+3; }
if(razv==9){ x=x+4; }
if(razv==10){ x=x+5; }
if(x>160){ x=160; }
// tft.drawPixel(x,110-mass[y]/3,ST7735_GREEN);
tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
}
}
//************* ОТРИСОВКА ВЕРХНЕГО МЕНЮ ************************
void PrintVmenu(){
tft.fillRect(0, 0, 45, 9, ST7735_BLACK);
if(digitalRead(delit)==HIGH){//включен или отключен делитель
if(opornoe==0){
tft.setTextColor(ST7735_WHITE);
tft.setCursor(3, 1);
tft.println( "2.2V/d");
}
if(opornoe==1){
tft.setTextColor(ST7735_WHITE);
tft.setCursor(3, 1);
tft.println( "10V/d");
}
}
else {//включен или отключен делитель
if(opornoe==0){
tft.setTextColor(ST7735_WHITE);
tft.setCursor(3, 1);
tft.println( "0.22V/d");
}
if(opornoe==1){
tft.setTextColor(ST7735_WHITE);
tft.setCursor(3, 1);
tft.println( "1V/d");
}
}
tft.setCursor(55, 1);
tft.println( utf8rus("Разв"));
sprintf(str, "%d", razv);
tft.setCursor(91, 1);
tft.println( str);
}
//******************* ОТРИСОВКА ГЛАВНОГО МЕНЮ *****************
void GlavMenu (){
tft.setTextSize(1);
tft.setTextColor(ST7735_WHITE);
tft.setCursor(35, 25);
tft.println(utf8rus("Осцилограф"));
tft.setCursor(35, 55);
tft.println(utf8rus("Генератор PWM"));
tft.setCursor(35, 85);
tft.println(utf8rus("Генератор DDS"));
tft.setTextColor(ST7735_BLUE);
tft.setCursor(30, 110);
tft.println(utf8rus("Батарея ="));
armcurrent = ((analogRead(akb)*VCC/1024)*11.17);//проверка напряжения на АКБ
temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
tft.fillRect(90,110,24,10,ST7735_BLACK);
tft.setTextColor(ST7735_BLUE);
tft.setCursor(90, 110);
tft.println(str);
}
void setup(){
//tft.cp437(true);
if(opornoe==0){
ADMUX = 0b11100100;
}//выбор внутреннего опорного 1,1В
if(opornoe==1){
ADMUX = 0b01100100;
}//Выбор внешнего опорного
SPI.begin;
SPI.setClockDivider(SPI_CLOCK_DIV2);
tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
tft.setRotation(1); // повернуть по горизонту
tft.fillScreen(ST7735_BLACK);
tft.drawRect(0,0,160,128,ST7735_WHITE); // рисуем рамку
tft.drawRect(2,2,156,125,ST7735_BLUE); // рисуем рамку
tft.drawRect(4,3,152,121,ST7735_RED); // рисуем рамку
// подтянули кнопки к питанию
//digitalWrite(levo, HIGH); digitalWrite(pravo, HIGH); digitalWrite(ok, HIGH);
while(digitalRead(ok)==LOW){
if(digitalRead(pravo)==HIGH){
// delay (10);
while((digitalRead(pravo)==HIGH));
pultoskop=pultoskop-1;
if(pultoskop<1)pultoskop=3;
}
if(digitalRead(levo)==HIGH){
// delay (10);
while((digitalRead(levo)==HIGH));
pultoskop=pultoskop+1;
if(pultoskop>3)pultoskop=1;
}
if(pultoskop==1){
GlavMenu ();
// tft.setTextSize(1);
tft.setTextColor(ST7735_RED);
tft.setCursor(35, 25);
tft.println(utf8rus("Осцилограф"));
}
if(pultoskop==2){
GlavMenu ();
tft.setCursor(35, 55);
tft.setTextColor(ST7735_RED);
tft.println(utf8rus("Генератор PWM"));
}
if(pultoskop==3){
GlavMenu ();
tft.setCursor(35, 85);
tft.setTextColor(ST7735_RED);
tft.println(utf8rus("Генератор DDS"));
}
delay(200);
}
tft.fillScreen(ST7735_BLACK);//очистка дисплея
if(pultoskop==1){
FreqCount.begin(1000);
// tft.fillScreen(ST7735_BLACK);//очистка дисплея
}
if(pultoskop==2){
InitTimersSafe();
bool success = SetPinFrequencySafe(Out, frequency);
// tft.fillScreen(ST7735_BLACK);//очистка дисплея
}
if(pultoskop==3){
InitTimersSafe();
bool success = SetPinFrequencySafe(Out,200000);
// tft.fillScreen(ST7735_BLACK);//очистка дисплея
}
delay(500);
}
void Zamer(){
if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
if (razv==5){ADCSRA = 0b11100011;}//delitel 8
if (razv==4){ADCSRA = 0b11100100;}//delitel 16
if (razv==3){ADCSRA = 0b11100101;}//delitel 32
if (razv==2){ADCSRA = 0b11100110;}//delitel 64
if (razv<2){ADCSRA = 0b11100111;}//delitel 128
if (razv==0){
for(int i=0;i<255;i++){
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
delayMicroseconds(500);
mass[i]=ADCH;
}
}
if (razv>0){
for(int i=0;i<255;i++){
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
mass[i]=ADCH;
}
}
}
void MenuT(){//перерисовка нижнего меню
if (FreqCount.available()) {count = FreqCount.read();} //вывод частоты по готовности счетчика
//#######################################частоты сигнала
byte Frec1=0;
long Frec=0;
bool flagFrec1=0;
bool flagFrec2=0;
bool flagFrec3=0;
for(int y=1;y<255;y++){
if(flagFrec1==0){
if(mass[y]<SinU){
flagFrec2=1;
}
}
if(flagFrec1==0){
if(flagFrec2==1){
if(mass[y]>SinU){
flagFrec1=1;
Frec1=y;
}
}
}
if(flagFrec1==1){
if(mass[y]<SinU){
flagFrec3=1;
}
}
if(flagFrec3==1){
if(mass[y]>SinU){
if (razv>=6){ Frec=1000000/((y-Frec1-1)*3.27); }//delitel 4
if (razv==5){ Frec=1000000/((y-Frec1)*3.27)/2; }//delitel 8
if (razv==4){ Frec=1000000/((y-Frec1)*3.27)/4; }//delitel 16
if (razv==3){ Frec=1000000/((y-Frec1)*3.27)/8; }//delitel 32
if (razv==2){ Frec=1000000/((y-Frec1)*3.27)/16; }//delitel 64
if (razv==2){ Frec=1000000/((y-Frec1)*3.27)/32; }//delitel 128
if (razv==1){ Frec=1000000/((y-Frec1)*3.27)/32; }//delitel 128
if (razv==0){ Frec=1000000/((y-Frec1)*500)-0.2; }//-0.2 КОРЕКЦИЯ ПОКАЗАНИЙ ЧАСТОТЫ ГЦ //delitel 128
flagFrec1=0;
flagFrec3=0;
}
}
}
//#######################################частоты сигнала
tft.setTextColor(ST7735_WHITE);
tft.setCursor(1, 120);
tft.println( "F=");
if(opornoe==1){
if((Vmax*VCC/255)>2.8){ countX=count*(overclock/16.0); }
if((Vmax*VCC/255)<=2.8){ countX=Frec*(overclock/16.0); }
}
if(opornoe==0){ countX=Frec*(overclock/16.0); }
if(countX<1000){
sprintf(str, "%d Hz", countX);
tft.setTextColor(ST7735_WHITE);
tft.setCursor(18, 120);
tft.println( str);
}
if(countX>=1000){
float countXK=countX/1000.0;
temp = (countXK - (int)countXK) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д
sprintf(str, "%d.%03d kHz", (int)countXK, abs(temp));
tft.setTextColor(ST7735_WHITE);
tft.setCursor(18, 120);
tft.println( str);
}
tft.setTextColor(ST7735_WHITE);
tft.setCursor(18, 120);
tft.println( str);
//--------- Напряжение --------------------
if(digitalRead(delit)==HIGH){//включен или отключен делитель
if(opornoe==0){ armcurrent = (Vmax*1.1/255)*10; }
if(opornoe==1){ armcurrent = (Vmax*VCC/255)*10; }
}
else {
if(opornoe==0){ armcurrent = Vmax*1.1/255; }
if(opornoe==1){ armcurrent = Vmax*VCC/255; }
}
tft.setTextColor(ST7735_WHITE);
tft.setCursor(100, 120);
tft.println( "U=");
temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
tft.setTextColor(ST7735_WHITE);
tft.setCursor(118, 120);
tft.println( str);
}
void loop() {
if(pultoskop==1){
while(1){
//********** ОТРИСОВКА И ПЕРЕБОР ВЕРХНЕГО МЕНЮ ***************************
//***************** опорное **************************
if(menu==0){
tft.fillRect(0, 0, 45, 9, ST7735_RED);
PrintVmenu();
if(digitalRead(pravo)==HIGH){
tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
opornoe=1;
}
if(digitalRead(levo)==HIGH){
tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
opornoe=0;
}
}
/////////////////////////// развертка /////////////////////////////
if(menu==1){
tft.fillRect(48, 0, 57, 9, ST7735_RED);
PrintVmenu();
if(digitalRead(pravo)==HIGH){//добавть скорость
delay (30);
while((digitalRead(pravo)==HIGH));
razv++;
if(razv==11){ razv=10;}
}
if(digitalRead(levo)==HIGH){//убавить скорость
delay (30);
while((digitalRead(levo)==HIGH));
razv--;
if(razv==255){ razv=0; }
}
}
///////////////////// синхронизация /////////////////////////////////
if(menu==2){
prokr=0;
paus=0;
PrintVmenu();
tft.fillRect(105, 0, 174, 9, ST7735_RED);
tft.setCursor(112, 1);
tft.println( utf8rus("Синх-ция"));
if(digitalRead(levo)==HIGH){
SinU=SinU-10;
if(SinU<10){ SinU=10; }
}
if(digitalRead(pravo)==HIGH){
SinU=SinU+10;
if(SinU>240){ SinU=240; }
}
tft.fillCircle(155,110-SinU/3, 3, ST7735_RED);
tft.fillCircle(155,110-SinU/3, 1, ST7735_BLACK);
}
///////////////////// пауза //////////////////////////////////
if(menu==3){
paus=1;
if(clen_p==0){
clen_p=1;
tft.fillRect(105, 0, 174, 9, ST7735_RED);
PrintVmenu();
tft.setCursor(112, 1);
tft.println( utf8rus("ПАУЗА"));
}
}
if(digitalRead(ok)==HIGH){
delay (30);
while((digitalRead(ok)==HIGH));
menu++;
tft.fillRect(6, 16, 154, 99, ST7735_BLACK);//стиране поле графика
tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ
if(menu==4){
menu=0;
paus=0;
clen_p=0;
}
tft.fillRect(0, 0, 160, 15, ST7735_BLACK);//стиране ВЕРХ МЕНЮ
}
//************** ОСЬ НАПРЯЖЕНИЯ ##########################################
tft.drawLine(2, 20, 2, 114, ST7735_BLUE);
tft.drawLine(2, 25, 5, 25, ST7735_BLUE);
tft.drawLine(2, 42, 5, 42, ST7735_BLUE);
tft.drawLine(2, 59, 5, 59, ST7735_BLUE);
tft.drawLine(2, 76, 5, 76, ST7735_BLUE);
tft.drawLine(2, 93, 5, 93, ST7735_BLUE);
tft.drawLine(2, 110,5, 110, ST7735_BLUE);
//************ ОСЬ РАЗВЕРТКИ ##########################################
tft.drawLine(2, 115,158, 115, ST7735_BLUE);
// Черточки ******************
for(byte i=6;i<160;i=i+19){
tft.drawPixel(i,114, ST7735_BLUE);
tft.drawPixel(i,113, ST7735_BLUE);
tft.drawPixel(i,112, ST7735_BLUE);
}
//***************выбор внутреннего опорного 1,1В ########################################
if(opornoe==0){ ADMUX = 0b11100100; }
//**************Выбор внешнего опорного ***************************
if(opornoe==1){ ADMUX = 0b01100100; }
delay(5);
if(paus==0){
Zamer();}
//####################################### определение точки синхронизации
bool flagSINHRO=0;
bool flagSINHRnull=0;
for(int y=1;y<255;y++){
if(flagSINHRO==0){ if(mass[y]<SinU){ flagSINHRnull=1; }}
if(flagSINHRO==0){ if(flagSINHRnull==1){ if(mass[y]>SinU){ flagSINHRO=1; sinhMASS=y; } } } }
//#######################################определение точки синхронизации
//максимальное значение сигнала ##########################
Vmax=0;
for(int y=1;y<151;y++){ if(Vmax<mass[y]){ Vmax=mass[y]; } }
//максимальное значение сигнала ##########################
//************************ ОТРИСОВКА ГРАФИКА *************************
if(paus==0){
tft.fillRect(6, 25, 154, 86, ST7735_BLACK);//стиране поле графика
//***//*************** стиране НИЖНЕГО МЕНЮ **********************
tft.fillRect(18, 120, 80, 8, ST7735_BLACK);
tft.fillRect(118, 120, 25, 8, ST7735_BLACK);
//*****************************************************************
tft.fillCircle(10,110-SinU/3, 2, ST7735_YELLOW);//рисуем уровень синхронизации
tft.fillCircle(10,110-SinU/3, 3, ST7735_YELLOW);//рисуем уровень синхронизации
x=5;
for(int y=sinhMASS-1;y<sinhMASS+151;y++){
if(razv<7){ x++; }
if(razv==7){ x=x+2; }
if(razv==8){ x=x+3; }
if(razv==9){ x=x+4; }
if(razv==10){ x=x+5; }
if(x>159){ x=159; }
Line(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график через Line (быстрее в 2 раза)
}
MenuT();
}
///////////////////////////// режим паузы ////////////////////////////////////////////////
if(paus==1){
if(digitalRead(pravo)==HIGH){//листаем
prokr=prokr+2;
if(prokr>554){prokr=0; }
Pause();
}
if(digitalRead(levo)==HIGH){//листаем
prokr=prokr-2;
if(prokr<0){prokr=554; }
Pause();
}
}
// delay(300); // можно удалить или подобрать по скорости обновления экрана
}
}
//************************************************************************************************
//####################################### режим uенератора от 1 Гц до 2 МГц
if(pultoskop==2){
while(1){
if (flag==0){//флаг выборов режима настройки Частоты
if(digitalRead(levo)==HIGH){
frequency=frequency-mnog;
if(frequency<0){
frequency=0;
}
bool success = SetPinFrequencySafe(Out, frequency);
delay(3);//защита от дребезга
tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля
}
if(digitalRead(pravo)==HIGH){
frequency=frequency+mnog;
bool success = SetPinFrequencySafe(Out, frequency);
delay(3);//защита от дребезга
tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля закрашиваем
}
}
if (flag==1){//флаг выборов режима настройки ШИМ
if(digitalRead(levo)==HIGH){
PWM=PWM-2;
if(PWM<0){
PWM=255;
}
delay(3);//защита от дребезга
tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
}
if(digitalRead(pravo)==HIGH){
PWM=PWM+2;
if(PWM>255){
PWM=0;
}
delay(3);//защита от дребезга
tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
}
}
if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты
delay (30);
while((digitalRead(ok)==HIGH));
hag++;
if(hag>=6){
hag=0;
}
tft.fillRect(6, 100, 154, 28, ST7735_BLACK);//стирание поля
}
////////////
tft.setCursor(10, 19);
tft.setTextColor(ST7735_GREEN);
tft.setTextSize(2);
tft.println("PWM =");
// temp = PWM*100/255;
tft.setCursor(80, 19);
tft.println( PWM*100/255,1);
tft.setCursor(122, 19);
tft.println( "%");
armcurrent = (127*PWM/255)+25; // вычисляем длинны линии
tft.drawLine(6,10,armcurrent,10, ST7735_YELLOW);
tft.drawLine(6,11,armcurrent,11, ST7735_YELLOW);
tft.drawLine(6,12,armcurrent,12, ST7735_YELLOW);
tft.drawLine(6,13,armcurrent,13, ST7735_YELLOW);
tft.drawLine(6,14,armcurrent,14, ST7735_YELLOW);
tft.drawLine(6,37,armcurrent,37, ST7735_YELLOW);
tft.drawLine(6,38,armcurrent,38, ST7735_YELLOW);
tft.drawLine(6,39,armcurrent,39, ST7735_YELLOW);
tft.drawLine(6,40,armcurrent,40, ST7735_YELLOW);
tft.drawLine(6,41,armcurrent,41, ST7735_YELLOW);
///////////////////////////////////
long frequencyX=frequency*(overclock/16.0);
tft.setTextSize(2);
if(frequencyX<1000){
sprintf(str, "%d Hz", frequencyX);
tft.setCursor(30, 60);
tft.setTextColor(ST7735_WHITE);
tft.println(str);
tft.setTextSize(1);
}
if(frequencyX>=1000&&frequencyX<1000000){
tft.setTextSize(2);
armcurrent=frequencyX/1000.0;
temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%003d kHz", (int)armcurrent, abs(temp));
tft.setCursor(15, 60);
tft.setTextColor(ST7735_WHITE);
tft.println(str);
tft.setTextSize(1);
}
if(frequencyX>=1000000){
tft.setTextSize(2);
armcurrent=frequencyX/1000000.0;
temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%003d MHz", (int)armcurrent, abs(temp));
tft.setCursor(30, 60);
tft.setTextColor(ST7735_WHITE);
tft.println(str);
tft.setTextSize(1);
}
if(frequencyX>2000000)frequency=0;
//////////////////////////////////////////////////////////////
tft.setCursor(5, 100);
tft.setTextColor(ST7735_BLUE);
tft.setTextSize(1);
tft.println(">>");
if(hag==0){//выбор множителя частоты
mnog=1;
flag=0;
armcurrent = 1*(overclock/16.0);
tft.setTextSize(2);
temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
tft.setCursor(30, 100);
tft.setTextColor(ST7735_YELLOW);
tft.println(str);
}
if(hag==1){//выбор множителя частоты
mnog=10;
armcurrent = 10*(overclock/16.0);
tft.setTextSize(2);
temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
tft.setCursor(30, 100);
tft.setTextColor(ST7735_YELLOW);
tft.println(str);
}
if(hag==2){//выбор множителя частоты
mnog=100;
armcurrent = 100*(overclock/16.0);
tft.setTextSize(2);
temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
tft.setCursor(30, 100);
tft.setTextColor(ST7735_YELLOW);
tft.println(str);
}
if(hag==3){//выбор множителя частоты
mnog=1000;
armcurrent = 1*(overclock/16.0);
tft.setTextSize(2);
temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
tft.setCursor(30, 100);
tft.setTextColor(ST7735_YELLOW);
tft.println(str);
}
if(hag==4){//выбор множителя частоты
mnog=10000;
armcurrent = 10*(overclock/16.0);
tft.setTextSize(2);
temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
tft.setCursor(30, 100);
tft.setTextColor(ST7735_YELLOW);
tft.println(str);
}
if(hag==5){//выбор PWM
flag=1;
tft.setTextSize(2);
tft.setCursor(25, 100);
tft.setTextColor(ST7735_YELLOW);
tft.println("PWM =");
// temp = PWM*100/255;
tft.setCursor(95, 100);
tft.setTextColor(ST7735_YELLOW);
tft.println(PWM*100/255,1);
tft.setCursor(132, 100);
tft.setTextColor(ST7735_YELLOW);
tft.println("%");
}
tft.setCursor(145, 100);
tft.setTextColor(ST7735_BLUE);
tft.setTextSize(1);
tft.println("<<");
pwmWrite(Out, PWM);
delay(50);
}
}
//************************************************************************************************
//####################################### режим DDS ренератор
if(pultoskop==3){
while(1){
int fr=10;
if(menuDDS==0){
DDS_Menu ();
tft.setCursor(35, 30);
tft.setTextColor(ST7735_RED);
// tft.setTextSize(1);
tft.println(utf8rus("СИНУС"));
delay(400);
while(!(PIND & (1<<PIND2))){
PWM=sinM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
}
if(menuDDS==1){
DDS_Menu ();
tft.setCursor(35, 50);
tft.setTextColor(ST7735_RED);
tft.println(utf8rus("ТРЕУГОЛЬНИК"));
delay(400);
while(!(PIND & (1<<PIND2))){
PWM=trianglM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
}
if(menuDDS==2){
DDS_Menu ();
tft.setTextColor(ST7735_RED);
tft.setCursor(35, 70);
tft.println(utf8rus("ПИЛА"));
delay(400);
while(!(PIND & (1<<PIND2))){
PWM=pilaM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
}
if(menuDDS==3){
DDS_Menu ();
tft.setCursor(35, 90);
tft.setTextColor(ST7735_RED);
tft.println(utf8rus("ПИЛА ОБР"));
delay(400);
while(!(PIND & (1<<PIND2))){
PWM=RpilaM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
}
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}
Есть пару вопросов, подскажите пожалуйста.
1: В режиме ДДС генератора накрасивые сигналы, что не так? Делал по схеме вывод с 9 пина через переменник. На скринах синус и пила.
2: Собирал делитель 1:10 вот по этой схеме
Как подогнать значения показаний с делителей друг под друга, Только ли подбирая резисторы? Может возможно программно? Если да, то как?
3: Не понял как в этой прошивке выбирать опорное напряжение. В прошлой версии своего пультоскопа это делал через среднюю кнопку (ОК), в этой версии скетча чет не увидел этой возможности. Может кто пользуется прошивкой под такой же дисплей поделится ньюансами?
В Пультоскопе ДДС генератор вырабатывает псевдо сигнал. Импульсами переменной ширины. А искажения формы могут быть вызваны некорректной подборкой фильтра на выходе генератора.
у кого есть ползунковый переключатель на 10 позиций? куплю по разумной цене
Я бы рекомендовал поэкспериментировать с делителями перед тем, как собирать основательную конструкцию. Боюсь, что с ними все может оказаться не столь просто без ОУ на входе.
У меня с делителями прямо на АЦП МК не вышло нифига хорошего. Дело в том, что у АЦП хитрый вход. Он ведет себя совсем иначе.
разобрался, слишком большой переменник поставил на выходе, 10к (по схеме 2,2 к), он сглаживал сильно. И конденсатор у меня стоял до резистора 270 ом, а не после. Конденсатор 100n перепаял, переменник пока убрал, стало все впорядке.
Получается остался вопрос с подгонкой значений делителей 1:1 и 1:10 Подскажите, есть ли возможность их подогнать программно?
Получается остался вопрос с подгонкой значений делителей 1:1 и 1:10 Подскажите, есть ли возможность их подогнать программно?
Да можно, везде где используешь коэффециент 10 нужно при необходимости подправить. Например здесь
459
if(digitalRead(delit)==HIGH){//включен или отключен делитель
460
if(opornoe==0){ armcurrent = (Vmax*1.1/255)*10; }
461
if(opornoe==1){ armcurrent = (Vmax*VCC/255)*10; }
462
}
Для удобства этот параметр можно вынести в настройки, для этого сделать отдельное меню и вынести в энергонезависимую память, ну или на крайний случай определить define, потом подобрать и забыть.
Я подбирал этот коэффициент измеряя пультоскопом извесное точное напряжение (сверять с мультиметром)
Так они и так к земле подтянуты...
Еще у меня одного генератор не работает?
я собирал на 5110 экране, тоже не работал генератор, несколько страниц назад писал об этом и про то, что изменил в скетче
Ок. Посмотрю. Спасибо
они не подтянуты, а подключены к минусу через резистор, подтяжка бы выглядела если кнопки подключены допустим к +5 вольт напрямую, а резистор был подключен одним концом к контакту кнопки который идет к ардуино, а другим на массу
Походу лыжи у меня не правельные. Но я так и сделал...
Прошу прощения, что-то я зарисовался и мозг отключил... исправил, спасибо за внимательность. Хотя, если подтянуть к +5 програмно, то будет работать, только скетч нужно править))
Прошивку я свою выкладывал рабочую под ssd..
Давайте проголосуем может, кнопки как подключать лучше, как у автора - к питанию и резисторы на земельку или кнопки на землю,без резюков.
P.S. И что то я увлекся своим станком токарным, и ЧПУ охота достроить... Прошива моя будет, обязательно. Я пользусь - удобно.
Всем привет. Вышел на эту тему через youtube. Вопрос ко всем:
1) С чего вдруг такая зацикленность на мини-дисплеях? Разве вывод сигнала через USB не более практичен?
2) С чего вдруг такая зацикленность на Mega328, если платформа Arduino давно уже поддерживает такие же дешёвые STM32F103, который в стоке работает на 72 МГц?
user5, тут кружок любителей меги328 :) А вам можно сходить например сюда.
Почитайте страницу автора, он там популярно изложил поставленные перед собой задачи перед разработкой данного устройства, вопросы сразу отпадут. Насчет стм тоже уже не раз отвечали про их ацп...
Здравия вам умные люди. Прошу прощения за глупые вопросы... Быть может кто то вразумит или сможет помочь.....
Так случилось что пришло понимание что требуется осцил (точнее компактный вариант...) Облазив инет (опухши голова от не знакомых слов) понял что либо тратить много денег либо много нервов....ни то не другое не вариант...
В спомнив что завалялся камень от ардуино , наткнулся на ваше решение. думаю вариант в полне хорош. надеюсь его воплотить.
Вот такие вопросы появились:
1. камень 328 есть, плата стравится .... понравился вариант от karl2233 с русской прошивкой( быть может и найдётся кварц на 27+ )....надеюсь что 34063 найдется в нашей деревне....
оказалась проблема в экране.... ну нет в ближайшем откопать из хлама 5110... зато нашёлся LPH8731-3C от Siemes A62 , даже есть какая то инфа http://cxem.net/mc/mc218.php
Возможно ли мне как человеку не могучему в программировании прицепится к нему? или всё не так плохо?
2. и так. потолок измерений прибора 2МГц ... теоретически покрывает большинство шимок (или я не прав?) , тоесть как тест индикатор например работоспособности фазы питания видеокарты вполне.... не забывая о максимум 5В входа..... Кажется подобный вопрос возникал, но не могу вспомнить, пишу сообщение уже 3 раз перескакивая по ссылкам. Возможно ли улучшить ( обезопасить вход "простыми" методами) http://oldoctober.com/ru/oscilloscope/ для хотябы 12-15В...? Боюсь сним лазить в БП где бывает и 250 не выйдет.
или всё же требуется ОУ ....или с ним лучше....? Быть может уже путаюсь с соседней темой осцилографа VirtOS ... В архивах просто вроде нет схем с ОУ. (а то TL082 вроде заволялись).
2. и так. потолок измерений прибора 2МГц
Потолок прибора-звуковой диапазон частот. С некоторыми условностями килогерц до 50.
А VirtOS килогерц до 400. С условностями до 700-800.
Прибор до 2 Мгц таким уж простым не будет.
ага.... всё таки перепутал тему, опять заново перечитывать...
имел ввиду о VirtOS
https://www.youtube.com/watch?v=DLu7stRZ8K8
2000000Hz же 2Мгц?
так там и спрашивайте.
аттенюаторы (делители) еще никто не отменял. тем более что ипользоваться будет как индикатор наличия колебаний, после 20 кГц форма сигнала отображается весьма условно. частоту измеряет точно. может поможет ссылочка http://oldoctober.com/ru/oscilloscope/
...после 20 кГц форма сигнала отображается весьма условно. частоту измеряет точно.
Голословно малость... свой шим (понижайка) с отключением после 3.3В. ESP-12E. Отлаживаю схему на работе, ваяю код. В общем неделя любви - норм. Приношу домой - труп. Все. Есп падает в исключения и более не дает внятного на 9600, хотя espflasher прошивает ее успешно. Ок. Вторая... третья. Плюнул с четвертой поехал на осцил по боля. И на тебе всплеск (ни частоту ни вольтаж не измерял, плюнул, было очень обидно). Получислоь так что этот всплеск по питанию убивал какую-то часть есп, но при этом эта же схема под 5В (с 2-х последовательных литиев, т.е. там просттерл был куда больше чем 4.2 для 3.3есп, выходит в потолке 8.4 от 5В положеных, но опять же я предпологаю) не убивала mega328u... в общем шимки сразу сломал, остальное под деталье, к нг сделаю себе подарок на 200МГц нормальный осцил. А тут... вообще ровная прямая была... я так обрадовался
Добрый день.Кто может скинуть нормальный скетч на ST7735.а то ни один не могу скомпелировать,всё ошибку выкидывает.
Здравствуйте. Если вам не сложно, не могли бы вы в кратце обьяснить как это сие чудо устроено и работает. Просто я в области радиоэлектроники почти абсолюный ноль, а разобраться и научится хочется.
☺
Здравствуйте. Если вам не сложно, не могли бы вы в кратце обьяснить как это сие чудо устроено и работает. Просто я в области радиоэлектроники почти абсолюный ноль, а разобраться и научится НЕ хочется.
Аналого-цифровое преобразование для начинающих
Удивили вопросом.
Вкратце так. Микроконтроллер, установленый в Ардуино способен замерять наряжение на аналоговом входе. В определенных пределах, конечно.
И способен рисовать точку на дисплее, соответствующую этому уровню напряжения.
И эту процедуру он может повторять с определенной частотой, называемой частотой выборок.
В Авторском варианте до 600 000 раз в секунду.
А управляет этим процессом программа, залитая в микроконтроллер.
И эта программа заставляет контроллер нарисовать линию от каждой предыдущей точки до каждой последующей. В результате на дисплее видим некую линию. Прямую, кривую. Любую.
Серьезные цифровые осциллографы, ну кроме сложности схемы, отличаются от Пультоскопа сложностью програмного кода, его размером, а главное частотой выборок.
Чтобы построить более менее адекватно скажем один период синусоиды, нужно не менее 10 выборок (точек графика). А лучше 20.
Вот собственно этим цифровой осциллограф и занимается - строит графики по точкам.
Чем сложнее форма сигнала, тем больше точек нужно для ее адекватного построения.
Премного благодарен.
всех приветствую!!! все 3 тысячи постов не могу прочитать заново, извините!!! собрал все это в корпусе внешнего жесткого диска, и пришла необходимость использовать делитель, что бы мерить выше пяти вольт. в начале я встречал посты как делать делитель. но хотелось бы услышать как вы сделали его на практике. просто эти переключатели очень грамозкие
Найдите не громоздкий. В чем проблема?
в наличие есть неграмозкий, только на 4 положения. увлекся инверторами, а там примерное нарпяжение 600вольт
в наличие есть неграмозкий, только на 4 положения. увлекся инверторами, а там примерное нарпяжение 600вольт
у кого есть ползунковый переключатель на 10 позиций? куплю по разумной цене
Здравствуйте господа. Собрал версию пультоскопа на дисплее 7735 128/64. Загузил вот это скетч:
Есть пару вопросов, подскажите пожалуйста.
1: В режиме ДДС генератора накрасивые сигналы, что не так? Делал по схеме вывод с 9 пина через переменник. На скринах синус и пила.
2: Собирал делитель 1:10 вот по этой схеме
Как подогнать значения показаний с делителей друг под друга, Только ли подбирая резисторы? Может возможно программно? Если да, то как?
3: Не понял как в этой прошивке выбирать опорное напряжение. В прошлой версии своего пультоскопа это делал через среднюю кнопку (ОК), в этой версии скетча чет не увидел этой возможности. Может кто пользуется прошивкой под такой же дисплей поделится ньюансами?
Спасибо.
Sasha80 ,а каким id пользуетесь?
Arduino IDE 1.8.2 Через нее все вгружал.
А где вы такие картинки взяли?
Это не звуковой вход ПК?
Да, да, это вход З.К. на компьютере.
У меня выкидывает ошибку при компиляции,код ваш.
На7735 есть ,а что ещё надо?
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <FreqCount.h>
#include <PWM.h>
ну и U8glib для русификации
Скорее всего с генератором все впорядке. Пилу на входе ЗК сложно увидеть.
Пилу то может и сложно, но вот синусоида же, тоже корявая. Видно что нижнее плечо короче, да и горбатость странная.
PS: На картинке не пила, а треугольник, ошибся чудок.
В Пультоскопе ДДС генератор вырабатывает псевдо сигнал. Импульсами переменной ширины. А искажения формы могут быть вызваны некорректной подборкой фильтра на выходе генератора.
у кого есть ползунковый переключатель на 10 позиций? куплю по разумной цене
Я бы рекомендовал поэкспериментировать с делителями перед тем, как собирать основательную конструкцию. Боюсь, что с ними все может оказаться не столь просто без ОУ на входе.
У меня с делителями прямо на АЦП МК не вышло нифига хорошего. Дело в том, что у АЦП хитрый вход. Он ведет себя совсем иначе.
Фильтром, например, могут послужить паразитные емкости монтажа, щупов и т.д.
Я никогда не задавался вопросом, а могут ли програмные эквалазеры исказить сигнал виртуального осциллографа.
ДДС не главная функция Пультоскопа. Если все остальное работает, я бы не стал так уж за него биться. Он все-равно достаточно условный.
Для DDS фильтр - это резистор на 270 Ом и конденсатор на 0.1. При других значениях у меня тоже были похожие искажения
Delete дубль
С тем что устройство весьма условно согласен, но вместе с тем и полезно, хотел бы все таки чтоб все работало :)
Mitchel, подскажите конденсатор на минус, а резистор в проход сигнала?
Да. Схема на сайте автора http://srukami.inf.ua/pultoscop_v25110.html
Да. Да. Синус и автора горбат слегка. Я правил фигуры в своих версиях последних.
разобрался, слишком большой переменник поставил на выходе, 10к (по схеме 2,2 к), он сглаживал сильно. И конденсатор у меня стоял до резистора 270 ом, а не после. Конденсатор 100n перепаял, переменник пока убрал, стало все впорядке.
Получается остался вопрос с подгонкой значений делителей 1:1 и 1:10 Подскажите, есть ли возможность их подогнать программно?
Получается остался вопрос с подгонкой значений делителей 1:1 и 1:10 Подскажите, есть ли возможность их подогнать программно?
Да можно, везде где используешь коэффециент 10 нужно при необходимости подправить. Например здесь
459
if
(digitalRead(delit)==HIGH){
//включен или отключен делитель
460
if
(opornoe==0){ armcurrent = (Vmax*1.1/255)*10; }
461
if
(opornoe==1){ armcurrent = (Vmax*VCC/255)*10; }
462
}
Для удобства этот параметр можно вынести в настройки, для этого сделать отдельное меню и вынести в энергонезависимую память, ну или на крайний случай определить define, потом подобрать и забыть.
Я подбирал этот коэффициент измеряя пультоскопом извесное точное напряжение (сверять с мультиметром)