В этой статье мы рассмотрим создание самодельного (DIY) осциллографа на основе платы Arduino и ЖК графического дисплея 128×64, способного работать в диапазоне от 10 Гц до 50 кГц. Это достаточно широкий диапазон, причем наш осциллограф не будет использовать внешний АЦП (аналогово-цифровой преобразователь), только плату Arduino.
Результаты работы осциллографа будут отображаться на сравнительно большом ЖК дисплее (ST7920) с разрешением 128×64 пикселов. Область для вывода результатов измерений будет иметь размер 96×64, а размер информационной области будет составлять 32×64 пикселов.
Также на нашем сайте вы можете посмотреть проект осциллографа на основе платы Arduino с выводом изображения на экран компьютера.
Необходимые компоненты
- Плата Arduino Nano R3 (купить на AliExpress).
- Конденсатор 100 мкФ (купить на AliExpress).
- ST7920 LCD 128×64 (графический ЖК дисплей) (купить на AliExpress).
- Потенциометр (2 шт.) (купить на AliExpress).
- Кнопочный переключатель, мгновенный (Momentary) (3 шт.).
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Стоимость комплектующих для сборки данного осциллографа, как вы можете видеть, сравнительно небольшая. Если вы раньше не работали с графическим дисплеем, используемом в данном проекте, то на нашем сайте вы можете прочитать статью про подключение графического ЖК дисплея ST7920 к плате Arduino.
Работа схемы
Схема осциллографа 10 Гц – 50 кГц на основе платы Arduino Nano и ЖК дисплея ST7920 представлена на следующем рисунке.
- автоспуск (дисплей очень стабильный);
- скорость сканирования: 0.02ms/div~10ms/div, 9 уровней отображения;
- функция удержания (Hold function): «замораживает» изображение на экране дисплея.
Первоначально подобный осциллограф был описан в блоге Wu Hanqing, но автор этого проекта внес в него небольшие изменения. Как можно видеть из представленного в конце статьи видео, осциилограф обеспечивает достаточно четкую картинку на сравнительно большом экране, хорошо работает автопуск. Вертикальная позиция изображения регулируется с помощью потенциометра 50 кОм, для управления контрастностью дисплея используется потенциометр 10 кОм. Нами осциллограф протестирован с помощью генератора синусоидальных и прямоугольных импульсов.
Данный осциллограф не является профессиональным инструментом, однако он хорошо подойдет для образовательных целей, а также для тестирования несложных устройств.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
#include <U8glib.h> U8GLIB_ST7920_128X64_4X u8g(6, 5, 4); int Input = A0; int Key_add = 8; int Key_sub = 9; int Key_hold = 10; int x,y; int i,i1,i2,V_min,V_max,V_mid,t,t0,t1,sta,Key=1,hold=0; long Freq; float Vpp; int Y[96]; int Buffer[192]; const uint8_t L[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0xC0, 0x01, 0x80, 0x60, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x01, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x01, 0xE3, 0xDF, 0xB6, 0x6F, 0x8F, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0x8F, 0xFF, 0x00, 0x01, 0xE3, 0x1B, 0xB6, 0x6D, 0x9B, 0x80, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x03, 0x33, 0x31, 0xB6, 0x6C, 0xB1, 0x80, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x03, 0xF3, 0x31, 0xB6, 0x6C, 0xB1, 0x80, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x06, 0x33, 0x1B, 0xB6, 0x6C, 0x9B, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x06, 0x1B, 0x1F, 0xBE, 0x6C, 0x8F, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x0C, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x0C, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x0E, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0x1E, 0x3C, 0xF8, 0xF0, 0x00, 0x00, 0x08, 0x10, 0x0E, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x0D, 0x93, 0x6E, 0xCD, 0x90, 0x00, 0x00, 0x08, 0x10, 0x0F, 0x87, 0xFF, 0xF9, 0x80, 0x00, 0x00, 0x0F, 0x30, 0xC6, 0xCF, 0xF8, 0x00, 0x00, 0x08, 0x10, 0x0F, 0x87, 0xFF, 0xF9, 0x80, 0x00, 0x00, 0x03, 0xB0, 0xC6, 0xCF, 0x00, 0x00, 0x00, 0x08, 0x10, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x6C, 0xCD, 0xB0, 0x00, 0x00, 0x08, 0x10, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x9E, 0x3C, 0xF9, 0xE0, 0x00, 0x00, 0x08, 0x10, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x08, 0x10, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x08, 0x10, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0x83, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void setup( ) { pinMode(Key_add,INPUT); digitalWrite(Key_add,HIGH); pinMode(Key_sub,INPUT); digitalWrite(Key_sub,HIGH); pinMode(Key_hold,INPUT); digitalWrite(Key_hold,HIGH); ADMUX=0x60; ADCSRA=0xe2; u8g.setFont(u8g_font_5x7); u8g.firstPage(); do { u8g.drawBitmapP( 0, 0, 16, 64, L); } while( u8g.nextPage() ); delay(2000); } void loop( ) { sample( ); Measure( ); Transform( ); Key_scan( ); if(hold==0) { u8g.firstPage( ); do { draw( ); } while( u8g.nextPage( )); } } void sample( ) { for(i = 0;i < 192;i++) { Buffer[i] = ADCH; switch(Key) { case 1: break; case 2: delayMicroseconds(4); break; case 3: delayMicroseconds(10); break; case 4: delayMicroseconds(23); break; case 5: delayMicroseconds(60); break; case 6: delayMicroseconds(123); break; case 7: delayMicroseconds(248); break; case 8: delayMicroseconds(623); break; case 9: delayMicroseconds(1247); break; default:break; } } } void Measure() { V_max=Buffer[0]; V_min=Buffer[0]; for(i=0;i<192;i++) { if(Buffer[i]>V_max) V_max=Buffer[i]; if(Buffer[i]<V_min) V_min=Buffer[i]; } V_mid=(V_max+V_min)/2; Vpp=(V_max-V_min)*5/255; for(i=0;i<97;i++) { if(Buffer[i]<V_mid&&Buffer[i+1]>=V_mid) { i1=i; break; } } for(i=i1+1;i<98+i1;i++) { if(Buffer[i]<V_mid&&Buffer[i+1]>=V_mid) { i2=i; break; } } t=i2-i1; if(t>0) Freq=8000/t; else Freq=0; } void Transform( ) { for(sta=0;sta<96;sta++) { if(Buffer[sta]<128&&Buffer[sta+2]>128) break; } for(i = 0;i < 96;i++) Y[i] = 63-(Buffer[i+sta]>>2); } void draw( ) { for(x = 0;x < 95;x++) u8g.drawLine(x,Y[x],x,Y[x+1]); u8g.drawFrame(0,0,97,64); u8g.drawLine(48,0,48,63); u8g.drawLine(0,32,96,32); for(x=0;x<96;x+=8) u8g.drawLine(x,31,x,33); for(y=0;y<64;y+=8) u8g.drawLine(47,y,49,y); for(x=8;x<96;x+=8) { for(y=8;y<64;y+=8) u8g.drawPixel(x,y); } u8g.drawStr(98,7,"MS/div"); u8g.drawStr(98,23,"V/div"); u8g.drawStr(98,30,"0.324"); u8g.drawStr(98,40,"Vpp"); u8g.setPrintPos( 98, 47); u8g.print(Vpp); u8g.drawStr(118,47,"V"); u8g.drawStr(98,55,"F(HZ)"); switch(Key) { case 1: u8g.drawStr(98,14,"0.02"); u8g.setPrintPos( 98, 62); u8g.print(Freq*50); break; case 2: u8g.drawStr(98,14,"0.05"); u8g.setPrintPos( 98, 62); u8g.print(Freq*20); break; case 3: u8g.drawStr(98,14," 0.1"); u8g.setPrintPos( 98, 62); u8g.print(Freq*10); break; case 4: u8g.drawStr(98,14," 0.2"); u8g.setPrintPos( 98, 62); u8g.print(Freq*5); break; case 5: u8g.drawStr(98,14," 0.5"); u8g.setPrintPos( 98, 62); u8g.print(Freq*2); break; case 6: u8g.drawStr(98,14," 1"); u8g.setPrintPos( 98, 62); u8g.print(Freq); break; case 7: u8g.drawStr(98,14," 2"); u8g.setPrintPos( 98, 62); u8g.print(Freq/2); break; case 8: u8g.drawStr(98,14," 5"); u8g.setPrintPos( 98, 62); u8g.print(Freq/5); break; case 9: u8g.drawStr(98,14," 10"); u8g.setPrintPos( 98, 62); u8g.print(Freq/10); break; default:break; } } void Key_scan() { if(digitalRead(Key_add)==LOW) { while(digitalRead(Key_add)==LOW); Key++; if(Key==10) Key=9; delay(10); } if(digitalRead(Key_sub)==LOW) { while(digitalRead(Key_sub)==LOW); Key--; if(Key==0) Key=1; delay(10); } if(digitalRead(Key_hold)==LOW) { while(digitalRead(Key_hold)==LOW); hold=~hold; delay(10); } } |
37 ответов к “Осциллограф 10 Гц – 50 кГц на Arduino Nano”
здравствуйте.нашел схему с применением oled 0.96 . можно ли подключить дисплей на st7920 ? и будет ли работать без изменения скетча
Добрый день. Нет, без изменения скетча работать не будет поскольку это совершенно разные дисплеи и для работы с ними используются различные библиотеки. Но со многими oled дисплеями работать на самом деле проще чем с st7920, поэтому и скетч будет попроще.
Собрал как есть, без малейших изменений — работает, ничего не зависает. Проверял сигнал в розетке через делитель 1/100 (1мОм+100кОм) — очень симпатичная синусоида выходит, жаль нельзя картинку приложить. Дисплей у меня с подстроечником контраста на плате, поэтому его не ставил. В остальном схема полностью работает как есть
Если кто будет делать такой делитель — берите резисторы мощностью от 2 ватт, не потому что ток большой — ток там меньше 1 мА, а потому что конструктивно более слабые резисторы меньше размером и их будет пробивать напряжением, подключается ноль со стороны 100кОм и далее на gnd, фаза со стороны 1мОм, вход сигнала брать между резисторами, напряжение там соответственно 2.1-2.2 вольт AC. Удобно собрать это сразу в штепсельной вилке, чтоб не получить удар током. Ну и подключать сперва в розетку а уж затем ко входу.
Спасибо вам за конструктивный комментарий к данному проекту
Можете на любом ресурсе в сети выложить, а здесь ссылку на нее написать, а я ее тогда в статью вставлю.
Изначально устройство зависало на первичном изображении, но после полной сборки устройства и подключения 15 вывода жк дисплея к GND, устройство заработало исправно. Также убрал из скетча изображение(динозаврика) за ненадобностью, для этого удалил строки с 13 по 85, 99 и 100.
Да, хорошо, спасибо вам за конструктивный комментарий по существу статьи
Добрый день
подскажите почему может все зависать на заставке?
то есть просто загорается экран с динозавром и надписью arduino scope и больше ничего не происходит?
Добрый вечер. Сложно однозначно сказать, причин может быть много. Попробуйте убрать из функции void loop( ) весь код и вставить туда какой нибудь очень простой код, например, код мигания встроенным светодиодом. Если этот код заработает вы хотя бы будете знать что у вас программа до void loop( ) доходит. После этого можете добавлять в функцию void loop( ) понемногу код из приведенной статьи и, таким образом, сможете выявить на каком фрагменте кода происходит зависание программы
Добрый день. Подскажите пожалуйста, до скольки вольт принимает данный осциллограф? Судя по видео установлен предел в 3В, если так то можно ли как то увеличить данный параметр? (может возможно добавить в эту схему делитель?)
Здравствуйте, я не знаю почему автор этого проекта на видео показывает только диапазон до 3В, ведь аналоговые контакты платы Ардуино могут считывать уровень до 5В. С помощью делителя напряжения, конечно же, можно увеличить этот предел
95 и 96 строку убрать а на их место вставить новый код
Хорошо, спасибо вам за ценный совет
картинка общая высвечивается а синусоиду не могу вывести, переделал на тот же дисплей но с кристалом ks0108
А кроме синусоиды все остальное выводится?
все выводится, пришлось допиливать код что бы синусоиду вывести, нехватает пару строчек
А не могли бы вы здесь, в комментарии, написать эту пару строчек, которые вам помогли, чтобы облегчить задачу другим людям, которую будут читать эту статью. Был бы признателен
в коде
PORTA = 0b00000000;
DDRA = 0b00000000;
ADMUX=0x60;
ADCSRA= 0xE2;
{
ADCSRA |= 0x40; //Включаем АЦП
while((ADCSRA & 0x10)==0); //ждем завершения
PORTA=ADCH; //выводим результат
только после передачи сигнала из порта в регистр все запустилось, поэкспереминтируйте убрав эти строчки, сразу говорю в протеусе не работает, только в реале, может у меня в протеусе дисплей такой но не помогло
Да, хорошо, спасибо. Надеюсь ваш совет поможет другим пользователям, у которых будет возникать такая же проблема
А подскажи пожалуйста, куда в скетче этот код нужно поместить?
Попробовал собрать на Arduino Uno и ips дисплее 0.96 st7735. С небольшой переделкой кода всё работает, но пока отвалилась функция Hold. На вход неплохо было бы поставить операционный усилитель. Тогда будет возможность регулировать чувствительность по напряжению и существенно повысится входное сопротивление.
Дополняю комментарий.
В функции measure содержится ошибка.
При вычислении Vpp мы делим и умножаем на целые числа, от этого на экране Vpp отображается только в целых. Для исправления просто заменяем *5/255 на *0.019607. И кажется, значение в графе V/div надо заменить на ~0.625. (тут я ппока не считал, поэтому примерно)
Хорошо, спасибо за конструктивный комментарий, надеюсь он поможет другим энтузиастам, которые будут собирать данный проект
По поводу операционного усилителя поддерживаю, был бы полезен, но это немного усложнит проект
Все нормально работает. Вариации с подключением дисплея зависят от типа самого дисплея, отсюда и задействование ножки RST. У меня и так заработало. Плохо, что чувствительность по входному напряжению не регулируется. Думаю, добавление входного аттенюатора/делителя как раз поможет.
Спасибо за дельный отзыв. Рад что у вас заработало. Я думаю, аттенюатор добавить несложно в схему
Здравствуйте,а как данные с микроконтроллера будут передаваться на жк дисплей 128х64, если шины данных не задействованы у жк дисплея, и для чего сам конденсатор в схеме?
Добрый вечер. Шины данных не задействованы потому что используется последовательный режим работы, посмотрите статью про подключение графического ЖК дисплея ST7920 к плате Arduino. Конденсатор нужен для устранения постоянной составляющей во входном сигнале и фильтрации нежелательных колебаний.
админ сам то пробовал код?
Нет, не пробовал. Просто в последнее время я так много перевожу проектов с англоязычных источников что мы просто не успеваем их все попробовать
Не думаю что без внешнего АЦП до 50кгц будет работать.
И почему вы так думаете? 50кгц — не такая уж большая частота, на мой взгляд
Собрал я схему. В ней есть ошибки.
Нужно переставить ножки с D9, D8, D7 на D10, D9, D8.
На экране пин CS1 подключить на корпус.
RST подключить на D3 и в коде изменить U8GLIB_ST7920_128X64_4X u8g (6, 5, 4);
на U8GLIB_ST7920_128X64_4X u8g (6, 5, 4, 3);
Спасибо за полезный комментарий к статье. А с вашими доработками проекта у вас все нормально заработало? У данного проекта большое число просмотров и хороший рейтинг на англоязычном источнике, странно, что в нем могли быть такие ошибки. Хотя, может быть, вам попалась плата Arduino с дефектной ножкой D7
Да, но к сожалению мой источник сигналов уехал на некоторое время — потому проверить работу полностью не смог. Как проверю — отпишусь. А ошибки как раз были на англоязычном сайте. Вот оригинал комментария:
Hello Mirko. Your design is very interesting and I made it and when put together, it didn’t work.
I had to add a connection to the LCD. RST (reset on LCD) and D3 (on NANO), in the code I added U8GLIB_ST7920_128X64_4X u8g (6, 5, 4);
on U8GLIB_ST7920_128X64_4X u8g (6, 5, 4, 3);
and key are wrongly assigned, in the diagram: D9, D8, D7 in code 10,9,8.
After these changes, the oscilloscope works. Great project and I’m getting on with the next one. Thanks.
И там еще другой про корпус на ЖКИ — но я его не сохранил.
Хорошо, спасибо вам еще раз. Такие комментарии, как ваши, помогают лучше разобраться в нюансах того или иного проекта. К сожалению, я со студентами не успеваю пробовать все проекты, которые я перевожу. Поэтому помощь таких людей как вы, очень ценна для нашего сайта