Новости:

Форум Infotex WeaponMod

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Николай З

Страницы: [1] 2 3
1
Arduino UNO / Re: Генератор на AD9850
« : 16 Ноября 2017, 19:55:31 »
Не , пока задвинул до лучших времен :) , я на самом деле не слишком понимаю в этом , могу только рабочую конструкцию воспроизвести , да и то , с вопросами надоедаю :)
А что это за библиотека Ucglib?

2
Arduino UNO / Re: Генератор на AD9850
« : 31 Октября 2017, 20:19:42 »
Алексей , здравствуйте ! В общем сделал вот так , но не помогло
Склоняюсь к тому , чтобы купить другой дисплей . Но такой вот точно модели как у автора я на али не встретил .
/*
AD9833 Waveform Module vwlowen.co.uk
*/

#include <SPI.h>
#include <rotary.h>            // Rotary encoder: https://github.com/brianlow/Rotary


#define dc   A0                // Define pins for TFT display.           
#define cs   A1                //
#define rst  A2 

#include <Adafruit_GFX.h>      // Core graphics library

// include Adafruit library OR QDTech library depending on the display's controller chip.

 #include <Adafruit_ST7735.h>            // Hardware-specific library
 Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

 


// https://github.com/zigwart/Adafruit_QDTech


#define BLACK 0x000                         // Define the display colours we'll be using
#define BLUE 0x001F                         // so they're constants regardless of which
#define GREEN 0x07E0                        // display library we use.
#define YELLOW 0xFFE0
#define GREY 0x632C

const int SINE = 0x2000;                    // Define AD9833's waveform register value.
const int SQUARE = 0x2028;                  // When we update the frequency, we need to
const int TRIANGLE = 0x2002;                // define the waveform when we end writing.   

int wave = 0;
int waveType = SINE;
int wavePin = 7;

int freqUpPin = 2;                          // Define rotary encoder pins.
int freqDownPin = 3;
int stepUpPin = 5;
int stepDownPin = 6;

const float refFreq = 25000000.0;           // On-board crystal reference frequency

const int FSYNC = 10;                       // Standard SPI pins for the AD9833 waveform generator.
const int CLK = 13;                         // CLK and DATA pins are shared with the TFT display.
const int DATA = 11;

Rotary r = Rotary(freqUpPin, freqDownPin);    // Rotary encoder for frequency connects to interrupt pins
Rotary i = Rotary(stepUpPin, stepDownPin);    // Rotart encoder for setting increment.

unsigned long freq = 1000;               // Set initial frequency.
unsigned long freqOld = freq;

unsigned long incr = 1;
unsigned long oldIncr = 1;

void setup() {

  pinMode(freqUpPin, INPUT_PULLUP);      // Set pins for rotary encoders as INPUTS and enable
  pinMode(freqDownPin, INPUT_PULLUP);    // internal pullup resistors.
  pinMode(stepUpPin, INPUT_PULLUP);
  pinMode(stepDownPin, INPUT_PULLUP);
  pinMode(wavePin, INPUT_PULLUP); 
 
   // Can't set SPI MODE here because the display and the AD9833 use different MODES.
  SPI.begin();
  delay(50);
 
  // Initialize either Adafruit OR QDTech display
  //QDTech display
//     tft.init();
 
//  Adafruit  ;display     
  ;tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 
  tft.setRotation(3);
  tft.setTextWrap(false);                                  // Allow text to run off right edge

  tft.fillScreen(BLACK);
  tft.drawFastVLine(20, tft.height()-55, 4, GREY);         // Display 'static' cosmetic text.
  tft.drawFastVLine(40, tft.height()-55, 4, GREY);
  tft.drawFastVLine(47, tft.height()-55, 4, GREY);
  tft.drawFastVLine(88, tft.height()-55, 4, GREY);
  tft.drawFastVLine(95, tft.height()-55, 4, GREY);
  tft.drawFastVLine(134, tft.height()-55, 4, GREY);
 
  tft.drawFastHLine(20, tft.height()-52, 20, GREY);
  tft.drawFastHLine(47, tft.height()-52, 42, GREY);
  tft.drawFastHLine(95, tft.height()-52, 40, GREY);
 
  tft.setTextColor(GREY);
  tft.setCursor(23, tft.height()-48);
  tft.print("MHz   kHz     Hz");
 
  tft.setCursor(15, tft.height() -20);
  tft.setTextSize(1);
  tft.drawFastHLine(0, tft.height() - 23, tft.width()-10, BLUE);
  tft.setTextColor(BLUE);
  tft.println("AD9850 10 Hz to 5 MHz ");
  tft.print("   waveform generator");
 
 
// Configure interrupt for rotary encoder and enable.
  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
 
  AD9833reset();                                   // Reset AD9833 module after power-up.
  delay(50);
  AD9833setFrequency(freq, SINE);                  // Set the frequency and Sine Wave output
  updateDisplay();
}

void updateDisplay() {
 
  // To complicate things, the display uses SPI MODE0 but the AD9833 uses SPI MODE3 so it's
  // necessary to switch modes before each SPI transfer.
  SPI.setDataMode(SPI_MODE0);   
 
  tft.fillRect(50, 10, 100, 12, BLACK);            // Clear text.
 
  tft.setTextColor(YELLOW);
  tft.setCursor(55, 10);
  tft.setTextSize(1);
  switch (waveType) {
    case SINE: tft.print("  sine"); break;
    case SQUARE: tft.print(" square"); break;
    case TRIANGLE: tft.print("triangle"); break;
  }
 
  tft.fillRect(25, 50, 140, 14, BLACK);           // Clear frequency numerals.
  tft.setTextColor(GREEN);
  tft.setTextSize(2);
  tft.setCursor(25, 50);
  format(freq);                                   // Show frequency in formatted form. 

}

void format(unsigned long value) {
   
   // Break the frequency value down into individual digits & into variable 'digit'.
   // If a digit corresponds with the currently-selected x10 increment, change the
   // text colour to YELLOW. All other digits and commas are GREEN.
   
  unsigned long j = 1000000;
 
  for (int i=6; i>=0; i--) {
    int digit = (value / j) % 10;
    incr == j ? tft.setTextColor(YELLOW): tft.setTextColor(GREEN);
    tft.print(digit);
    if ((i == 6) || (i == 3)) {                  // Add commas at millions and thousands
      tft.setTextColor(GREEN);
      tft.print(",");
    }   
    j /= 10;
  }
}


void loop() {
 
  if (oldIncr != incr) {
    updateDisplay();
    oldIncr= incr;
  }
 
  // Check 'increment' rotary encoder. Increase or decrease 'increment' by a factor of x10
  // if encoder has been turned.
  unsigned char result = i.process();
  if (result) {
    if (result == DIR_CW)  {if (incr < 1000000) incr *= 10;}
    if (result == DIR_CCW) {if (incr >= 10) incr /= 10;}
    updateDisplay();
  }
 
  // Check if push button on 'increment' rotary encoder is pushed and set Wave Type accordingly.
  if (digitalRead(wavePin) == LOW) {
    wave += 1;
    if (wave > 2) wave = 0;
    switch (wave) {
      case 0: waveType = SINE; break;
      case 1: waveType = SQUARE; break;
      case 2: waveType= TRIANGLE; break;
    }   
    AD9833setFrequency(freq, waveType);     // Set AD9833 to frequency and selected wave type.
    updateDisplay();
    delay(200);
  }
 
  if (freq != freqOld) {                    // If frequency has changed, interrupt rotary encoder
    AD9833setFrequency(freq, waveType);     // must have been turned so update AD9833 and display.
    updateDisplay();
    freqOld = freq;                         // Remember new frequency to avoid unwanted display
  }                                         // and AD9833 updates.
}

// AD9833 documentation advises a 'Reset' on first applying power.
void AD9833reset() {
  WriteRegister(0x100);   // Write '1' to AD9833 Control register bit D8.
  delay(10);
}

// Set the frequency and waveform registers in the AD9833.
void AD9833setFrequency(long frequency, int Waveform) {

  long FreqWord = (frequency * pow(2, 28)) / refFreq;

  int MSB = (int)((FreqWord & 0xFFFC000) >> 14);    //Only lower 14 bits are used for data
  int LSB = (int)(FreqWord & 0x3FFF);
 
  //Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
  LSB |= 0x4000;
  MSB |= 0x4000;
 
  WriteRegister(0x2100);   
  WriteRegister(LSB);                  // Write lower 16 bits to AD9833 registers
  WriteRegister(MSB);                  // Write upper 16 bits to AD9833 registers.
  WriteRegister(0xC000);               // Phase register
  WriteRegister(Waveform);             // Exit & Reset to SINE, SQUARE or TRIANGLE

}

void WriteRegister(int dat) {
 
  // Display and AD9833 use different SPI MODES so it has to be set for the AD9833 here.
  SPI.setDataMode(SPI_MODE2);       
 
  digitalWrite(FSYNC, LOW);           // Set FSYNC low before writing to AD9833 registers
  delayMicroseconds(10);              // Give AD9833 time to get ready to receive data.
 
  SPI.transfer(highByte(dat));        // Each AD9833 register is 32 bits wide and each 16
  SPI.transfer(lowByte(dat));         // bits has to be transferred as 2 x 8-bit bytes.

  digitalWrite(FSYNC, HIGH);          //Write done. Set FSYNC high
}


// Interrupt service routine for the 'frequency' rotary encoder.

ISR(PCINT2_vect) {

  unsigned char result = r.process();
  if (result) {
    if (result == DIR_CW) {                   // Clockwise rotation so add increment to frequency
       if ((freq + incr) < 6000000) freq+=incr;
       
    } else {
        if (freq > incr) {                    // Counter-clockwise rotation so subtract increment
          freq -= incr;                       // from frequency unless it would result in a negative
        } else {                              // number.
          if (freq >= 1) incr /= 10;
          if (incr < 1) incr = 1;             // Compensate for math rounding error.
        } 
    }
  }
}


3
Arduino UNO / Re: Генератор на AD9850
« : 28 Октября 2017, 23:30:16 »
Синтез на АД9833 , детали приехали
Собрал  схему для АД9833 , сигнал на выходе есть , частота регулируется , треугольник , меандр и синус переключаются , но дисплей признаков жизни не подает .
Я купил не совсем ту модель , которая  в схеме по ссылке .Я купил вот такую
https://ru.aliexpress.com/item/1-8-SPI-TFT-128-x-160-Pixels-Display-LCD-Module-Breakout-ST7735R-R179T-Drop-Shipping/32810524510.html?spm=a2g0s.9042311.0.0.yQLX7g
У нее 16 контактов, соединил
дисплей     Атмега
mosi           17
sck              19
cs                 24
a0                 23
reset              25

Может , дело в библиотеках ?
Надо наверное мне отдельно с дисплеем поиграться , чтобы оживить .
Алексей , посоветуйте что нибудь :)

5
Arduino UNO / Re: Генератор на AD9850
« : 08 Сентября 2017, 19:49:02 »
Поменял ардуино нано на мк Atmega328p  , прошивал в ардуино уно с пом программатора , залил загрузчик , следом скетч .

6
Arduino UNO / Re: Генератор на AD9850
« : 03 Июля 2017, 21:52:59 »
Здравствуйте ! Подскажите пожалуйста  , хочу вместо  энкодера KY-040  купить что то вроде
https://ru.aliexpress.com/item/2-EC11/32673684898.html?spm=2114.14010208.99999999.262.zkSFpX

или
https://ru.aliexpress.com/item/Original-Rotary-encoder-code-switch-EC11-audio-digital-potentiometer-with-switch-5Pin-handle-length-20mm-free/1669858125.html?spm=2114.14010208.99999999.270.zkSFpX
и впаять сразу на плату , мне кажется , так надежнее будет , чем шлейфом соединять , да и хлипкая какая то у KY-040 плата .
Какой лучше выбрать ? Или может , есть получше вариант ?

7
Здравствуйте ! Собираю сейчас  транзисторный усилитель  "Джин" по схеме
http://www.ut5ulh.kiev.ua/usilitel-kv-dzhin.html
Вернее собрал уже и пробую запускать через ЛАТР .
Хочется подстраховаться , и поставить защиту по току потребления , чтобы скажем при токе  более 1 а срабатывала бы защита и для повторного включения надо было бы нажать кнопку . Тепловая защита по моему плохой вариант , а схему  быстродействующей защиты пока найти не могу , посоветуйте пожалуйста , если есть какие то  идеи .

8
Arduino UNO / Re: Генератор на AD9850
« : 02 Августа 2016, 22:18:42 »
Лучше не связываться и купить 328 ?

9
Arduino UNO / Re: Генератор на AD9850
« : 02 Августа 2016, 22:15:18 »
Алексей, здравствуйте ! Подскажите пожалуйста , я вот сегодня посмотрел , что Atmega168 может быть дешевле , чем Atmega328  вот например
http://ru.aliexpress.com/item/ATMEGA8A-PU-ATMEGA8A-DIP-28-8-bit-with-8K-Bytes-In-System-Programmable-Flash/32571726133.html?spm=2114.30010708.3.2.NOiick&ws_ab_test=searchweb201556_10,searchweb201602_1_10048_10047_10049_10046_10045_10017_106_105_104_10060_103_10061_102_10062_412_10039_10057_10056_10037_10055_10059_10033_10058_10032_405_404,searchweb201603_6&btsid=3141e1dc-8f0b-4bca-8d8b-3a9a706b9052

Можно брать для этой схемы ?
Не посмотрел :) Вы же про них и писали в предыдущем сообщении .

10
Arduino UNO / Re: Генератор на AD9850
« : 01 Августа 2016, 19:32:37 »
Ответил в личку . Алексей , а вот такие ардуины в этой схеме можно использовать ?
http://samopal.pro/atmega328-arduino/

11
Arduino UNO / Re: Генератор на AD9850
« : 31 Июля 2016, 19:08:46 »
Спасибо , попробую на днях . Да , с платой не  впорядке , похоже  микросхема , которая связывает атмегу  с usb  портом  накрылась , тем не менее , сама  ардуина  работает , вот фотки  почти готового блока , как оказалось , из оцинковки довольно легко  можно сделать корпуса , если  на предполагаемой линии сгиба просверлить отверстия каждые несколько сантиметров.

12
Arduino UNO / Re: Генератор на AD9850
« : 31 Июля 2016, 15:41:34 »
 Привет ! Похоже , у меня с ардуиной проблемы - видимо даром не прошло , что по ошибке я ее  не так в разъем вчера вставил . Скетчи теперь не записываются , выдает
Arduino: 1.6.8 (Windows 7), Плата:"Arduino Nano, ATmega328"

Скетч использует 5 652 байт (18%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 282 байт (13%) динамической памяти, оставляя 1 766 байт для локальных переменных. Максимум: 2 048 байт.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xc5
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xc5
Проблема загрузки в плату. Помощь по загрузке: http://www.arduino.cc/en/Guide/Troubleshooting#upload .

Старый скетч   однако остался и работает :)
 Это я уже второй генератор собираю , придется ардуин еще заказать .
Алексей , я использую самую первую версию , подскажите ,  где в ней этот шаг , который надо убрать ? Я сам попробую . Просто незнаю , как начать . Я попробовал  позавчера , но смысла этого не очень  понимаю , и у меня на индикаторе просто  один разряд перестал светиться , пришлось вернуть как было .


13
Arduino UNO / Re: Генератор на AD9850
« : 30 Июля 2016, 21:28:57 »
Алексей , здравствуйте ! Подскажите пожалуйста , как исключить  из скетча  шаг при нажатии на энкодер 1 мгц ? Он мне как бы не нужен вообще , а частоту постоянно  переключаю в пределах сотен кгц , чтобы нажатий меньше было ?

14
Arduino UNO / Re: TV Tuner FM1216ME
« : 24 Июля 2016, 22:21:10 »
Да , прикольно :) В ближайшее будущее , правда , на это времени нет , но интересно :)

15
Приборы / Re: Частотомер ?
« : 07 Июля 2016, 22:42:54 »
И вот еще , программу скачал вот здесь
http://picpgm.picprojects.net/download.html


Прикреплю фото моего треш - программатора :)
И , Алексей , проконсультируйте пожалуйста , этот частотомер , предполагается , что он будет работать в составе довольно мощного лампового генератора от 100 кГц до нескольких МГц , как посоветуете сделать зашиту входной цепи ?
Показания не врут или не сильно - они или есть , или их нет

Страницы: [1] 2 3