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

Re: Синус из ШИМ

Пт янв 26, 2024 22:22:42

Jack_A, никакой ШИМ не сравнится по качеству и частоте синуса с ЦАПом 16 бит на резисторах. Есть специальные синусные микросхемы, но дорого. Можно на операх собрать, но гемор. На GD407 DAC только 12бит, но тактовая 400Мгц!

Re: Синус из ШИМ

Сб янв 27, 2024 10:51:31

Так я и не агитирую за ШИМ, я - за ЦАП царап :)

Re: Синус из ШИМ

Сб янв 27, 2024 10:58:28

Как вариант. Составить таблицу синуса из 129/период, тогда синус получается 775,19Гц. Таблица составляется по выражению
OCR1B=40+40*sin(i*360/129)-1
При этом из опыта
-нежелательно генерировать точки с вырожденным pwm, для чего, немного жертвуя амплитудой, множитель перед sin немного уменьшить. Допустим до 32
-применить контроллер с более продвинутым 8-разрядным таймером, что нибудь типа tiny. Тогда можно таблицу уменьшить в 2 раза за счет занесения в регистр сравнения байта вместо слова
-поднять частоту тактирования до максимально возможной. Тогда можно и амплитуду поднять.

Re: Синус из ШИМ

Пн янв 29, 2024 13:26:48

Но насколько подсказывает логика, в вопросах безопасности на транспорте, как и в медоборудовании, несертифицированная самодеятельность не допускается. Или не?
Лично у нас всё должно пройти по бумагам, даже замены конденсаторов, не говоря про стенды и покуда не проверят и подпишут разрешение ничего менять и использовать не имеешь право. Для настройки, только заводские стенды и поверенное оборудование. А для выявлении причин отказа, это не критично и по бумагам пройдёт без проблем.

Добавлено after 9 hours 38 seconds:
Таблица составляется по выражению
OCR1B=40+40*sin(i*360/129)-1
Зарядил расчёт на ардуино, какая то странная таблица получается, очень часто фигурирует ноль.
void setup(){
Serial.begin(9600);
}

void loop(){
for (int i=0;i<130;i++) {
Serial.print(byte (40+40*sin(i*360/129)-1));
Serial.print(", ");
}
delay(100000); // Задержка, чтобы успеть скопировать
}

Re: Синус из ШИМ

Пн янв 29, 2024 13:46:41

ну и что ты там успел скопировать?

Re: Синус из ШИМ

Пн янв 29, 2024 16:06:31

Типа вот такой последовательности цифр 39,75,0,78,0,55,27,44,38,33,77,0,78,0,77,32,39,43,28,54,0,78,0,75,37,34,49,23,59,0,77,2,73,7,29,54,18,
63,9,76,4,70,11,62,58,14,67 и т.п.

Re: Синус из ШИМ

Пн янв 29, 2024 17:39:52

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

Re: Синус из ШИМ

Вт янв 30, 2024 10:50:31

Нифига не понимаю в этих кыржиках. Поэтому, в качестве ликбеза. Почему i<130, а не 129? Почему открывающих скобок меньше чем закрывающих? :facepalm:

Re: Синус из ШИМ

Вт янв 30, 2024 10:57:20

пересчитай скобки.
я вижу одинаковое количество.

Re: Синус из ШИМ

Вт янв 30, 2024 13:03:26

аргумент синуса должен быть в радианах, а не в градусах..
Если значение i переводить в радианы, то данные в таблице более похожи, а если выражение в скобках, то тоже как бы не то получается.
39,42,44,46,48,50,52,54,55,57,59,61,62,64,65,67,68,69,70,72,73,74,75,75,76,77,77,78,78,78,78,78,78,78, 78,78,77,77,76,76,75,74,73,72,71,70,69,67,66,64,63,61,60,58,56,55,53,51,49,47,45,43,41,39,38,36,34,32, 30,28,26,24,22,21,19,17,16,14,13,11,10,8,7,6,5,4,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,4,5,7,8,9,10,12, 13,15,16,18,20,22,23,25,27,29,31,33,35,37,38.

Добавлено after 7 minutes 24 seconds:
Почему i<130, а не 129?
i=130, чтобы в таблице получить 129 значений.

Re: Синус из ШИМ

Вт янв 30, 2024 14:18:03

Alex_ka писал(а):Если значение i переводить в радианы
i - это переменная цикла, целое число. а радианах должен быть аргумент синуса.
и градусы в формуле вообще не нужны.
360 градусов - это 2*PI.
и формула должны выглядеть так:
sin(2 * PI * i / steps)
где steps - число шагов, у тебя их 129.

Re: Синус из ШИМ

Вт янв 30, 2024 14:18:34

А чего такой маленький диапазон (амплитуда всего 40)? Так надо?

Несколько нулей: это (скорей всего):
* из-за маленького динамического диапазона (вблизи к максимуму/минимуму cинус мало меняется - производная то нулевая или близкая к нулю)
* и скорей всего, ты не округляешь (не правильно округляешь) у меня нулей меньше :-)

То, что не так округление работает говорит то, что первое значение в таблице 39, а вообще-то должно быть 40 (как я понял из ранее выложенного исходника).

Alex_ka писал(а):i=130, чтобы в таблице получить 129 значений.


А у тебя 130 значений: i = 0, 1, 2, .... 129

Вот такоая таблица на 129 элементов у меня получилась (если амплитуда 40 и смещение 40)
Спойлер
Код:
uint8_t sin_table [129] = {
    40,  42,  44,  46,  48,  50,  52,  53,
    55,  57,  59,  60,  62,  64,  65,  67,
    68,  69,  71,  72,  73,  74,  75,  76,
    77,  78,  78,  79,  79,  79,  80,  80,
    80,  80,  80,  80,  79,  79,  78,  78,
    77,  76,  76,  75,  74,  73,  71,  70,
    69,  67,  66,  64,  63,  61,  60,  58,
    56,  54,  52,  51,  49,  47,  45,  43,
    41,  39,  37,  35,  33,  31,  29,  28,
    26,  24,  22,  20,  19,  17,  16,  14,
    13,  11,  10,   9,   7,   6,   5,   4,
     4,   3,   2,   2,   1,   1,   0,   0,
     0,   0,   0,   0,   1,   1,   1,   2,
     2,   3,   4,   5,   6,   7,   8,   9,
    11,  12,  13,  15,  16,  18,  20,  21,
    23,  25,  27,  28,  30,  32,  34,  36,
    38
};


Исходник (если это так можно назвать) надо?

Re: Синус из ШИМ

Вт янв 30, 2024 15:04:03

Исходник (если это так можно назвать) надо?
Не плохо было бы. При i=130, значений в таблице у меня сформировало почему-то 129. Спасибо всем за помощь.

Re: Синус из ШИМ

Вт янв 30, 2024 15:21:13

у тебя не может быть i=130, так как в твоей формуле
for (int i=0;i<130;i++)
i всегда меньше 130.
а сформироваться у тебя должно 130 значений, так как от 0 до 129 количество значений переменой цикла равно 130.

Re: Синус из ШИМ

Вт янв 30, 2024 17:07:51

Не плохо было бы


В личку кинул исходник (в stdout выводит си-шный массив). Но тебе же еще модулировать, как мне кажется, желательно использовать весь диапазон значений (0.255), а не его треть (0..80). В исходнике константами настраивается число точек в периоде, амплитуда и смещение.

Ну и частота у тебя константа (как я понял), непонятно почему не хочешь в таблицу положить кратное число периодов, чтобы была точная частота на выходе без "фазового дрожания" и без необходимости что-то пересчитывать "на лету" - во флеше то места навалом (или нет?).


Таблица синуса для амплитуды 120 (смещение 128)
Спойлер
Код:
uint8_t sin_table [129] = {
   128, 134, 140, 145, 151, 157, 163, 168,
   174, 179, 184, 189, 194, 199, 204, 208,
   212, 216, 220, 224, 227, 230, 233, 236,
   238, 241, 242, 244, 245, 246, 247, 248,
   248, 248, 248, 247, 246, 245, 243, 242,
   240, 237, 235, 232, 229, 226, 222, 218,
   214, 210, 206, 201, 197, 192, 187, 182,
   176, 171, 165, 160, 154, 148, 143, 137,
   131, 125, 119, 113, 108, 102,  96,  91,
    85,  80,  74,  69,  64,  59,  55,  50,
    46,  42,  38,  34,  30,  27,  24,  21,
    19,  16,  14,  13,  11,  10,   9,   8,
     8,   8,   8,   9,  10,  11,  12,  14,
    15,  18,  20,  23,  26,  29,  32,  36,
    40,  44,  48,  52,  57,  62,  67,  72,
    77,  82,  88,  93,  99, 105, 111, 116,
   122
};

Re: Синус из ШИМ

Вт янв 30, 2024 21:27:26

Чтобы управлять амплитудой, таблицу нужно пересчитывать. Имеет смысл сократить таблицу до четверти и памяти меньше занимает. Вторая четверть зеркальна и т.д.

Re: Синус из ШИМ

Ср янв 31, 2024 06:29:51

viiv писал(а):Таблица синуса для амплитуды 120 (смещение 128)
Думаю, при тактовой 8МГц частота при такой таблице будет 8'000'000/256/129~242Гц вместо 775 требуемых. Придется уменьшать число точек/период или задирать тактирование до 25,6МГц. Не каждая mega8 справится.
linkov1959 писал(а):Чтобы управлять амплитудой, таблицу нужно пересчитывать.
Можно таблицу синуса нормировать типа
SIN(I*360/129). Тогда для управления амплитудой можно будет модулировать множитель по той же таблице синуса.
OUT_PWM=40+K*SIN(I*360/129), где K=40 без модуляции и K 0...40 с модуляцией.

Re: Синус из ШИМ

Ср янв 31, 2024 09:25:48

akl писал(а):SIN(I*360/129)
то есть, мои слова, что аргумент должен быть в радианах, для тебя пустой звук?
повторю специально для тебя:
Starichok51 писал(а):градусы в формуле вообще не нужны.
360 градусов - это 2*PI.
и формула должна выглядеть так:
sin(2 * PI * i / steps)
где steps - число шагов, у тебя их 129.

Re: Синус из ШИМ

Ср янв 31, 2024 10:05:08

Starichok51 писал(а):мои слова, что аргумент должен быть в радианах, для тебя пустой звук
:cry: да.
Специально для тебя значение синуса для i=1
Изображение
Вложения
SIN_GRAD_RADIAN.PNG
(21.84 KiB) Скачиваний: 164

Re: Синус из ШИМ

Ср янв 31, 2024 11:37:35

ты лучше покажи, что посчитает МК по твоей формуле
SIN(I*360/129)
для i=1,
а не в компьютерном калькуляторе.
Ответить