Автор Тема: Опорник от Владимир_К  (Прочитано 60231 раз)

0 Пользователей и 8 Гостей просматривают эту тему.

Core

  • Гость
Re: Опорник от Владимир_К
« Ответ #360 : Июнь 29, 2021, 12:39:37 pm »
Владимир, разгребу текущие задачи, вернусь к этому проекту обязательно.

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: Опорник от Владимир_К
« Ответ #361 : Сентябрь 14, 2024, 11:30:34 am »
Появился некоторый интерес к синтезатору, поэтому выкладываю исходник программы и схему. Схему надо рассматривать творчески. Она делалась для себя и очень давно, поэтому неточностей там может быть достаточно. Схема самого трансивера вообще полностью переделана и на нее не надо обращать внимания. Все в одной папке и мне не хотелось что-то из нее выбрасывать и плодить еще папки. Тем более, что все это на CD.
Кратко об особенностях синтезатора:
- синтезатор прямого синтеза на Si5351A;
- индикатор частоты светодиодный со статической индикацией, схема индикатора от Тарасова UT2FW;
- SW-метр в виде линейки светодиодов (8 шт);
- Переключатель диапазонов галетный, принцип примерно такой-же как у Тарасова, но выполнен на регистре.
- Кнопки нефиксируемые, поэтому для индикации, какая кнопка была нажата, возле каждой кнопки расположен светодиод, индицирующий что функция включена. повторное нажатие выключает функцию;
Файл main.zip - НЕХ-файл прошивки. Проект на Си, среда AVR Studio 4.19.

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: Опорник от Владимир_К
« Ответ #362 : Сентябрь 14, 2024, 12:57:47 pm »
Небольшое дополнение. Программа не будет работать без подключения Si5351A, так как по шине I2C направляется запрос к Сишке. Если ее нет, нет и ответа от микросхемы. Для тестирования без Si5351A в программе в функции управления сишкой, надо вставить возврат из функции (return:), тогда после перехода в функцию, будет осуществлен возврат в основное тело программы.
В файле Si5351A.c изменить строки, вот так:

void si5351aSetFrequency(unsigned long z) // Функция управления частотой frequensy -параметр переданный в вызове функции из main
{
return;
   uint32_t pllFreq;                 // Определение переменных: pllFreq, XTALFreq, l, f, mult, num, denom, divider
   uint32_t xtalFreq = XTAL_FREQ;
   uint32_t l;
   float f;
   uint8_t mult;
   uint32_t num;
   uint32_t denom;
   uint32_t divider;
   if (z<11000000)

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 314
Re: Опорник от Владимир_К
« Ответ #363 : Сентябрь 14, 2024, 02:08:48 pm »
 
Появился некоторый интерес к синтезатору
Спасибо,что оживили тему!  123123

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 314
Re: Опорник от Владимир_К
« Ответ #364 : Сентябрь 16, 2024, 07:59:02 am »
Дальше, вот тут:
//if (_band<4) y_1=y_1+pch;
 // else y_1 = y_1-pch;
 y_1 = y_1+pch;
В зависимости от номера диапазона, ПЧ прибавляется или наоборот вычитается.
Владимир,в выложенном Вами исходнике не нашел этих строк,но там есть следующее:

/******************** Вычисление частоты  **************/

void sub_freg()                   

 
{
frequency =frequency_t;
 if (rit_1==0)                 

{
   //frequency =frequency_t;
   frequency=frequency+chagi*bufEnc*abs(bufEnc);
   
   if (frequency > (freq_max[(int)_band]))    frequency=(freq_min[(int)_band]);
   if (frequency < (freq_min[(int)_band]))    frequency=(freq_max[(int)_band]);
      frequency_t=frequency;
      }
 else 
 {
          rit=rit+chagi*bufEnc;
              frequency=frequency+rit;
      }         
      }
Я правильно понимаю,что править нужно здесь,чтоб частота на выходе SI5351 была Fприема+Fпч?

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: Опорник от Владимир_К
« Ответ #365 : Сентябрь 16, 2024, 11:41:59 am »
Я правильно понимаю,что править нужно здесь,чтоб частота на выходе SI5351 была Fприема+Fпч?
Нет, не здесь. Что-то я не нахожу строк, которые Вы здесь выложили. У Вас, подозреваю, не тот исходник. Вот те строки, которые в Вашем сообщении выделены как цитата, откуда они? Их нет в исходнике, который я выложил в 361 сообщении. Разархивируйте исходник, откройте AVR Studio 4.19. Зайдите в меню, закройте проект, который сейчас открыт - Project - Close Progect. Затем откройте тот, что сбросил в 361. В проекте откройте файл si5351a.c.
В функции
void si5351aSetFrequency(unsigned long z)
найдите строки:
if (z<11000000)
   z=z+pch;
else z=z-pch;
   z=z;

Вот здесь условие, если z<11000000 (if (z<11000000)), то есть переданный в функцию аргумент (frequency), в самой функции ему присвоено обозначение z, проверяется его значение и если оно меньше 11000000, то частота ПЧ прибавляется, иначе (else) вычитается. Для того, чтобы частота всегда прибавлялась, сделайте вот так в этих строках:
//if (z<11000000)
    z=z+pch;
//else z=z-pch;
   z=z;
То есть, перед строками, которые надо убрать, ставится двойное //. Это называется "закомментировать" строку. Компилятор эти строки проигнорирует. Таким образом останется строка
z=z+pch; то есть, всегда ПЧ будет прибавлятся к z, а z, как я выше писал, есть не что иное как frequency, аргумент, переданный в функцию при ее вызове.
Ну и я бы не рекомендовал сейчас что-то править. Соберите схему, хотя бы макет, запустите в таком виде. Затем можно вносить правку и сразу проверять в "железе". Вообще желательно, делать правку хотя бы одной строки, компилировать (при компиляции, если будут ошибки в синтаксисе, компилятор об этом сообщит). Затем прошиваете и проверяете работу. Если что-то пойдет не так, сразу можно вернуться. Если сделать сразу много правок, потом трудно разобраться, где допущена ошибка. Синтаксис компилятор проверит, но он не проверит, если ошибка будет в алгоритме программы.
Кроме того, этот синтезатор выдает частоты, соответствующие частотам гетеродина, а у Вас по схеме Игоря, там есть и деление и пр. Поэтому пока ничего не правьте, запускайте пока так, все равно потом много чего надо изменять.
И еще, в 361 сообщении также выложен НЕХ-файл (main.zip) прошивки. Его Вы сразу можете программатором зашить в контроллер и проверить работоспособнось. Предварительно извлеките из архива.
Если Вы делаете правку, потом компилируете, компилятор создает новый НЕХ-файл. Он находится в папке default проекта - main.hex.
Еще заметил - строка z=z: совершенно лишняя. Просто удалите ее. Не понял зачем я ее воткнул..
 
« Последнее редактирование: Сентябрь 16, 2024, 11:54:32 am от Владимир_К »

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 314
Re: Опорник от Владимир_К
« Ответ #366 : Сентябрь 16, 2024, 02:03:50 pm »
Понял,благодарю!Если что-то меняю,делаю для себя пометки о том,когда и что поменял и сохраняю в разные папки,чтоб не запутаться.Сделаю как Вы сказали  123123 1yep

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: Опорник от Владимир_К
« Ответ #367 : Сентябрь 16, 2024, 02:23:14 pm »
Если что-то меняю,делаю для себя пометки о том,когда и что поменял
Эти пометки Вы можете делать в тексте программы, для этого, в строке программного кода, ставите две косые черты // и дальше пишете свой комментарий, компилятор на него внимание не обращает. Но, комментарий должен быть в одной строке, если он переносится на другую строку, он также должен начинаться с двух косых черт.
Также все что находится между  /* какой-то текст */ косая черта и знак умножения (звездочка) и заканчивается */ будет проигнорировано. Кроме того, редактор текста, все что игнорируется компилятором, выделяет зеленым цветом.
Строки текста программы желательно не удалять, а выделять знаком комментарий, т.е. двумя чертами, тогда легко будет восстановить, убрав комментарий.
Смотрите на мой текст программы, как оно все выглядит. Если что не понятно, спрашивайте. По образцу легче понять логику...
« Последнее редактирование: Сентябрь 16, 2024, 02:24:46 pm от Владимир_К »

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 314
Re: Опорник от Владимир_К
« Ответ #368 : Сентябрь 16, 2024, 02:25:38 pm »
Эти пометки Вы можете делать в тексте программы, для этого, в строке программного кода, ставите две косые черты // и дальше пишете свой комментарий, компилятор на него внимание не обращает. Но, комментарий должен быть в одной строке, если он переносится на другую строку, он также должен начинаться с двух косых черт.
Также все что находится между  /* какой-то текст */ косая черта и знак умножения (звездочка) и заканчивается */ будет проигнорировано. Кроме того, редактор текста, все что игнорируется компилятором, выделяет зеленым цветом.
Строки текста программы желательно не удалять, а выделять знаком комментарий, т.е. двумя чертами, тогда легко будет восстановить, убрав комментарий.
Да-да,все так и делаю! 123123 1yep

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 314
Re: Опорник от Владимир_К
« Ответ #369 : Сентябрь 16, 2024, 02:30:11 pm »
Владимир,а такой вариант управления индикаторами не рассматривали?

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: Опорник от Владимир_К
« Ответ #370 : Сентябрь 16, 2024, 03:22:26 pm »
Нет. Но это не сложно, практически то же самое. Если спаяете такой индикатор, программу подкорректирую. Просто у меня была пара готовых от Тарасова, их и применял. Надо бы попробовать индикатор на базе MAX7921, но никак руки не доходят. Его надо проверить на наличие помех. Он поменьше раэмером, и плата  проще. То есть, я бы с ним пробовал.

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 314
Re: Опорник от Владимир_К
« Ответ #371 : Ноябрь 01, 2024, 03:27:32 pm »
Владимир,добрый день!Собрал индикатор и почти собрал макетку управления.Появились вопросы по кнопкам.Нашел RIT дважды.Могли бы Вы написать инструкцию по назначению кнопок?Может быть какие-то из них имеют двойной функционал или функции,не подписанные на схеме? 123123

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 314
Re: Опорник от Владимир_К
« Ответ #372 : Ноябрь 01, 2024, 03:50:28 pm »
И еще вопрос.Нужно ли где-то в исходниках прописывать частоту опоры SI5351? 123123

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: Опорник от Владимир_К
« Ответ #373 : Ноябрь 01, 2024, 06:14:28 pm »
Появились вопросы по кнопкам.Нашел RIT дважды.Могли бы Вы написать инструкцию по назначению кнопок?
Добрый день! Там все просто. Каждая кнопка выполняет только одну функцию. Кнопки подключены к делителю, таким образом, нажатие кнопки выдает определенное напряжение, которое подается на вход аналого-цифрового преобразователя процессора. Через определенные промежутки времени (уже не помню, через сколько точно, примерно 4-5 миллисекунд) процессор проверяет, нажата ли какая-нибудь кнопка. Если ни одна кнопка не нажата, напряжение на входе ADC процессора равно напряжению питания, т.е. около 5 вольт. Тут одно надо понимать, ADC преобразовывает напряжение на входе в цифру. Напряжению 5 вольт соответствует 1024.
Проверка нажатия вот строки (файл Radio_76.c)
 if (AdcBuf>950)                                               // Кнопка не нажата - выходим
 {
    n=1;
 
    }
 
    }
т.е. если после преобразования переменная AdcBuf меньше 950 (950 взято для запаса, вдруг напряжение по какой-то причине просядет и будет не 1024, а меньше), то программа начнет отрабатывать алгоритм нажатия кнопки и, какая именно нажата. Если не нажата, программа возвращается в основной цикл.
Вот строки, где определяется какая кнопка нажата:
  if      (Adc_1 < 250)  l=0;          //AGC, т.е. если Adc меньше 250, то l=0 и т.д.
  else if (Adc_1 < 500)   l=1;         //RIT
  else if (Adc_1 < 800)    l=2;        //Att
 
 else l=3;   

Таким образом, в программе, фактически задействованы только три кнопки - AGC (кнопка переключения АРУ - ручная регулировка или авт.), RIT- кнопка включения расстройки. При этом частота приема будет указана на экране, частота передачи будет той, которая была до нажатия кнопки RIT. И последняя кнопка - кнопка включения аттенюатора.
Все эти кнопки без фиксации. При нажатии кнопки функция включается, при повторном - отключается.
Напряжения, при котором включается та или иная фуннкция (но переведенные в цифру) должны соответствовать напряжениям, которые выдает Ваш делитель. То есть, тут надо учитывать точность резисторов. Ну например, при нажатии какой либо кнопки у Вас напряжение на входе ADC равно 2,5 вольта, это 1024*2,5/5,0, т.е. 512. Условие пишем так:
if      (Adc_1 < 530)  l=0;          //AGC
почему именно 530, а не 512. Это вроде запаса, о котором я выше упомянул. Количество кнопок можно добавить, наример в одном варианте их было 12 штук. Но там надо тщательнее измерять. Обычно напряжение выбираются из ряда U1=0,5 вольта, U2=0,5*1,5, U3=0,5*1,5^2 и т.д. Т.е геометрическая прогрессия, где 1,5 коэффициент, который надо выбрать таким образом, чтобы напряжение от первой кнопки было 0,5 вольта, от последней - 4,0 примерно. Т.е. в зависимости от количества, больше кнопок - меньше коэффициент. Можно и проще, каждая кнопка дает напряжение, например на 0,5 вольта больше предыдущей.
На схеме нарисованы 7 кнопок, в программе задействовано кажется 6 (это я имею ввиду собранный и работающий вариант трансивера. Программу мог перепутать. Пока не будем искать соответствие, оно не важно, уточним потом.
Нужно ли где-то в исходниках прописывать частоту опоры SI5351?
Да, конечно. Она прописана в файле Radio_76.c, вот строка:
#define xtal   26691697         // Частота кварца платы приемника
При вызове функции, которая управляет сишкой, этот параметр передается, вот так:
 si5351aSetFrequency(frequency+pch_1, xtal);
где указана рабочая частота - frequency, к ней прибавляется частота ПЧ - pch_1 и передается частота кварца - xtal. Частоту кварца, в принципе, можно указать где угодно. Компилятор найдет.. Но все же, надо придерживаться какого -то порядка. Если, генерируемая частота будет отличаться от нужной, значит кварц генерит другую частоту и цифру в программе надо скорректировать. После прогрева, измеряете. Например если частота, которую выдает сишка, больше на 10 процентов, чем нужно, значит кварц выдает другую частоту, чем прописано в программе и, вот эту частоту теперь и надо записать в программе, т.е. увеличить именно на 10 процентов.
Я примеры взял из первой попавшейся программы, может у Вас другой исходник (уже не помню какой). Короче поищите в своем исходнике, потом, ежели что, уточним.

« Последнее редактирование: Ноябрь 01, 2024, 06:18:41 pm от Владимир_К »

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: Опорник от Владимир_К
« Ответ #374 : Ноябрь 01, 2024, 06:21:49 pm »
Да, еще. Выше в этой теме, есть диагностическая программа для проверки индикатора. Коль Вы его собрали, можете проверить работу..