Простой измеритель АЧХ на STM32F103

Вопросы и дискуссии по различной промышленной и самодельной радиоаппаратуре. Все о трансиверах и радиостанциях...
Ответить
bogdanhik1
Сообщения: 12
Зарегистрирован: 18 дек 2020, 12:52
Моё имя: Василий
Поблагодарили: 7 раз

Простой измеритель АЧХ на STM32F103

Сообщение bogdanhik1 »

Очень часто у радиолюбителей возникает необходимость измерить характеристики контура или кварца, данный приборчик собирается за 10 минут на макетке.
И как всегда немножко видео работы прибора )))
https://youtu.be/Hxx7feANj9I
Аватара пользователя
RV3MP
Сообщения: 173
Зарегистрирован: 21 окт 2019, 09:51
QTH: Ярославль
Благодарил (а): 22 раза
Поблагодарили: 35 раз

Re: Простой измеритель АЧХ на STM32F103

Сообщение RV3MP »

Забавная игрушка.
Продолжение будет? :roll:
А моя игрушка сломалась. :( Тач крякнул на половине экрана. Надо в порядок приводить.
Тоже кварцы меряет и еще... много чего делает...
viewtopic.php?f=7&t=49
-----------------------------
Михаил
bogdanhik1
Сообщения: 12
Зарегистрирован: 18 дек 2020, 12:52
Моё имя: Василий
Поблагодарили: 7 раз

Re: Простой измеритель АЧХ на STM32F103

Сообщение bogdanhik1 »

Продолжение будет. Исходник сегодня добавлю как доберусь до компа.
bogdanhik1
Сообщения: 12
Зарегистрирован: 18 дек 2020, 12:52
Моё имя: Василий
Поблагодарили: 7 раз

Re: Простой измеритель АЧХ на STM32F103

Сообщение bogdanhik1 »

Как и обещал исходный код для arduino ide.

Код: Выделить всё

#include "si5351.h"
#include "Wire.h"
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
// кнопки


// ---------------------------------------------
// For the Adafruit shield, these are the default.
#define TFT_DC PB0
#define TFT_CS PB10
#define TFT_RST   PB1                     // RESET  
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
Si5351 si5351;
int ClockOutV = 7500000;
long ClockStepV = 5000;
int Steps = 5000;
int ClockMinV = 7500000;
int ClockMaxV = 8500000;


long freq = 35000000; //current freq
//long calibrateFreq = 124999600; //вводим реальную частоту кварца для колибровки

String serial_readline;
const int bSize = 64; //serial buffer size from desktop
char Buffer[bSize]; //serial buffer from desktop
int vin1 = 0; //Volts in ADC1
int vin2 = 0; //Volts in ADC2
float vin = 0; //Volts rounded
float readInVoltage();
//const int bSize = 64; //serial buffer size from desktop
//char Buffer[bSize]; //serial buffer from desktop
#define VIN1_ADC_PIN PA0 //ARDUINO NANO
#define VIN2_ADC_PIN PA1 //ARDUINO NANO
void setup() {
  tft.begin();
  tft.setRotation(1);
   tft.fillScreen(ILI9341_BLACK);
   tft.setTextColor(ILI9341_GREEN);
   bool i2c_found;
 Serial.begin(115200);
  
  i2c_found = si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
  if(!i2c_found)
  {
    Serial.println("Device not found on I2C bus!");
  }
  Serial.setTimeout(1);
pinMode(PA3, INPUT_PULLDOWN);
}

void loop() {

//кнопки
  


int key = analogRead(PA3);
tft.setCursor(180, 25);
  tft.print(key);
  if(key>2950&&key<3000) 
     { 
     ClockMinV=ClockMinV+10000;
      ClockMaxV=ClockMaxV-10000;
      tft.fillScreen(ILI9341_BLACK);
           }
  if(key>2700&&key<2750) 
     { 
       ClockMinV=ClockMinV-10000;
      ClockMaxV=ClockMaxV+10000;
           } 
           if(key>2500&&key<2530) 
     { 
      ClockMinV=ClockMinV+10000;
      ClockMaxV=ClockMaxV+10000;
           } 
           if(key>3250&&key<3280) 
     { 
      ClockMinV=ClockMinV-10000;
      ClockMaxV=ClockMaxV-10000;
      
           } 
          if(key>3600&&key<3630) 
     { 
      Steps=Steps-100;
      tft.fillScreen(ILI9341_BLACK);
           } 
           if(key>4050&&key<4070) 
     { 
      Steps=Steps+100;
      tft.fillScreen(ILI9341_BLACK);
           } 
Steps = max(Steps, 100);
Steps = min(Steps, 10000);
ClockMinV = max(ClockMinV, 10000);
ClockMinV = min(ClockMinV, 10000000);
ClockMaxV = max(ClockMaxV, 1000000);
ClockMaxV = min(ClockMaxV, 11000000);

//------------------------------------------------

 
//ClockOutV=ClockOutV+ClockStepV;
 memset(Buffer, 0, bSize);
   Serial.readBytesUntil('\n', Buffer, bSize);
    serial_readline = String(Buffer);
    freq = ClockStepV;
      //dds.setFrequency(freq);
      si5351.set_freq(freq*100, SI5351_CLK0);
     Serial.println(readInVoltage(),6);
    Serial.flush();
//      if (ClockOutV > ClockMaxV)
//      {
//      tft.fillScreen(ILI9341_BLACK);
//      ClockOutV = 7500000;
//      ClockMinV = 1;
//      }
    ClockStepV= constrain(ClockStepV,ClockMinV ,ClockMaxV);// Ограничиваем диапазон работы датчика посмотрев его на мониторе
    int StepDisplay = map(ClockStepV,ClockMaxV, ClockMinV, 320,0);//Преобразуем диапазон выдаваемый датчиком в 320 точек дисплея
    ClockStepV=ClockStepV+Steps;
    if (ClockStepV > ClockMaxV)
      {
      tft.fillScreen(ILI9341_BLACK);
      ClockStepV = 5000;
      }
    tft.setCursor(100, 25);
tft.print (Steps);  
     tft.drawPixel(StepDisplay, vin*30, ILI9341_GREEN);
    tft.setCursor(0, 0);
    tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);
    tft.print(ClockMinV/1000);
    tft.setCursor(50, 0);
    tft.print(vin); tft.print(" V.in");
    tft.setCursor(120, 0);
    tft.print(ClockStepV/1000); tft.print(" St");
    tft.setCursor(190, 0);
    tft.print(ClockMaxV/1000); tft.print(" KHz Max");

}
void printInfo() { //вывод информации на экран
 

  vin = readInVoltage();

}
float readInVoltage() //читаем частоту с ADC
{
  vin = 0;
  for (int i = 0; i < 12; i++)
  {
    vin1 = analogRead(VIN1_ADC_PIN);
    vin2 = analogRead(VIN2_ADC_PIN);
    vin = vin + ((((float)vin1 + (float)vin2) / 2) / 900 * 1.1);
  }
  vin = vin / 12;
  return vin;
}


  
Ответить