Atmega8 регулировка частоты и амплитуды
-
Varlakotam
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб фев 02, 2019 17:15:10
Re: Atmega8 регулировка частоты и амплитуды
metan, Очень сомневаюсь что сможете переписать. И да: работает без ошибок и предупреждений.
- Реклама
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Atmega8 регулировка частоты и амплитуды
[uquote="Varlakotam",url="/forum/viewtopic.php?p=4568891#p4568891"]linkov1959
Добавлено after 16 minutes 36 seconds:
но изучить это не получается. Голова начинает болеть и засыпаю сразу.[/uquote]
Работа мозга очень энергозатратна и вызывает страдания, так мы экономим пищу и это прошито в генах с давних голодных времен.
Только сверхидеи могут заставить мозг работать без напряга. Не спрашивайте готовых решений, включайте мозг и работайте с источниками информации самостоятельно. Но сначала идея должна стать сверхидеей.
Добавлено after 16 minutes 36 seconds:
но изучить это не получается. Голова начинает болеть и засыпаю сразу.[/uquote]
Работа мозга очень энергозатратна и вызывает страдания, так мы экономим пищу и это прошито в генах с давних голодных времен.
Только сверхидеи могут заставить мозг работать без напряга. Не спрашивайте готовых решений, включайте мозг и работайте с источниками информации самостоятельно. Но сначала идея должна стать сверхидеей.
Re: Atmega8 регулировка частоты и амплитуды
Никогда не понимал, что толкает людей на рассуждения о вещах, о которых они не имеют ни малейшего представления...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;
}
Удачи!
-
Varlakotam
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб фев 02, 2019 17:15:10
Re: Atmega8 регулировка частоты и амплитуды
metan, Ни в коем разе не думал поставить под сомнение Вашу профессиональную квалификацию, и тем более брать на понт. Извините пожалуйста, что так получилось. Надо было по другому написать: сомневаюсь (оставляю небольшую надежду) что возьмётесь переписывать.
metan, А Вы можете расшифровать что делает эта функция? Желательно чтоб было понятно обычному человеку)).
Добавлено after 39 minutes 20 seconds:
Ругается

metan, А Вы можете расшифровать что делает эта функция? Желательно чтоб было понятно обычному человеку)).
Добавлено after 39 minutes 20 seconds:
Ругается
Re: Atmega8 регулировка частоты и амплитуды
да, конечно.Varlakotam писал(а):расшифровать что делает эта функция
Но на результат моя перепись данной функции конечно не повлияет, только на размер
Это поиск максимального значения в массиве, я ее сократил в два раза и привел просто в качестве примера.
Чтобы не ругалось, нужно добавить в main.h строку
Код: Выделить всё
#define BITES_COUNT 5
И да, насколько я вижу, работа программы сильно завязана на частоту работы контроллера. С ней точно всё в порядке? Просто дискретность изменения шима в цикле формирования подергов зависит только от скорости вычислений синусов
Можно еще попробовать поиграться с коэффициентами k
Код: Выделить всё
float k=0.65; //коэффициент для компенсации гистерезиса магнитного поля ниодимового магнита
Код: Выделить всё
descr1=(freq+60)*2;//60 подгоночный коэффицинты для выбора крайних значений частоты.
- Реклама
-
Varlakotam
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб фев 02, 2019 17:15:10
Re: Atmega8 регулировка частоты и амплитуды
metan, Да вроде в порядке. Осциллограмма не сказать что идеальная, приемлемо. Сбоев нет.
Коэффициент влияет на "качество" игры (ровный дёрг, без дрожаний и паразитных колебаний), менял когда купил магниты другого размера. На регулировку частоты и амплитуды не повлияло.
Добавлено after 2 minutes 55 seconds:
60 не менял, а в каких пределах можно менять?
Коэффициент влияет на "качество" игры (ровный дёрг, без дрожаний и паразитных колебаний), менял когда купил магниты другого размера. На регулировку частоты и амплитуды не повлияло.
Добавлено after 2 minutes 55 seconds:
60 не менял, а в каких пределах можно менять?
Re: Atmega8 регулировка частоты и амплитуды
смотрим формулуVarlakotam писал(а):каких пределах можно менять?
Код: Выделить всё
descr1=(freq+60)*2;//60 подгоночный коэффицинты для выбора крайних значений частоты.
Далее это магическое число используется в других вычислениях, в том числе в вычислении синуса. Результат (двухбайтовый) потом скармливается регистру аппаратного шима (однобайтовому). Я про это ранее написал. Само по себе это очень плохо. Что там в итоге будет выводиться в виде шима, и что по-хорошему туда должно выводиться, мне сложно понять.
Я бы начал вообще с обнуления коэффициента 60, не исключая необходимости в дальнейшем попробовать и иные коэффициенты вместо удвоения.
Вот табличка, поиграйтесь со значениями. Зеленым выделены регулировки (от 0 до 1024) Но значения, которые грузятся в шим (OCR) насколько я понимаю, вообще не влияют на частоту. Они влияют на скважность сигнала, т.е. на характер подергов. На частоту влияет только descr и k, а также время выполнения вычислений (что тоже очень плохо)
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Atmega8 регулировка частоты и амплитуды
до 1023.metan писал(а):для 10 бит может принимать значения от 0 до 1024
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
-
Varlakotam
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб фев 02, 2019 17:15:10
Re: Atmega8 регулировка частоты и амплитуды
metan, Попробовал от 10 до 120, этот коэффициент сужает (при большом значении) и расширяет (при маленьком значении) диапазон регулировки частоты. Нелинейность регулировки так-же осталась.
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Atmega8 регулировка частоты и амплитуды
о какой линейности можно говорить, если твоя формула descr1=(freq+60)*2 напрочь убивает линейность переменного резистора?
и переменная descr2 на хрен не нужна, так как она равна descr1. поэтому во всех местах можно заменить descr2 на descr1.
частота изменяется временем выполнения циклов for для расчета значений синуса. чем больше descr1, тем дольше формируется каждый кусочек синуса.
Добавлено after 1 hour 58 minutes 5 seconds:
t=sin(1.57/descr1*i)*Amp;
Amp не превышает 255, а синус не может быть больше 1.
хотя, в военное время синус может достигать четырёх.
и переменная descr2 на хрен не нужна, так как она равна descr1. поэтому во всех местах можно заменить descr2 на descr1.
частота изменяется временем выполнения циклов for для расчета значений синуса. чем больше descr1, тем дольше формируется каждый кусочек синуса.
Добавлено after 1 hour 58 minutes 5 seconds:
результат - однобайтовый.metan писал(а):Результат (двухбайтовый) потом скармливается регистру аппаратного шима (однобайтовому). Я про это ранее написал.
t=sin(1.57/descr1*i)*Amp;
Amp не превышает 255, а синус не может быть больше 1.
хотя, в военное время синус может достигать четырёх.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
-
Varlakotam
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб фев 02, 2019 17:15:10
Re: Atmega8 регулировка частоты и амплитуды
Starichok51, С descr понятно, заменю. С формулой что делать? Получается она круто возрастающая. Вот так можно descr1=(freq+240)/2? Получается пологая.
Добавлено after 45 minutes 57 seconds:
[uquote="Starichok51",url="/forum/viewtopic.php?p=4569998#p4569998"]о какой линейности можно говорить, если твоя формула descr1=(freq+60)*2 напрочь убивает линейность переменного резистора?[/uquote] Вот именно эту подсказку я ждал с самого начала! Всё нормально, немного поэкспериментирую, вверх- вниз. Но уже то что хотел получилось.
Добавлено after 1 minute 31 second:
Starichok51, metan, огромнейшее спасибо, помогли!
Добавлено after 45 minutes 57 seconds:
[uquote="Starichok51",url="/forum/viewtopic.php?p=4569998#p4569998"]о какой линейности можно говорить, если твоя формула descr1=(freq+60)*2 напрочь убивает линейность переменного резистора?[/uquote] Вот именно эту подсказку я ждал с самого начала! Всё нормально, немного поэкспериментирую, вверх- вниз. Но уже то что хотел получилось.
Добавлено after 1 minute 31 second:
Starichok51, metan, огромнейшее спасибо, помогли!
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Atmega8 регулировка частоты и амплитуды
делить нельзя. тогда получится маленькое число и большая частота.
следует заметить, что чем меньше 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:
а есть еще такой вариант - взять "логарифмический" переменный резистор, у которого сопротивление растет сначала медленно, а потом всё быстрее и быстрее.
тогда и с существующей формулой линейность по частоте значительно увеличится.
следует заметить, что чем меньше 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:
а есть еще такой вариант - взять "логарифмический" переменный резистор, у которого сопротивление растет сначала медленно, а потом всё быстрее и быстрее.
тогда и с существующей формулой линейность по частоте значительно увеличится.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
-
Varlakotam
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб фев 02, 2019 17:15:10
Re: Atmega8 регулировка частоты и амплитуды
Starichok51, Насчет напряжение ноль- частота максимальная я конечно знаю, всё что со стороны железа мне понятно. Логарифмические переменники не устраивают своей ценой.
Добавлено after 5 minutes 33 seconds:
descr1 = 129960 / (freq + 60) классно!!! лучшего и не надо! Спасибо за помощь, и понятные разъяснения!
Добавлено after 5 minutes 33 seconds:
descr1 = 129960 / (freq + 60) классно!!! лучшего и не надо! Спасибо за помощь, и понятные разъяснения!
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Atmega8 регулировка частоты и амплитуды
вот тебе еще ЛУЧШЕ!!!
а вообще, по моему мнению, нужна не линейность по частоте, а равномерное изменение частоты от угла поворота оси резистора.
это по аналогии с частотами музыкальных нот.
сейчас изменение частоты в 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)
регулировка частоты тебе должна еще больше понравиться.
а вообще, по моему мнению, нужна не линейность по частоте, а равномерное изменение частоты от угла поворота оси резистора.
это по аналогии с частотами музыкальных нот.
сейчас изменение частоты в 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)
регулировка частоты тебе должна еще больше понравиться.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
-
Varlakotam
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб фев 02, 2019 17:15:10
Re: Atmega8 регулировка частоты и амплитуды
Starichok51, Да! Этот вариант лучше.
Хороший сегодня день)))
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1907
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Atmega8 регулировка частоты и амплитуды
Какую бы формулу не применили, "потеряете" значения частоты между двумя табличными значениями. Будет разница между значениями в начале таблицы и значениями в конце таблицы.
Попробуйте DDS: Direct Digital Synthesis DDS with microcontroller.
(Сегодня портировал код для другой подобной задачи как тестовой в PIC и случайно наткнулся на ту же тему здесь).
Решение с DDS (см. шаг.) напр. 10 раза "перед" реализацией частоты обхода таблицы через таймера (там n/OCR2A - в знаменатель, сл. нелинейно). А в DDS шаг линейный. Оба метода реализованы по ссылке выше.
Попробуйте DDS: Direct Digital Synthesis DDS with microcontroller.
(Сегодня портировал код для другой подобной задачи как тестовой в PIC и случайно наткнулся на ту же тему здесь).
Решение с DDS (см. шаг.) напр. 10 раза "перед" реализацией частоты обхода таблицы через таймера (там n/OCR2A - в знаменатель, сл. нелинейно). А в DDS шаг линейный. Оба метода реализованы по ссылке выше.
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Atmega8 регулировка частоты и амплитуды
veso74, во-первых, тут нет "табличных" значений.
во-вторых, тут нет генерации заданной частоты, чтобы применить DDS.
если бы ты внимательно читал тему и последние мои сообщения, то увидел бы, что частота задается временем выполнения значений синуса для каждого участка синусной формы сигнала.
так что, ты своими предложениями попал пальцем в небо...
Добавлено after 3 minutes 8 seconds:
во-вторых, тут нет генерации заданной частоты, чтобы применить DDS.
если бы ты внимательно читал тему и последние мои сообщения, то увидел бы, что частота задается временем выполнения значений синуса для каждого участка синусной формы сигнала.
так что, ты своими предложениями попал пальцем в небо...
Добавлено after 3 minutes 8 seconds:
а ты уже проверил?Varlakotam писал(а): Этот вариант лучше.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1907
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Atmega8 регулировка частоты и амплитуды
Прошу прощения. Сообщение было в теме, а не в сообщении и решении выше.
(с языковым барьером: не на 100% понимаю полемику в теме).
(с языковым барьером: не на 100% понимаю полемику в теме).
-
Varlakotam
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб фев 02, 2019 17:15:10
Re: Atmega8 регулировка частоты и амплитуды
Starichok51, Да, сразу же проверил. Это именно то что я хотел
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Atmega8 регулировка частоты и амплитуды
ну, тогда поздравляю нас с достигнутым успехом!!!
позволю себе немножко похвастаться. я же радиоинженер, а не поросячий хвостик...
veso74, я не учел, что ты из Болгарии. но всё равно надо быть внимательнее к написанному.
тут такая ерунда, что частота определяется довольно большим процессорным временем функции вычисления синуса.
а потенциометр задает количество шагов вычисления синуса. чем больше шагов, тем ниже частота.
позволю себе немножко похвастаться. я же радиоинженер, а не поросячий хвостик...
veso74, я не учел, что ты из Болгарии. но всё равно надо быть внимательнее к написанному.
тут такая ерунда, что частота определяется довольно большим процессорным временем функции вычисления синуса.
а потенциометр задает количество шагов вычисления синуса. чем больше шагов, тем ниже частота.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


