Обсуждаем контроллеры компании Atmel.
Ответить

Re: Atmega8 регулировка частоты и амплитуды

Ср апр 17, 2024 20:01:17

metan, Очень сомневаюсь что сможете переписать. И да: работает без ошибок и предупреждений.

Re: Atmega8 регулировка частоты и амплитуды

Ср апр 17, 2024 20:39:12

linkov1959

Добавлено after 16 minutes 36 seconds:
но изучить это не получается. Голова начинает болеть и засыпаю сразу.

Работа мозга очень энергозатратна и вызывает страдания, так мы экономим пищу и это прошито в генах с давних голодных времен.
Только сверхидеи могут заставить мозг работать без напряга. Не спрашивайте готовых решений, включайте мозг и работайте с источниками информации самостоятельно. Но сначала идея должна стать сверхидеей.

Re: Atmega8 регулировка частоты и амплитуды

Ср апр 17, 2024 22:35:05

Varlakotam писал(а):Очень сомневаюсь что сможете переписать
Никогда не понимал, что толкает людей на рассуждения о вещах, о которых они не имеют ни малейшего представления...
В любом случае дешевая попытка взять меня на понт не засчитана. У меня за плечами опыт разработки информационных систем, которые успешно работали четверть века, и объём их кода на много порядков больше, чем у этой конструкции выходного дня.

Но извольте, вот одна из функций
Оригинал:
Код:
uint8_t max_n(uint16_t* arr) {
   uint16_t max= arr[0];
   uint8_t p=0;
   for (uint8_t i = 0; i < 5; ++i)
   {
      if (arr[i] > max)
      {
         max = arr[i];
      }
   }
   
   for (uint8_t i = 0; i < 5; ++i)
   {
      if (arr[i]>=max) //
      p=i;
   }
   return p;
}


Перепись:
Код:
uint8_t max_n(uint16_t* arr) {
  uint8_t i;
  uint16_t max = arr[0];
  uint8_t p=0;
  for (i = 1; i < BITES_COUNT; ++i) {
    if (arr[i] > max) {
      max = arr[i];
      p = i;
    }
  }
  return p;
}


Но всё переписывать, это не в мою смену конечно. И еще, разработка такой балалайки крайне затруднена без постоянных проверок в железе.
Удачи!

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 07:49:30

metan, Ни в коем разе не думал поставить под сомнение Вашу профессиональную квалификацию, и тем более брать на понт. Извините пожалуйста, что так получилось. Надо было по другому написать: сомневаюсь (оставляю небольшую надежду) что возьмётесь переписывать.
metan, А Вы можете расшифровать что делает эта функция? Желательно чтоб было понятно обычному человеку)).

Добавлено after 39 minutes 20 seconds:
Ругается
Изображение

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 08:06:40

Varlakotam писал(а):расшифровать что делает эта функция
да, конечно.
Но на результат моя перепись данной функции конечно не повлияет, только на размер :)
Это поиск максимального значения в массиве, я ее сократил в два раза и привел просто в качестве примера.
Чтобы не ругалось, нужно добавить в main.h строку
Код:
#define BITES_COUNT 5

Это очень удобно, все константы размещать в заголовочном файле. Профитов тут как минимум два - все настройки и определения можно хранить и изменять в одном месте, не лазая в функции. и второе - при просмотре кода сразу ясно, что откуда берется.

И да, насколько я вижу, работа программы сильно завязана на частоту работы контроллера. С ней точно всё в порядке? Просто дискретность изменения шима в цикле формирования подергов зависит только от скорости вычислений синусов :)

Можно еще попробовать поиграться с коэффициентами k
Код:
   float k=0.65; //коэффициент для компенсации гистерезиса магнитного поля ниодимового магнита


и 60

Код:
   descr1=(freq+60)*2;//60 подгоночный коэффицинты для выбора крайних значений частоты.

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 08:51:57

metan, Да вроде в порядке. Осциллограмма не сказать что идеальная, приемлемо. Сбоев нет.
Коэффициент влияет на "качество" игры (ровный дёрг, без дрожаний и паразитных колебаний), менял когда купил магниты другого размера. На регулировку частоты и амплитуды не повлияло.

Добавлено after 2 minutes 55 seconds:
60 не менял, а в каких пределах можно менять?

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 09:56:16

Varlakotam писал(а):каких пределах можно менять?
смотрим формулу
Код:
   descr1=(freq+60)*2;//60 подгоночный коэффицинты для выбора крайних значений частоты.

freq читается из ацп, т.е. для 10 бит может принимать значения от 0 до 1024 (в крайних положениях резистора). В среднем положении 512, что в формуле даст 1144, и до этого числа будет цикл следующих вычислений.
Далее это магическое число используется в других вычислениях, в том числе в вычислении синуса. Результат (двухбайтовый) потом скармливается регистру аппаратного шима (однобайтовому). Я про это ранее написал. Само по себе это очень плохо. Что там в итоге будет выводиться в виде шима, и что по-хорошему туда должно выводиться, мне сложно понять.

Я бы начал вообще с обнуления коэффициента 60, не исключая необходимости в дальнейшем попробовать и иные коэффициенты вместо удвоения.

Вот табличка, поиграйтесь со значениями. Зеленым выделены регулировки (от 0 до 1024)
coil.zip
(6.35 KiB) Скачиваний: 30

Но значения, которые грузятся в шим (OCR) насколько я понимаю, вообще не влияют на частоту. Они влияют на скважность сигнала, т.е. на характер подергов. На частоту влияет только descr и k, а также время выполнения вычислений (что тоже очень плохо)

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 12:08:40

metan писал(а):для 10 бит может принимать значения от 0 до 1024
до 1023.

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 12:11:36

metan, Попробовал от 10 до 120, этот коэффициент сужает (при большом значении) и расширяет (при маленьком значении) диапазон регулировки частоты. Нелинейность регулировки так-же осталась.

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 16:15:40

о какой линейности можно говорить, если твоя формула descr1=(freq+60)*2 напрочь убивает линейность переменного резистора?
и переменная descr2 на хрен не нужна, так как она равна descr1. поэтому во всех местах можно заменить descr2 на descr1.
частота изменяется временем выполнения циклов for для расчета значений синуса. чем больше descr1, тем дольше формируется каждый кусочек синуса.

Добавлено after 1 hour 58 minutes 5 seconds:
metan писал(а):Результат (двухбайтовый) потом скармливается регистру аппаратного шима (однобайтовому). Я про это ранее написал.
результат - однобайтовый.
t=sin(1.57/descr1*i)*Amp;
Amp не превышает 255, а синус не может быть больше 1.
хотя, в военное время синус может достигать четырёх.

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 17:16:42

Starichok51, С descr понятно, заменю. С формулой что делать? Получается она круто возрастающая. Вот так можно descr1=(freq+240)/2? Получается пологая.

Добавлено after 45 minutes 57 seconds:
о какой линейности можно говорить, если твоя формула descr1=(freq+60)*2 напрочь убивает линейность переменного резистора?
Вот именно эту подсказку я ждал с самого начала! Всё нормально, немного поэкспериментирую, вверх- вниз. Но уже то что хотел получилось.

Добавлено after 1 minute 31 second:
Starichok51, metan, огромнейшее спасибо, помогли!

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 17:45:03

делить нельзя. тогда получится маленькое число и большая частота.
следует заметить, что чем меньше freq, тем выше частота.
возможно, ты ожидал, что чем больше напряжение на входе АЦП, тем частота выше, а оказывается, что всё наоборот.
то есть, вместо линейного (пропорционального) изменения частоты получаем обратную пропорциональность.
если ты хочешь с увеличением напряжения на входе АЦП увеличивать частоту, то нужно брать обратную величину от freqи потом добавлять нужное смещение.
посмотрим, что получается у тебя при максимуме и минимуме:
1023 * 2 + 120 = 2166,
0 * 2 + 120 = 120.
допустим, мы хотим сохранить эти пределы регулировки частоты.
для получения обратной величины на 0 делить нельзя.
поэтому придется сразу прибавить какую-то добавку к нулю.
составим систему уравнений:
Х / (0 + У ) = 2166,
Х / (1023 + У) = 120.
откуда Х = 2166 * У.
подставляем Х во второе уравнение:
2166 * У / (1023 + У) = 120.
решаем уравнение.
2166 * У = 1023 * 120 + 120 * У,
2046 * У = 122760,
У = 122760 / 2046 = 60,
Х = 2166 * 60 = 129960.
итоговая формула получится:
descr1 = 129960 / (freq + 60).
проверяем:
129960 / (0 + 60) = 2166,
129960 / (1023 + 60) = 120.
в среднем положении движка:
129960 / (512 + 60) = 227.
видим, что линейность по частоте мы все равно не получили.
в первой половине "шкалы" мы получили увеличение частоты в 2166/227 = 9,54 раза, а во второй половине - в 227/120 = 1,89 раза.
но все равно, ты можешь попробовать с моей формулой
descr1 = 129960 / (freq + 60)
и посмотреть, что у тебя получится с регулировкой частоты.
если не понравится, будем пробовать придумать другую формулу.

Добавлено after 14 minutes 37 seconds:
а есть еще такой вариант - взять "логарифмический" переменный резистор, у которого сопротивление растет сначала медленно, а потом всё быстрее и быстрее.
тогда и с существующей формулой линейность по частоте значительно увеличится.

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 18:35:21

Starichok51, Насчет напряжение ноль- частота максимальная я конечно знаю, всё что со стороны железа мне понятно. Логарифмические переменники не устраивают своей ценой.

Добавлено after 5 minutes 33 seconds:
descr1 = 129960 / (freq + 60) классно!!! лучшего и не надо! Спасибо за помощь, и понятные разъяснения!

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 18:41:52

вот тебе еще ЛУЧШЕ!!!

а вообще, по моему мнению, нужна не линейность по частоте, а равномерное изменение частоты от угла поворота оси резистора.
это по аналогии с частотами музыкальных нот.
сейчас изменение частоты в 2166 / 120 = 18,05 раз.
равномерность изменения достигается экспоненциальной функцией ("е" в степени х).
возьмем полное изменение частоты в 20 раз - это соответствует с высокой точностью "е" в кубе.
"е" в степени 0 равно 1.
откуда получаем такую формулу:
descr1 = 120 * exp(freq / 341).
так как 1023 / 341 = 3, то в конце "шкалы" получаем точно "е" в кубе.
таким образом при нуле на входе АЦП имеем
descr1 = 120,
а при максимуме имеем
descr1 = 120 * ("е" в кубе) = 2400.
а в середине "шкалы" имеем
descr1 = 120 * ("е" в степени 512/341) = 538.
2400/538 примерно равно 538/120 и равно 4,46 раз.
то есть частота изменяется РАВНОМЕРНО.

я думаю, по этой формуле
descr1 = 120 * exp(freq / 341)
регулировка частоты тебе должна еще больше понравиться.

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 19:29:17

Starichok51, Да! Этот вариант лучше. :) Хороший сегодня день)))

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 20:06:24

Какую бы формулу не применили, "потеряете" значения частоты между двумя табличными значениями. Будет разница между значениями в начале таблицы и значениями в конце таблицы.

Попробуйте DDS: Direct Digital Synthesis DDS with microcontroller.
(Сегодня портировал код для другой подобной задачи как тестовой в PIC и случайно наткнулся на ту же тему здесь).

Решение с DDS (см. шаг.) напр. 10 раза "перед" реализацией частоты обхода таблицы через таймера (там n/OCR2A - в знаменатель, сл. нелинейно). А в DDS шаг линейный. Оба метода реализованы по ссылке выше.

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 20:29:47

veso74, во-первых, тут нет "табличных" значений.
во-вторых, тут нет генерации заданной частоты, чтобы применить DDS.
если бы ты внимательно читал тему и последние мои сообщения, то увидел бы, что частота задается временем выполнения значений синуса для каждого участка синусной формы сигнала.
так что, ты своими предложениями попал пальцем в небо...

Добавлено after 3 minutes 8 seconds:
Varlakotam писал(а): Этот вариант лучше.
а ты уже проверил?

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 20:31:07

Прошу прощения. Сообщение было в теме, а не в сообщении и решении выше.
(с языковым барьером: не на 100% понимаю полемику в теме).

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 20:40:42

Starichok51, Да, сразу же проверил. Это именно то что я хотел

Re: Atmega8 регулировка частоты и амплитуды

Чт апр 18, 2024 21:41:49

ну, тогда поздравляю нас с достигнутым успехом!!!
позволю себе немножко похвастаться. я же радиоинженер, а не поросячий хвостик...
veso74, я не учел, что ты из Болгарии. но всё равно надо быть внимательнее к написанному.
тут такая ерунда, что частота определяется довольно большим процессорным временем функции вычисления синуса.
а потенциометр задает количество шагов вычисления синуса. чем больше шагов, тем ниже частота.
Ответить