Очень часто у радиолюбителей возникает необходимость измерить характеристики контура или кварца, данный приборчик собирается за 10 минут на макетке.
И как всегда немножко видео работы прибора )))
https://youtu.be/Hxx7feANj9I
Простой измеритель АЧХ на STM32F103
-
- Сообщения: 12
- Зарегистрирован: 18 дек 2020, 12:52
- Моё имя: Василий
- Поблагодарили: 7 раз
- RV3MP
- Сообщения: 173
- Зарегистрирован: 21 окт 2019, 09:51
- QTH: Ярославль
- Благодарил (а): 22 раза
- Поблагодарили: 35 раз
Re: Простой измеритель АЧХ на STM32F103
Забавная игрушка.
Продолжение будет?
А моя игрушка сломалась. Тач крякнул на половине экрана. Надо в порядок приводить.
Тоже кварцы меряет и еще... много чего делает...
viewtopic.php?f=7&t=49
Продолжение будет?
А моя игрушка сломалась. Тач крякнул на половине экрана. Надо в порядок приводить.
Тоже кварцы меряет и еще... много чего делает...
viewtopic.php?f=7&t=49
-----------------------------
Михаил
Михаил
-
- Сообщения: 12
- Зарегистрирован: 18 дек 2020, 12:52
- Моё имя: Василий
- Поблагодарили: 7 раз
Re: Простой измеритель АЧХ на STM32F103
Продолжение будет. Исходник сегодня добавлю как доберусь до компа.
-
- Сообщения: 12
- Зарегистрирован: 18 дек 2020, 12:52
- Моё имя: Василий
- Поблагодарили: 7 раз
Re: Простой измеритель АЧХ на STM32F103
Как и обещал исходный код для 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;
}