Например TDA7294

Форум РадиоКот • Просмотр темы - Простейший ГКЧ на AD9850 и Arduino Nano 328
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 14:31:19

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 405 ]     ... , , , 18, , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Вс апр 19, 2020 06:29:53 
Нашел транзистор. Понюхал.

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Вс апр 17, 2011 09:51:26
Сообщений: 192
Откуда: Тула
Рейтинг сообщения: 0
С двух входов однозначно удобнее. Даже без компа можно АЧХ нарисовать на миллиметровке, как в школе учили. Только энкодер накручивай в нужной полосе частот


Я понимаю Ваше желание разработать что то оригинальное, но еще раз повторяю. Основная концепция данного проекта, минимум нагрузки на МК и максимум нагрузка на ПК.

Перечитайте мое сообщение от Сб апр 18, 2020 07:36:02

Добавлено after 51 minute 50 seconds:
Лучше Кп считать на МК и передавать на комп, а там к децибеллам приводить.


А чем вы будете детектировать сигнал -80дб чтобы затем завести на АЦП?

Я уже писал, что в данной теме обсуждался вариант с логарифмическим усилителем. Характеристику привел в предыдущих сообщениях. Обсуждался вопрос с подключением и шкалой. В программе для ПК (в разделе калибровка) предусмотрена возможность установки различных шкал.

Вы же упорно пытаетесь засунуть в МК с небольшой памятью и слабыми вычислительными возможностями задачи которые значительно проще решить на ПК.

Повторяю вопрос, сколько стоит дисплей 2.4" ? Не дождался ответа, зашел на Ali 423,62 руб. Неплохая добавка чтобы поставить "пятое колесо".

Тема называется "Простейший ГКЧ на AD9850 и Arduino Nano 328", а не кто больше усложнит схему и программу МК.

Зачем усложнять схему, повышать стоимость оборудования если необходимые задачи можно решить на ПК.

Передавай частоту и значение АЦП на ПК и делай с ними что хочешь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Пн апр 20, 2020 04:58:35 
Нашел транзистор. Понюхал.

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Вс апр 17, 2011 09:51:26
Сообщений: 192
Откуда: Тула
Рейтинг сообщения: 0
Появилось немного времени, повнимательней перечитал Ваши сообщения.
Немного причесал скетч

Код:
//для проекта UA3REO-Sweep-Analyzer ссылки на оригинальный проект https://ua3reo.ru/izmerenie-parametrov-filtrov-i-konturov-na-arduino/
//GitHub https://github.com/XGudron/UA3REO-Sweep-Analyzer

Я не собираюсь обсуждать проект UA3REO-Sweep-Analyzer, здесь обсуждается "Простейший ГКЧ на AD9850 и Arduino Nano 328".

Если есть желания в рамках данной темы выполнить адаптацию lgt8f328p можем продолжить. Если Вы собрались дорабатывать проект UA3REO-Sweep-Analyzer то переходите на его сайт или создавайте отдельную тему.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Пт апр 24, 2020 08:52:18 
Потрогал лапой паяльник
Аватар пользователя

Карма: 7
Рейтинг сообщений: 30
Зарегистрирован: Вт апр 23, 2013 22:21:18
Сообщений: 373
Откуда: KUBAN, Krasnodar
Рейтинг сообщения: 0
Цитата:
Если есть желания в рамках данной темы выполнить адаптацию lgt8f328p можем продолжить.

Желание есть. Больше десктопов хороших и разных... На борту еще 17кб памяти чтобы реализовать ваш протокол взаимодействия.
Но у меня еще есть идея улучшить характеристики "Простейшего ГКЧ ... ". Я упоминал что на борту lgt8f328p есть прецизионный DAC. Думаю как его приспособить для управления AD9850-51 по ноге RSET чтобы получить 0.5v на выходе во всей полосе от 0 до 40 мгц без лишней обвески. Для атмеги328 наверно можно ШИМ заюзать с любой свободной ноги PWM
Изображение

_________________
Девице - Device


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Вт апр 28, 2020 01:38:47 
Потрогал лапой паяльник
Аватар пользователя

Карма: 7
Рейтинг сообщений: 30
Зарегистрирован: Вт апр 23, 2013 22:21:18
Сообщений: 373
Откуда: KUBAN, Krasnodar
Рейтинг сообщения: 0
Адаптировал скетч под программу Автора ... с изъятиями и сокращениями. Только режим ГКЧ. Картинку показывает, но чтобы совсем правильно, нужны референсы на 1.024/2.048/4.096 и 2.56 для меги 2560. Заодно и переключатель разрядности АЦП 8/10/12 не мешало бы.
Спойлер
Код:
#include <SPI.h>
#include "OneButton.h"
#include <avr/pgmspace.h>

#define ST7735_CS  A3
#define ST7735_RST A4
#define ST7735_A0  6

#define ENC_CLK    2
#define ENC_DT     A5
#define ENC_SW     3

#define W_CLK 7
#define FQ_UD 8
#define DATA 9
#define RESET A2

#define DAC 4


#define INP_VAL A0
#define INP_OUT A1

#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }

#define MULTIPLAY   0
#define MENU_MODE   1
#define SWIP_MODE   2
#define R6DCZ_MODE  3
#define KVN234_MODE 4
#define GEN_MODE    5
#define KVN_START_STOP 6

#define BLACK                      0x0000
#define BLUE                       0x001F
#define RED                        0xF800
#define GREEN                      0x0400
#define CYAN                       0x07FF
#define MAGENTA                    0xF81F
#define YELLOW                     0xFFE0
#define WHITE                      0xFFFF
#define VIOLET                     0xEC1D
#define AQUA                       0x07FF
#define YELLOW_GREEN               0x9E66
#define PURPLE                     0x8010

String serial_readline = "";
const int bSize = 64;
char Buffer[bSize];
long freq = 3500000;

const uint16_t scr_width  = 128;
const uint16_t scr_height = 128;
uint16_t OffSetX = 2;
uint16_t OffSetY = 1;

int enc_FreqStep = 1;
volatile unsigned long previousMillis;
const byte En_speed_1 =  50;
const byte En_speed_2 =  100;
const int Step_int_1 = 100;
const int Step_int_2 = 10;

long enc_StepMultip = 1;
int enc_ALast;
int enc_AVal;
float vin = 0;
float vout = 0;
float ratio = 0;
long lvin;
String freq_string_hz;
String freq_string_khz;
String freq_string_mhz;
byte fl_change = true;
byte menuLevel;
byte sw_Delay;
long fr_Start;
long fr_End;
long fr_Step;

typedef enum
{
  scr_normal = 0,
  scr_CW     = 1,
  scr_CCW    = 2,
  scr_180    = 3
} ScrOrientation_TypeDef;

typedef union 
{
  int i;
  byte b[2];
} adc_type;

typedef union 
{
  long l;
  byte b[4];
} frq_type;

OneButton button(ENC_SW, true);

void setup()
{
  switchToExtQuartz();
  pinMode(DAC, ANALOG);

  pinMode(ST7735_RST, OUTPUT);
  pinMode(ST7735_CS, OUTPUT);
  pinMode(ST7735_A0, OUTPUT);

  pinMode(ENC_CLK, INPUT_PULLUP);
  pinMode(ENC_DT, INPUT_PULLUP);
  pinMode(ENC_SW, INPUT_PULLUP);

  pinMode(FQ_UD, OUTPUT);
  pinMode(W_CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(RESET, OUTPUT);

  SPI.begin();

  ST7735_init();
  ST7735_Orientation(0);
  ST7735_Clear(BLACK);

  Serial.begin(115200);
  Serial.setTimeout(50);

  attachInterrupt(0, checkEncoder, CHANGE);

  button.attachClick(switchMultiplier);
  button.attachLongPressStop(switchToMenu);

  sendFrequency(freq);
 
  bitSet(fl_change, GEN_MODE);
  menuLevel = GEN_MODE;

}

void switchToExtQuartz() {
  bitSet(PMCR, PMCE);
  bitSet(PMCR, OSCMEN);
  asm("nop");
  asm("nop");
  asm("nop");
  bitSet(PMCR, PMCE);
  bitClear(PMCR, CLKFS);
  bitSet(PMCR, CLKSS);
  asm("nop");
  asm("nop");
  asm("nop");
}

void switchMultiplier()
{
  if (enc_StepMultip == 1) enc_StepMultip = 1000;
  else if (enc_StepMultip == 1000) enc_StepMultip = 1000000;
  else enc_StepMultip = 1;
  bitSet(fl_change, MULTIPLAY);
}

void checkEncoder() {
  byte enc_DT;
  long currentMillis;
  enc_AVal = digitalRead(ENC_CLK);
  enc_DT = digitalRead(ENC_DT);
  enc_FreqStep = 1;
  if (!enc_AVal && enc_ALast) {
    currentMillis = millis();
    if (currentMillis - previousMillis < En_speed_1) enc_FreqStep = Step_int_1;
    else if (currentMillis - previousMillis < En_speed_2) enc_FreqStep = Step_int_2;
    else enc_FreqStep = 1;
    previousMillis = currentMillis;
    if (enc_DT)  {
      if (bitRead(fl_change, MENU_MODE) == 1)
      {
        menuLevel --;
        if (menuLevel <= SWIP_MODE) menuLevel = SWIP_MODE;
        bitSet(fl_change, menuLevel);
      }
      else
      {
        freq = freq + enc_FreqStep * enc_StepMultip;
        if (freq >= 40000000) freq = 40000000;
        sendFrequency(freq);
      }
    }
    else if (bitRead(fl_change, MENU_MODE) == 1)
    {
      menuLevel ++;
      if (menuLevel >= GEN_MODE) menuLevel = GEN_MODE;
      bitSet(fl_change, menuLevel);
    }
    else
    {
      freq = freq - enc_FreqStep * enc_StepMultip;
      if (freq <= 0) freq = 0;
      sendFrequency(freq);
    }
  }
  enc_ALast = enc_AVal;
}

void tfr_byte(byte data)
{
  for (int i = 0; i < 8; i++, data >>= 1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK);
  }
}

void sendFrequency(double frequency) {
  int32_t freq = frequency * 4294967295 / 125000000;
  for (int b = 0; b < 4; b++, freq >>= 8) {
    tfr_byte(freq & 0xFF);
  }
  tfr_byte(0x000);
  pulseHigh(FQ_UD);
}

void readInVoltage()
{
  vin = 0;
  vout = 0;
  lvin=0;
  for (int i = 0; i < 4; i++)
  {
    if (menuLevel == KVN234_MODE) {
      lvin = lvin + analogRead(INP_VAL);
    } else {
      vin = vin + ((float)analogRead(INP_VAL) / 4095 * 4.096);
      vout = vout + ((float)analogRead(INP_OUT) / 4095 * 4.096);
    }
  }
  vin = vin / 4;
  vout = vout / 4;
  ratio = vin / vout;
  lvin = lvin / 4;
}

void printInfo()
{
  readInVoltage();
  String vol_str_in = "Inp: " + String(vin, 6) + "V";
  String vol_str_out =  "Gen: " + String(vout, 6) + "V";
  String kp_str = "Rat: " + String(ratio, 6);
  String dB_str = "dB : " + String(20 * log10(ratio), 6);
  ST7735_PutStr7x11(0, 0, vol_str_out.c_str(), YELLOW, BLACK);
  ST7735_PutStr7x11(0, 15, vol_str_in.c_str(), YELLOW, BLACK);
  String fr_str = "000000000" + String(freq) + "Hz";
  fr_str = "Frq: " + fr_str.substring(fr_str.length() - 10);
  if (bitRead(fl_change, MULTIPLAY) == 1) {
    ST7735_HLine(0, 127, 42, BLACK);
    if (enc_StepMultip == 1000000) ST7735_HLine(40, 54, 42, AQUA);
    else if (enc_StepMultip == 1000) ST7735_HLine(56, 78, 42, AQUA);
    else if (enc_StepMultip == 1) ST7735_HLine(80, 102, 42, AQUA);
    bitClear(fl_change, MULTIPLAY);
  }
  ST7735_PutStr7x11(0, 30, fr_str.c_str(), YELLOW, BLACK);
  ST7735_PutStr7x11(0, 45, kp_str.c_str(), YELLOW, BLACK);
  ST7735_PutStr7x11(0, 60, dB_str.c_str(), YELLOW, BLACK);
}

void switchToMenu()
{
  ST7735_Clear(BLACK);
  bitSet(fl_change, MENU_MODE);
  bitSet(fl_change, menuLevel);
  ST7735_Rect(0, 6, 127, 127, YELLOW);
  ST7735_PutStr7x11(35, 0, "[ MODE ]", YELLOW, BLACK);
  ST7735_PutStr7x11(45, 30, "SWEEP", YELLOW, BLACK);
  ST7735_PutStr7x11(45, 50, "R6DCZ", YELLOW, BLACK);
  ST7735_PutStr7x11(45, 70, "KVN234", YELLOW, BLACK);
  ST7735_PutStr7x11(45, 90, "GEN", YELLOW, BLACK);

  while (bitRead(fl_change, MENU_MODE) == 1)
  {
    if (digitalRead(ENC_SW) == LOW) bitClear(fl_change, MENU_MODE);
    switch (menuLevel)
    {
      case SWIP_MODE:
        if (bitRead(fl_change, SWIP_MODE) == 1)
        {
          ST7735_Rect(7, 27, 120, 43, CYAN);
          ST7735_Rect(7, 47, 120, 63, BLACK);
          ST7735_Rect(7, 67, 120, 83, BLACK);
          ST7735_Rect(7, 87, 120, 103, BLACK);
          bitClear(fl_change, SWIP_MODE);
        }
        break;
      case R6DCZ_MODE:
        if (bitRead(fl_change, R6DCZ_MODE) == 1)
        {
          ST7735_Rect(7, 47, 120, 63, CYAN);
          ST7735_Rect(7, 87, 120, 103, BLACK);
          ST7735_Rect(7, 67, 120, 83, BLACK);
          ST7735_Rect(7, 27, 120, 43, BLACK);
          bitClear(fl_change, R6DCZ_MODE);
        }
        break;
      case KVN234_MODE:
        if (bitRead(fl_change, KVN234_MODE) == 1)
        {
          ST7735_Rect(7, 67, 120, 83, CYAN);
          ST7735_Rect(7, 47, 120, 63, BLACK);
          ST7735_Rect(7, 87, 120, 103, BLACK);
          ST7735_Rect(7, 27, 120, 43, BLACK);
          bitClear(fl_change, KVN234_MODE);
        }
        break;
      case GEN_MODE:
        if (bitRead(fl_change, GEN_MODE) == 1)
        {
          ST7735_Rect(7, 87, 120, 103, CYAN);
          ST7735_Rect(7, 47, 120, 63, BLACK);
          ST7735_Rect(7, 67, 120, 83, BLACK);
          ST7735_Rect(7, 27, 120, 43, BLACK);
          bitClear(fl_change, GEN_MODE);
        }
        analogReference(INTERNAL4V096);
        analogReadResolution(12);
        break;
    }
  }
  if ((menuLevel == GEN_MODE) or (menuLevel == SWIP_MODE))
  {
    ST7735_Clear(BLACK);
    bitSet(fl_change, MULTIPLAY);
  }
  else if (menuLevel == R6DCZ_MODE) ST7735_Rect(7, 47, 120, 63, BLUE);
  else if (menuLevel == KVN234_MODE) ST7735_Rect(7, 67, 120, 83, BLUE);
}

void loop()
{
  long current_fr = fr_Start;
  button.tick();
  if (menuLevel == KVN234_MODE)
    while (bitRead(fl_change, KVN_START_STOP) == 1)
    {
      sendFrequency(current_fr);
      delay(sw_Delay);
      readInVoltage();
      sendData(current_fr);
      current_fr = current_fr + fr_Step;
      if (current_fr > fr_End) current_fr = fr_Start;
      serialEvent();
    }

  if (menuLevel == R6DCZ_MODE)
  {
    while (Serial.available() > 0)
    {
      memset(Buffer, 0, bSize);
      Serial.readBytes(Buffer, bSize);
      serial_readline = String(Buffer);
      if (serial_readline.startsWith("GET "))
      {
        fr_Start = (long)serial_readline.substring(4, 14).toFloat();
        fr_End = (long)serial_readline.substring(15, 24).toFloat();
        fr_Step = (long)serial_readline.substring(25).toFloat();
        for (freq = fr_Start; freq  <= fr_End; freq += fr_Step)
        {
          sendFrequency(freq);
          readInVoltage();
          String freq_str = "000000000" + String(freq) + " ";
          String out_str = freq_str.substring(freq_str.length() - 10) + String(ratio, 6);
          Serial.println(out_str);
        }
      }
      Serial.flush();
    }
  }
  if (menuLevel == GEN_MODE) printInfo();
}

void sendData(long fr)
{
  byte crc;
  adc_type adc ;
  frq_type frq ;
  adc.i = (int)lvin;
  frq.l = (long)fr;
  Serial.write(':'); Serial.write(9); Serial.write(6);
  crc += ':'; crc += 9; crc += 6;
  crc += frq.b[0]; crc += frq.b[1]; crc += frq.b[2]; crc += frq.b[3];
  crc += adc.b[0]; crc += adc.b[1];
  Serial.write(frq.b[0]); Serial.write(frq.b[1]); Serial.write(frq.b[2]); Serial.write(frq.b[3]);
  Serial.write(adc.b[0]); Serial.write(adc.b[1]); Serial.write(crc);
}

void serialEvent()
{
  if (menuLevel == KVN234_MODE)
  {
    while (Serial.available())
    {
      memset(Buffer, 0, bSize);
      Serial.readBytes(Buffer, bSize);
      if (Buffer[0] == ':')
      {
        byte len = Buffer[1];
        if (len == 3)
        {
          byte inCommand = Buffer[2];
          switch (inCommand)
          {
            case 0: {
                bitSet(fl_change, KVN_START_STOP);  //Start_Gkch
                SendOK(0);
                break;
              }
            case 1: {
                bitClear(fl_change, KVN_START_STOP);  //Stop_Gkch
                SendOK(1);
                break;
              }
            case 7: {
                analogReference(INTERNAL1V024);  //V1
                analogReadResolution(12);
                SendOK(7);
                break;
              }
            case 8: {
                analogReference(DEFAULT);  //V5
                analogReadResolution(10);
                SendOK(8);
                break;
              }
            case 9: {
                SendOK(9);  //A0
                break;
              }
            case 10: {
                SendOK(10);  //A2
                break;
              }
            case 16: {
                SendOK(16);  //A3
                break;
              }
            case 17: {
                SendOK(17);  //A4
                break;
              }
          }
        }
        else if (len == 4)
        {
          byte inCommand = Buffer[2];
          switch (inCommand)
          {
            case 18: {
                sw_Delay = Buffer[3];  //SET_PAUZ
                SendOK(18);
                break;
              }
          }
        }
        else if (len == 7)
        {
          byte inCommand = Buffer[2];
          switch (inCommand)
          {
            case 2: {
                fr_Start = pow(2, 32) * (byte)Buffer[6] + pow(2, 16) * (byte)Buffer[5] + pow(2, 8) * (byte)Buffer[4] + (byte)Buffer[3]; //Fr0
                SendOK(2);
                break;
              }
            case 3: {
                fr_End = pow(2, 32) * (byte)Buffer[6] + pow(2, 16) * (byte)Buffer[5] + pow(2, 8) * (byte)Buffer[4] + (byte)Buffer[3]; //Fr1
                SendOK(3);
                break;
              }
            case 4: {
                fr_Step = pow(2, 32) * (byte)Buffer[6] + pow(2, 16) * (byte)Buffer[5] + pow(2, 8) * (byte)Buffer[4] + (byte)Buffer[3]; //Step
                SendOK(4);
                break;
              }
          }
        }
      }
      Serial.flush();
    }
  }
}

void SendOK(byte command)
{
  char crc;
  crc = ':'; crc += 3; crc += command;
  Serial.write(':'); Serial.write(3); Serial.write(command); Serial.write(crc);
}

/*************************************************************************************************************
   Драйвер lcg 1.44" 128X128 ST7735 VER 1.0. на красной плате
 ************************************************************************************************************/
char const Font7x11[] PROGMEM =
{
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // space 0x20  32
  0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x08,   // ! 0x21  33
  0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // " 0x22  34
  0x48, 0x48, 0x24, 0x7f, 0x24, 0x24, 0x12, 0x7f, 0x12, 0x09, 0x09,   // # 0x23  35
  0x08, 0x3e, 0x49, 0x09, 0x09, 0x3e, 0x48, 0x48, 0x49, 0x3e, 0x08,   // $ 0x24  36
  0x47, 0x25, 0x27, 0x10, 0x10, 0x08, 0x08, 0x04, 0x72, 0x52, 0x71,   // % 0x25  37
  0x06, 0x09, 0x09, 0x09, 0x26, 0x22, 0x25, 0x29, 0x11, 0x29, 0x46,   // & 0x26  38
  0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // ' 0x27  39
  0x08, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x08,   // ( 0x28  40
  0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04,   // ) 0x29  41
  0x00, 0x08, 0x2a, 0x1c, 0x2a, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,   // * 0x2A  42
  0x00, 0x00, 0x00, 0x08, 0x08, 0x3e, 0x08, 0x08, 0x00, 0x00, 0x00,   // + 0x2B  43
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x04,   // , 0x2C  44
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,   // - 0x2D  45
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,   // . 0x2E  46
  0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,   // / 0x2F  47
  0x1c, 0x22, 0x51, 0x51, 0x49, 0x49, 0x49, 0x45, 0x45, 0x22, 0x1c,   // 0 0x30  48
  0x08, 0x0c, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e,   // 1 0x31  49
  0x1e, 0x21, 0x40, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x7f,   // 2 0x32  50
  0x1f, 0x20, 0x40, 0x40, 0x20, 0x1e, 0x20, 0x40, 0x40, 0x20, 0x1f,   // 3 0x33  51
  0x30, 0x28, 0x24, 0x22, 0x21, 0x7f, 0x20, 0x20, 0x20, 0x20, 0x20,   // 4 0x34  52
  0x7f, 0x01, 0x01, 0x01, 0x1f, 0x20, 0x40, 0x40, 0x40, 0x20, 0x1f,   // 5 0x35  53
  0x38, 0x04, 0x02, 0x01, 0x1d, 0x23, 0x41, 0x41, 0x41, 0x22, 0x1c,   // 6 0x36  54
  0x7f, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02,   // 7 0x37  55
  0x1c, 0x22, 0x41, 0x41, 0x22, 0x1c, 0x22, 0x41, 0x41, 0x22, 0x1c,   // 8 0x38  56
  0x1c, 0x22, 0x41, 0x41, 0x41, 0x62, 0x5c, 0x40, 0x20, 0x10, 0x0e,   // 9 0x39  57
  0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00,   // : 0x3A  58
  0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x08, 0x04,   // ; 0x3B  59
  0x00, 0x40, 0x30, 0x0c, 0x02, 0x01, 0x02, 0x0c, 0x30, 0x40, 0x00,   // < 0x3C  60
  0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00,   // = 0x3D  61
  0x00, 0x01, 0x06, 0x18, 0x20, 0x40, 0x20, 0x18, 0x06, 0x01, 0x00,   // > 0x3E  62
  0x3e, 0x41, 0x40, 0x40, 0x30, 0x08, 0x08, 0x08, 0x00, 0x08, 0x08,   // ? 0x3F  63
  0x1c, 0x22, 0x41, 0x49, 0x55, 0x55, 0x55, 0x39, 0x01, 0x02, 0x3c,   // @ 0x40  64
  0x08, 0x14, 0x14, 0x22, 0x22, 0x41, 0x41, 0x7f, 0x41, 0x41, 0x41,   // A 0x41  65
  0x1f, 0x21, 0x21, 0x21, 0x1f, 0x21, 0x41, 0x41, 0x41, 0x21, 0x1f,   // B 0x42  66
  0x3c, 0x42, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x42, 0x3c,   // C 0x43  67
  0x1f, 0x22, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x22, 0x1f,   // D 0x44  68
  0x7f, 0x01, 0x01, 0x01, 0x1f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x7f,   // E 0x45  69
  0x7f, 0x01, 0x01, 0x01, 0x3f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,   // F 0x46  70
  0x3c, 0x42, 0x01, 0x01, 0x01, 0x79, 0x41, 0x41, 0x41, 0x42, 0x3c,   // G 0x47  71
  0x41, 0x41, 0x41, 0x41, 0x7f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,   // H 0x48  72
  0x1c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1c,   // I 0x49  73
  0x1e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x0e,   // J 0x4A  74
  0x21, 0x11, 0x09, 0x05, 0x03, 0x03, 0x05, 0x09, 0x11, 0x21, 0x41,   // K 0x4B  75
  0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x7f,   // L 0x4C  76
  0x41, 0x63, 0x55, 0x55, 0x49, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41,   // M 0x4D  77
  0x41, 0x41, 0x41, 0x43, 0x43, 0x45, 0x49, 0x51, 0x51, 0x61, 0x41,   // N 0x4E  78
  0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c,   // O 0x4F  79
  0x1f, 0x21, 0x41, 0x41, 0x41, 0x21, 0x1f, 0x01, 0x01, 0x01, 0x01,   // P 0x50  80
  0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x51, 0x22, 0x5c,   // Q 0x51  81
  0x1f, 0x21, 0x41, 0x41, 0x41, 0x21, 0x1f, 0x09, 0x11, 0x21, 0x41,   // R 0x52  82
  0x1c, 0x22, 0x41, 0x01, 0x02, 0x1c, 0x20, 0x40, 0x41, 0x22, 0x1c,   // S 0x53  83
  0x7f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,   // T 0x54  84
  0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c,   // U 0x55  85
  0x41, 0x41, 0x22, 0x22, 0x22, 0x22, 0x14, 0x14, 0x14, 0x08, 0x08,   // V 0x56  86
  0x41, 0x41, 0x41, 0x41, 0x49, 0x49, 0x49, 0x55, 0x55, 0x63, 0x41,   // W 0x57  87
  0x41, 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x14, 0x22, 0x22, 0x41,   // X 0x58  88
  0x41, 0x41, 0x22, 0x14, 0x14, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,   // Y 0x59  89
  0x7f, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x7f,   // Z 0x5A  90
  0x1c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1c,   // [ 0x5B  91
  0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10,   // \ 0x5C  92
  0x0e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0e,   // ] 0x5D  93
  0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // ^ 0x5E  94
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,   // _ 0x5F  95
  0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // ` 0x60  96
  0x00, 0x00, 0x00, 0x3e, 0x41, 0x40, 0x7e, 0x41, 0x41, 0x61, 0x5e,   // a 0x61  97
  0x01, 0x01, 0x01, 0x1d, 0x23, 0x41, 0x41, 0x41, 0x41, 0x23, 0x1d,   // b 0x62  98
  0x00, 0x00, 0x00, 0x3c, 0x42, 0x01, 0x01, 0x01, 0x01, 0x42, 0x3c,   // c 0x63  99
  0x40, 0x40, 0x40, 0x5c, 0x62, 0x41, 0x41, 0x41, 0x41, 0x62, 0x5c,   // d 0x64 100
  0x00, 0x00, 0x00, 0x1c, 0x22, 0x41, 0x7f, 0x01, 0x01, 0x42, 0x3c,   // e 0x65 101
  0x1c, 0x04, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,   // f 0x66 102
  0x00, 0x00, 0x00, 0x5e, 0x61, 0x41, 0x61, 0x5e, 0x40, 0x21, 0x1e,   // g 0x67 103
  0x01, 0x01, 0x01, 0x3d, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,   // h 0x68 104
  0x08, 0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,   // i 0x69 105
  0x00, 0x10, 0x00, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x0c,   // j 0x6A 106
  0x01, 0x01, 0x01, 0x21, 0x11, 0x09, 0x07, 0x09, 0x11, 0x21, 0x41,   // k 0x6B 107
  0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0c,   // l 0x6C 108
  0x00, 0x00, 0x00, 0x25, 0x5b, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49,   // m 0x6D 109
  0x00, 0x00, 0x00, 0x1d, 0x23, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,   // n 0x6E 110
  0x00, 0x00, 0x00, 0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c,   // o 0x6F 111
  0x00, 0x00, 0x00, 0x1f, 0x21, 0x41, 0x41, 0x21, 0x1f, 0x01, 0x01,   // p 0x70 112
  0x00, 0x00, 0x00, 0x2c, 0x32, 0x21, 0x21, 0x21, 0x32, 0x2c, 0x20,   // q 0x71 113
  0x00, 0x00, 0x00, 0x3d, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,   // r 0x72 114
  0x00, 0x00, 0x00, 0x3e, 0x41, 0x01, 0x0e, 0x30, 0x40, 0x41, 0x3e,   // s 0x73 115
  0x00, 0x04, 0x04, 0x3e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x38,   // t 0x74 116
  0x00, 0x00, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x31, 0x2e,   // u 0x75 117
  0x00, 0x00, 0x00, 0x41, 0x41, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08,   // v 0x76 118
  0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x49, 0x49, 0x49, 0x49, 0x36,   // w 0x77 119
  0x00, 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, 0x08, 0x14, 0x22, 0x41,   // x 0x78 120
  0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x24, 0x38, 0x10, 0x08, 0x06,   // y 0x79 121
  0x00, 0x00, 0x00, 0x7f, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x7f,   // z 0x7A 122
  0x18, 0x08, 0x08, 0x08, 0x04, 0x06, 0x04, 0x08, 0x08, 0x08, 0x18,   // { 0x7B 123
  0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,   // | 0x7C 124
  0x0c, 0x08, 0x08, 0x08, 0x10, 0x30, 0x10, 0x08, 0x08, 0x08, 0x0c,   // } 0x7D 125
  0x00, 0x00, 0x00, 0x00, 0x04, 0x0a, 0x51, 0x20, 0x00, 0x00, 0x00,   // ~ 0x7E 126
  0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f
}; //  0x7F 127

#define HWRST_SET       digitalWrite(ST7735_RST,HIGH)
#define HWRST_RESET     digitalWrite(ST7735_RST,LOW)
#define ST7735_COMMAND  digitalWrite(ST7735_A0,LOW)
#define ST7735_DATA     digitalWrite(ST7735_A0,HIGH)
#define ST7735_SELECT   digitalWrite(ST7735_CS,LOW)
#define ST7735_UNSELECT digitalWrite(ST7735_CS,HIGH)

void ST7735_PutChar7x11(uint16_t X, uint16_t Y, uint8_t chr, uint16_t color, uint16_t bgcolor)
{
  uint16_t i, j;
  uint8_t buffer[11];
  uint8_t CH = color >> 8;
  uint8_t CL = (uint8_t)color;
  uint8_t BCH = bgcolor >> 8;
  uint8_t BCL = (uint8_t)bgcolor;

  memcpy_P(buffer, &Font7x11[(chr - 32) * 11], 11);
  ST7735_AddrSet(X, Y, X + 7, Y + 11);
  ST7735_DATA;
  for (i = 0; i < 11; i++)
  {
    for (j = 0; j < 7; j++)
    {
      if ((buffer[i] >> j) & 0x01)
      {
        ST7735_write(CH);
        ST7735_write(CL);
      }
      else
      {
        ST7735_write(BCH);
        ST7735_write(BCL);
      }
    }
    ST7735_write(BCH);
    ST7735_write(BCL);
  }
  for (i = 0; i < 8; i++)
  {
    ST7735_write(BCH);
    ST7735_write(BCL);
  }
}

void ST7735_PutStr7x11(uint8_t X, uint8_t Y, char *str, uint16_t color, uint16_t bgcolor)
{
  while (*str)
  {
    ST7735_PutChar7x11(X, Y, *str++, color, bgcolor);
    if (X < scr_width - 8) {
      X += 8;
    } else if (Y < scr_height - 12) {
      X = 0;
      Y += 12;
    } else {
      X = 0;
      Y = 0;
    }
  };
}

void ST7735_Clear(uint16_t color)
{
  uint16_t i;
  uint8_t  CH, CL;

  CH = color >> 8;
  CL = (uint8_t)color;

  ST7735_AddrSet(0, 0, (scr_width - 1), (scr_height - 1));
  ST7735_DATA;
  for (i = 0; i < (scr_width * scr_height); i++) {
    ST7735_write(CH);
    ST7735_write(CL);
  }
}

void ST7735_AddrSet(uint16_t XS, uint16_t YS, uint16_t XE, uint16_t YE)
{
  XS = XS + OffSetX;
  XE = XE + OffSetX;
  YS = YS + OffSetY;
  YE = YE + OffSetY;
  ST7735_cmd(0x2a);
  ST7735_DATA;
  ST7735_write(XS >> 8);
  ST7735_write(XS);
  ST7735_write(XE >> 8);
  ST7735_write(XE);
  ST7735_cmd(0x2b);
  ST7735_DATA;
  ST7735_write(YS >> 8);
  ST7735_write(YS);
  ST7735_write(YE >> 8);
  ST7735_write(YE);
  ST7735_cmd(0x2c);
}

void ST7735_HWRST()
{
  HWRST_RESET;
  HWRST_SET;
}

void ST7735_data(uint8_t data)
{
  ST7735_DATA;
  ST7735_write(data);
}

void ST7735_SWRST()
{
  ST7735_cmd(0x01);
  ST7735_data(0x01);
}

void ST7735_write(uint8_t data)
{
  ST7735_SELECT;
  SPI.transfer(data);
  ST7735_UNSELECT;
}

void ST7735_cmd(uint8_t cmd)
{
  ST7735_COMMAND;
  ST7735_write(cmd);
}

void ST7735_Pixel(uint16_t X, uint16_t Y, uint16_t color)
{
  ST7735_AddrSet(X, Y, X, Y);
  ST7735_DATA;
  ST7735_write(color >> 8);
  ST7735_write((uint8_t)color);
}

void ST7735_HLine(uint16_t X1, uint16_t X2, uint16_t Y, uint16_t color)
{
  uint16_t i;
  uint8_t CH = color >> 8;
  uint8_t CL = (uint8_t)color;

  ST7735_AddrSet(X1, Y, X2, Y);
  ST7735_DATA;
  for (i = 0; i <= (X2 - X1); i++)
  {
    ST7735_write(CH);
    ST7735_write(CL);
  }
}

void ST7735_VLine(uint16_t X, uint16_t Y1, uint16_t Y2, uint16_t color)
{
  uint16_t i;
  uint8_t CH = color >> 8;
  uint8_t CL = (uint8_t)color;

  ST7735_AddrSet(X, Y1, X, Y2);
  ST7735_DATA;
  for (i = 0; i <= (Y2 - Y1); i++)
  {
    ST7735_write(CH);
    ST7735_write(CL);
  }
}

void ST7735_Line(int16_t X1, int16_t Y1, int16_t X2, int16_t Y2, uint16_t color)
{
  int16_t dX = X2 - X1;
  int16_t dY = Y2 - Y1;
  int16_t dXsym = (dX > 0) ? 1 : -1;
  int16_t dYsym = (dY > 0) ? 1 : -1;

  if (dX == 0)
  {
    if (Y2 > Y1) ST7735_VLine(X1, Y1, Y2, color); else ST7735_VLine(X1, Y2, Y1, color);
    return;
  }
  if (dY == 0)
  {
    if (X2 > X1) ST7735_HLine(X1, X2, Y1, color); else ST7735_HLine(X2, X1, Y1, color);
    return;
  }

  dX *= dXsym;
  dY *= dYsym;
  int16_t dX2 = dX << 1;
  int16_t dY2 = dY << 1;
  int16_t di;

  if (dX >= dY)
  {
    di = dY2 - dX;
    while (X1 != X2)
    {
      ST7735_Pixel(X1, Y1, color);
      X1 += dXsym;
      if (di < 0)
      {
        di += dY2;
      }
      else
      {
        di += dY2 - dX2;
        Y1 += dYsym;
      }
    }
  }
  else
  {
    di = dX2 - dY;
    while (Y1 != Y2)
    {
      ST7735_Pixel(X1, Y1, color);
      Y1 += dYsym;
      if (di < 0)
      {
        di += dX2;
      }
      else
      {
        di += dX2 - dY2;
        X1 += dXsym;
      }
    }
  }
  ST7735_Pixel(X1, Y1, color);
}

void ST7735_Rect(uint16_t X1, uint16_t Y1, uint16_t X2, uint16_t Y2, uint16_t color)
{
  ST7735_HLine(X1, X2, Y1, color);
  ST7735_HLine(X1, X2, Y2, color);
  ST7735_VLine(X1, Y1, Y2, color);
  ST7735_VLine(X2, Y1, Y2, color);
}

void ST7735_FillRect(uint16_t X1, uint16_t Y1, uint16_t X2, uint16_t Y2, uint16_t color)
{
  uint16_t i;
  uint16_t FS = (X2 - X1 + 1) * (Y2 - Y1 + 1);
  uint8_t CH = color >> 8;
  uint8_t CL = (uint8_t)color;

  ST7735_AddrSet(X1, Y1, X2, Y2);
  ST7735_DATA;
  for (i = 0; i < FS; i++)
  {
    ST7735_write(CH);
    ST7735_write(CL);
  }
}

void ST7735_init() {
  ST7735_HWRST();
  delay(15);
  ST7735_SWRST();
  delay(150);
  ST7735_cmd(0x11); //SLPOUT
  delay(255);
  ST7735_cmd(0xb1); //FRMCTR1
  ST7735_DATA;
  ST7735_write(0x01);
  ST7735_write(0x2c);
  ST7735_write(0x2d);
  ST7735_cmd(0xb2); //FRMCTR2
  ST7735_DATA;
  ST7735_write(0x01);
  ST7735_write(0x2c);
  ST7735_write(0x2d);
  ST7735_cmd(0xb3); //FRMCTR3
  ST7735_DATA;
  ST7735_write(0x01);
  ST7735_write(0x2c);
  ST7735_write(0x2d);
  ST7735_write(0x01);
  ST7735_write(0x2c);
  ST7735_write(0x2d);
  ST7735_cmd(0xb4); //INVCTR
  ST7735_data(0x07);
  ST7735_cmd(0xc0); //PWCTR1
  ST7735_DATA;
  ST7735_write(0xa2);
  ST7735_write(0x02);
  ST7735_write(0x84);
  ST7735_cmd(0xc1); //PWCTR2
  ST7735_data(0xc5);
  ST7735_cmd(0xC2); //PWCTR3
  ST7735_DATA;
  ST7735_write(0x0a);
  ST7735_write(0x00);
  ST7735_cmd(0xc3); //PWCTR4
  ST7735_DATA;
  ST7735_write(0x8a);
  ST7735_write(0x2a);
  ST7735_cmd(0xc4); //PWCTR5
  ST7735_DATA;
  ST7735_write(0x8a);
  ST7735_write(0xee);
  ST7735_cmd(0xc5); //VMCTR1
  ST7735_data(0x0e);
  ST7735_cmd(0x20); //INVOFF
  ST7735_cmd(0x36); //MADCTL
  ST7735_data(0x8);
  ST7735_cmd(0x3a); //COLMOD
  ST7735_data(0x05);
  delay(10);
  ST7735_cmd(0x2a); //CASET
  ST7735_DATA;
  ST7735_write(0x00);
  ST7735_write(0x00);
  ST7735_write(0x00);
  ST7735_write(0x7f);
  ST7735_cmd(0x2b); //RASET
  ST7735_DATA;
  ST7735_write(0x00);
  ST7735_write(0x00);
  ST7735_write(0x00);
  ST7735_write(0x7f);
  ST7735_cmd(0xe0); //GMCTRP1
  ST7735_DATA;
  ST7735_write(0x02);
  ST7735_write(0x1c);
  ST7735_write(0x07);
  ST7735_write(0x12);
  ST7735_write(0x37);
  ST7735_write(0x32);
  ST7735_write(0x29);
  ST7735_write(0x2d);
  ST7735_write(0x29);
  ST7735_write(0x25);
  ST7735_write(0x28);
  ST7735_write(0x39);
  ST7735_write(0x00);
  ST7735_write(0x01);
  ST7735_write(0x03);
  ST7735_write(0x10);
  ST7735_cmd(0xe1); //GMCTRN1
  ST7735_DATA;
  ST7735_write(0x03);
  ST7735_write(0x1d);
  ST7735_write(0x07);
  ST7735_write(0x06);
  ST7735_write(0x2e);
  ST7735_write(0x2c);
  ST7735_write(0x29);
  ST7735_write(0x2d);
  ST7735_write(0x2e);
  ST7735_write(0x2e);
  ST7735_write(0x37);
  ST7735_write(0x3f);
  ST7735_write(0x00);
  ST7735_write(0x00);
  ST7735_write(0x02);
  ST7735_write(0x10);
  ST7735_cmd(0x13); //NORON
  delay(10);
  ST7735_cmd(0x29); //DISPON
}

void ST7735_Orientation(ScrOrientation_TypeDef orientation)
{
  ST7735_cmd(0x36); // Memory data access control:
  switch (orientation)
  {
    case scr_CW:
      OffSetX = 3;
      OffSetY = 2;
      ST7735_data(0xa8);
      break;
    case scr_CCW:
      OffSetX = 1;
      OffSetY = 2;
      ST7735_data(0x68);
      break;
    case scr_180:
      OffSetX = 2;
      OffSetY = 3;
      ST7735_data(0xc8);
      break;
    default:
      OffSetX = 2;
      OffSetY = 1;
      ST7735_data(0x08);
      break;
  }
}
void ST7735_invertDisplay(boolean i) {
  ST7735_cmd(i ? 0x21 : 0x20);
}

Изображение
Дополнительн, для обслуживания меню одной кнопкой и энкодером использовал библу OneButton. Еще 10кб осталось для извращений

PS. В программе автора ничего исправлять не нужно. Исправил свой косяк в скетче. Сейчас WAVGAT UNO R3 (lgt8f328p, awga328p) ведет себя как стандартная плата на atmega328p

_________________
Девице - Device


Последний раз редактировалось maxlab Ср апр 29, 2020 01:22:15, всего редактировалось 1 раз.

Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Вт апр 28, 2020 21:20:18 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 7
Рейтинг сообщений: 8
Зарегистрирован: Чт апр 17, 2014 19:33:41
Сообщений: 26
Рейтинг сообщения: 0
Адаптировал скетч под программу Автора ... с изъятиями и сокращениями. Только режим ГКЧ.

Уважаемый maxlab, пишите более развёрнуто пояснение. А то надо читать форум сначала, что бы понять, что Вы под адаптацией понимаете код для lgt8f328p с использованием ST7735. А фраза "Только режим ГКЧ" никак не вяжется с картинкой, которая предполагает использование АЦП.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср июл 01, 2020 08:12:42 
Первый раз сказал Мяу!

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Пт май 12, 2017 12:19:03
Сообщений: 33
Рейтинг сообщения: 0
Уважаемый kvn234! Пытался скачать последнюю версию софта, что вы выложили, так не получается:Файл ./../files/36023_9044531071128e29adb62bcfb8c5f946 отсутствует. Можно перезалить?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Чт июл 02, 2020 14:29:05 
Нашел транзистор. Понюхал.

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Вс апр 17, 2011 09:51:26
Сообщений: 192
Откуда: Тула
Рейтинг сообщения: 0
Файл ./../files/36023_9044531071128e29adb62bcfb8c5f946 отсутствует. Можно перезалить?

Я не удалял. Загружаю повторно.


Вложения:
Комментарий к файлу: Прошивка для Mega328p, загрузчик прошивки и софт для ПК
AD950.ZIP [961.88 KiB]
Скачиваний: 715
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Вт июл 07, 2020 13:42:15 
Родился

Зарегистрирован: Вт июл 07, 2020 13:18:18
Сообщений: 2
Рейтинг сообщения: 0
Допилил ПО.
Доброго времени суток! Скачал ваш архив. Что то не пойму где скетч, что заливать в ардуино?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Вт июл 07, 2020 15:15:50 
Нашел транзистор. Понюхал.

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Вс апр 17, 2011 09:51:26
Сообщений: 192
Откуда: Тула
Рейтинг сообщения: 0
Доброго времени суток! Скачал ваш архив. Что то не пойму где скетч, что заливать в ардуино?

IDE AVR Studio 4.18

Заливать надо прошивку (*.hex) в ATMega328P.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср июл 08, 2020 15:47:17 
Первый раз сказал Мяу!

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Пт май 12, 2017 12:19:03
Сообщений: 33
Рейтинг сообщения: 0
[/uquote]
Я не удалял. Загружаю повторно.[/uquote]
Спасибо большое!!!

Добавлено after 24 minutes 57 seconds:
Не ладится у меня с цитированием. Спасибо большое, kvn 234. за обновления! На мой взгляд, та разница в показаниях с диодным детектором, которую вы приводили, связана с тем, что конденсатор фильтра детектора просто не успевал зарядиться до максимума, при малом времени "стояния" на одной частоте. Увеличили время, возросло напряжение! Еще раз- спасибо! :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Пт июл 10, 2020 13:23:48 
Нашел транзистор. Понюхал.

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Вс апр 17, 2011 09:51:26
Сообщений: 192
Откуда: Тула
Рейтинг сообщения: 0
На мой взгляд, та разница в показаниях с диодным детектором, которую вы приводили, связана с тем, что конденсатор фильтра детектора просто не успевал зарядиться до максимума, при малом времени "стояния" на одной частоте. Увеличили время, возросло напряжение!

Конденсатор тоже влияет на длительность переходного процесса, но даже если уменьшить емкость до минимума, остается переходной процесс измеряемой цепи.

Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср дек 30, 2020 09:46:35 
Опытный кот
Аватар пользователя

Карма: 10
Рейтинг сообщений: 34
Зарегистрирован: Пт июл 26, 2013 22:33:37
Сообщений: 766
Рейтинг сообщения: 0
У меня ГКЧ три входа, А0- на диодах Д18, А2-вход логарифмический, А3- вход линейный. Собраны на AD8310 и AD8361. Залита последняя прошивка. Для примера, снял ещё раньше, АЧХ для фильтра ФП2П4-436-10,7М-15-В." Корону" так и не удалось убрать, хоть пробовал согласовывать резисторами 50ом+ подстроечные, включал параллельно и последовательно. Попробовал снять АЧХ пьезокерамического фильтра ( трёх ногий на 10,7Мгц) ничего не увидел. Это предыстория. Теперь основное. Хотел посмотреть и настроить тракт ЧМ приёмника Океан. Не смог, показывает ровную линию. Для настройки контуров подавал сигнал 10,7Мгц+ и - 15Кгц. на вход платы ( блок УКВ отключил). Мерил на Базе последнего транзистора ( перед дробным детектором). Подавал и с большей девиацией, но результат прежний, ровная линия. Подскажите, что надо сделать, что бы можно было пользоваться?
Вложение:
Изображение 001.jpg [245.06 KiB]
Скачиваний: 521

Вложение:
Изображение 004.jpg [210.47 KiB]
Скачиваний: 464

Вложение:
лин. вх..png [76.34 KiB]
Скачиваний: 471

Вложение:
лин. детектор.png [28.12 KiB]
Скачиваний: 466

Вложение:
лог. детектор.png [29.91 KiB]
Скачиваний: 492


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср дек 30, 2020 12:00:43 
Вымогатель припоя
Аватар пользователя

Карма: 67
Рейтинг сообщений: 483
Зарегистрирован: Вс июл 21, 2013 16:24:58
Сообщений: 602
Откуда: Юг Руси.
Рейтинг сообщения: 0
alex-551 писал(а):
Подскажите, что надо сделать, что бы можно было пользоваться?

Прежде всего, согласовать фильтр по входу и по выходу. У вас 6-кристальный
кварцевый фильтр, вот, 6 пиков на характеристике показывает. Кварцевые
фильтры (да и ЭМФы тоже) так себя и ведут, когда входное/выходное сопротивление
устройства, к которому они подключаются, не соответствует их паспортным данным.
Как согласовывать - не подскажу, надо знать, куда и как он у вас подключён.
Возможно, просто резисторами. Но надо учитывать, что часть сигнала потеряется
на согласовании. Можно ещё LC цепочками, рассчитанными, например в RFsimm.
В LC потерь меньше.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср дек 30, 2020 12:16:07 
Опытный кот
Аватар пользователя

Карма: 10
Рейтинг сообщений: 34
Зарегистрирован: Пт июл 26, 2013 22:33:37
Сообщений: 766
Рейтинг сообщения: 0
Меня больше интересует как измерить тракт ПЧ-ЧМ.
А фильтр пробовал согласовывать по схемам во вложении.
Вложение:
Согласование.JPG [54.04 KiB]
Скачиваний: 536


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср дек 30, 2020 13:22:51 
Нашел транзистор. Понюхал.

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Вс апр 17, 2011 09:51:26
Сообщений: 192
Откуда: Тула
Рейтинг сообщения: 0
alex-551

У Вас не последняя версия. Последняя версия в моем сообщении от июль 02, 2020.

Но во всех версиях принцип измерения не менялся.
Для повышения точности установите максимальное время измерения.

АЧХ можете построить вручную по нескольким точкам и сравнить с полученным прибором.

Вот измерение АЧХ кварца.

Изображение

Изображение

Изображение

При измерении ВЧ необходимо использовать короткие провода. Возможно у Вас длинные измерительные концы.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср дек 30, 2020 15:06:17 
Опытный кот
Аватар пользователя

Карма: 10
Рейтинг сообщений: 34
Зарегистрирован: Пт июл 26, 2013 22:33:37
Сообщений: 766
Рейтинг сообщения: 0
Спасибо что помогаете. Стоит последняя версия, просто примеры фильтра снимал ещё на предыдущей версии. По проводам понял, попробую покороче, но, наверное, это уже после НГ. Просто АЧХ платы ПЧ-ЧМ 10,7Мгц хоть какой то горб бы показал. У меня логарифмический и линейный детекторы собраны внутри прибора. Может надо было сделать выносными? Но у других вроде работает. Хочу попробовать вытащить транзистор Т4-7, на базе которого меряю, возможно он садит сигнал? Подаю на контакт 11 платы У4, при этом выход блока УКВ отпаял. Почему не смог померить пьезокерамический фильтр?
Вложение:
1+1.png [24.74 KiB]
Скачиваний: 370

Вложение:
фильтр . дискриминатор10,7мгц.png [190.29 KiB]
Скачиваний: 478

Вложение:
111+1.jpg [141.09 KiB]
Скачиваний: 463

[attachment=0]111+3.jpg[/attachment
Как вставлять сразу картинки?


Вложения:
111+3.jpg [138.11 KiB]
Скачиваний: 401
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср дек 30, 2020 16:23:21 
Нашел транзистор. Понюхал.

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Вс апр 17, 2011 09:51:26
Сообщений: 192
Откуда: Тула
Рейтинг сообщения: 1
По проводам понял, попробую покороче, но, наверное, это уже после НГ. ... У меня логарифмический и линейный детекторы собраны внутри прибора. Может надо было сделать выносными?


Если Вы измеряете АЧХ ВЧ каскадов, детекторы и усилители надо делать выносными, чтобы не вносить дополнительные LCR в измеряемую схему и не искажать АЧХ.
И кабель без выносных детекторов и усилителей вносит дополнительные затухания(чем длиннее тем больше) .


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср дек 30, 2020 17:00:40 
Опытный кот
Аватар пользователя

Карма: 10
Рейтинг сообщений: 34
Зарегистрирован: Пт июл 26, 2013 22:33:37
Сообщений: 766
Рейтинг сообщения: 0
Понял, спасибо за советы. Попробую попозже с короткими проводами. Возникнут вопросы буду обращаться.
А кто нибудь пробовал снимать АЧХ трактов ПЧ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Ср дек 30, 2020 17:26:05 
Собутыльник Кота

Карма: 14
Рейтинг сообщений: 472
Зарегистрирован: Вс фев 02, 2020 09:12:37
Сообщений: 2804
Рейтинг сообщения: 0
нет...ты первый будешь.....в новом году...)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простейший ГКЧ на AD9850 и Arduino Nano 328
СообщениеДобавлено: Чт дек 31, 2020 09:44:18 
Нашел транзистор. Понюхал.

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Вс апр 17, 2011 09:51:26
Сообщений: 192
Откуда: Тула
Рейтинг сообщения: 0
alex-551


Посмотрел свежим взглядом 1+1.png.
У Вас не выставлен диапазон качания. По всей шкале нулевые частоты.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 405 ]     ... , , , 18, , ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y