Генератор качающейся частоты с АЦП
- Войдите на сайт для отправки комментариев
Чт, 07/05/2020 - 14:38
Здравствуйте
Делаю ГКЧ с АЦП и выводом через сериал. Возникла проблема. Скорость установки и вывода частоты не устраивает. Видел измерители АЧХ фильтров которые по 1 герцу диапазон 100кгц до 30 мегагерц перебирали за 2 секунды. Выбрал микросхему si5351 микроконтроллер stm32f103c8t6. Подключение по порту 115200. В чем моя ошибка?
//////////////////////////////////////////////////////////////////////////////
// Copyright©2016.JA2GQP.All rights reserved.
// si5351a PLL test
// 2017/5/20
// JA2GQP
//---------------------------------------------------------------------------
//
//AFIO_BASE->MAPR|=(1<<8)|(1<<6); //tim 1 && tim 2 Partial remap
// i2c_master_enable(I2C1, I2C_REMAP); //SDA PB9, SCL PB8
// stm32f103 si5351a Arduino nano(UNO)
// PB6(SCL1) ------ SCL ------ A5
// PB7(SDA1) ------ SDA ------ A4
// 3V3(3.3V) ------ VIN ------ 5V
// GND ------ GND ------ GND
//////////////////////////////////////////////////////////////////////////////
//---------- include Files ---------------
#include "si5351a2.h"
//---------- Initialization Program ----------------------
const int analogInputPin = PA0;
void setup() {
pinMode(analogInputPin, INPUT_ANALOG);
Serial.begin(115200);
Serial.setTimeout(10);
i2c_master_enable(I2C1, I2C_REMAP); //SDA PB9, SCL PB8
Wire.begin();
Si5351_write(XTAL_LOAD_C,0x80); //Crystal Load Capasitance=8pF
//si5351aSetFrequency2(78000000L); //CLK2
}
//---------- Main program ---------------------------------
void loop() {
if (Serial.available()){
int chteniesporta = 0;
chteniesporta = Serial.parseInt();
if (chteniesporta > 69000)
{
si5351aSetFrequency(chteniesporta);
Serial.print(analogRead(analogInputPin));
}
}
}
Библиотека
Скрипт Python
import serial import time Vcc = 3.3; constant = 4095.0; ser = serial.Serial(port = 'COM6', baudrate = 115200, writeTimeout = 0) while True: for i in range(89000000,90100000,10): ser.write(("{0}".format(i)).encode()) time.sleep(0.020) value = (ser.read_all()).decode().split("\r\n") volt = (Vcc / constant) * float(value[0]); print("{0} {1}".format(i, volt)) ser.close()ingfa, ну во-первых команда парсинт выполняется долго, таймаут по-умолчанию 1000мс . Во-вторых так вообще не делают. Через UART отсылают все данные для качания (нач. частота, кон. частота, шаг). И программа в мк начинает выполнять задачу.
по 1 герцу диапазон 100кгц до 30 мегагерц перебирали за 2 секунды
Ничего, что если сложить 1 период каждой частоты с таким шагом, то получится больше 5 секунд?
ingfa, ну во-первых команда парсинт выполняется долго, таймаут по-умолчанию 1000мс . Во-вторых так вообще не делают. Через UART отсылают все данные для качания (нач. частота, кон. частота, шаг). И программа в мк начинает выполнять задачу.
А как получить все данные измеренного напряжения с детектора связав их со значениями частоты? Применить другой способ передачи в компьютер FT245 или wifi, может есть способ проще? Как передать два значения использовать массив?
Да 5 секунд действительно только в идеале.
ingfa, ну для начала посмотреть как это сделано в серьёзных приборах. Типа NWT7. Исходники там есть. В идеале вообще сделать обмен своего девайса через UART по протоколу NWT, описание команд управления там тоже есть. Тогда можно будет использовать его программу. Я поступил проще -сделал сам NWT7 :)
Да я видел этот прибор. смотрел исходники. Ничего не понял так как новичек в программировании. Расскажите пожалуйста в кратце, как бы вы сделали правильно,если ни трудно, а я почитаю мануалы и разберусь со своим велосипедом, цель моя обучение.
ingfa, вам лучше повторить готовый проект ГКЧ на si5351, их в инете полно разных, причём даже под ардуино есть. Тыц.
Я же говорю хочу сделать то что понимаю. Чужого ни нужно. хочу научиться программировать. Поэтому мне нужны ответы на вопросы как залить две частоты одновременно и как вывести измеренное значение связанное с частотой. Что б не тормазило.
Я понимаю как то прибор работает, супергетеродинная схема si5351 выдает две частоты, основную на которой идет измерение и минус 455кгц. детоктор на ad8307 детектирует 455 кгц и выдает на ацп. далее контролер каким то образом отдает измеренное напряжение на
ком порт компьютера или через блутуч или через преобразователь ttl usb. Но например разработчик пишет подать на вход r 10 и получишь 10 измеренных значений. А где это в коде я не вижу и как это связанно со значение частоты я не понимаю.
Чужого ни нужно. хочу научиться программировать. Поэтому мне нужны ответы на вопросы как залить две частоты одновременно и как вывести измеренное значение связанное с частотой. Что б не тормазило.
А то что кто-то тут сейчас сядет и будет по твоему индивидуальному заказу программировать за тебя (чтобы ты научился программировать) - это не чужое уже. Все свои.
Чужого ни нужно. хочу научиться программировать.