Синус из ШИМ

Обсуждаем контроллеры компании Atmel.
linkov1959
Держит паяльник хвостом
Сообщения: 923
Зарегистрирован: Пн сен 10, 2018 19:16:28

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

Сообщение linkov1959 »

Jack_A, никакой ШИМ не сравнится по качеству и частоте синуса с ЦАПом 16 бит на резисторах. Есть специальные синусные микросхемы, но дорого. Можно на операх собрать, но гемор. На GD407 DAC только 12бит, но тактовая 400Мгц!
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Так я и не агитирую за ШИМ, я - за ЦАП царап :)
Изображение
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

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

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

Сообщение Alex_ka »

[uquote="Jack_A",url="/forum/viewtopic.php?p=4535470#p4535470"]Но насколько подсказывает логика, в вопросах безопасности на транспорте, как и в медоборудовании, несертифицированная самодеятельность не допускается. Или не?[/uquote]Лично у нас всё должно пройти по бумагам, даже замены конденсаторов, не говоря про стенды и покуда не проверят и подпишут разрешение ничего менять и использовать не имеешь право. Для настройки, только заводские стенды и поверенное оборудование. А для выявлении причин отказа, это не критично и по бумагам пройдёт без проблем.

Добавлено after 9 hours 38 seconds:
[uquote="akl",url="/forum/viewtopic.php?p=4535749#p4535749"]Таблица составляется по выражению
OCR1B=40+40*sin(i*360/129)-1[/uquote]Зарядил расчёт на ардуино, какая то странная таблица получается, очень часто фигурирует ноль.
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); // Задержка, чтобы успеть скопировать
}
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

ну и что ты там успел скопировать?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

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

Сообщение Alex_ka »

Типа вот такой последовательности цифр 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 и т.п.
Реклама
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

ну да, чушь нереальная.
вообще-то, аргумент синуса должен быть в радианах, а не в градусах. видимо, поэтому и получил ты такие результаты.
лучше нп компе посчитай - там калькулятор считает в градусах.
и даже на компе быстрее будет - не надо ждать по 100 секунд твою задержку.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Нифига не понимаю в этих кыржиках. Поэтому, в качестве ликбеза. Почему i<130, а не 129? Почему открывающих скобок меньше чем закрывающих? :facepalm:
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

пересчитай скобки.
я вижу одинаковое количество.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

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

Сообщение Alex_ka »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4536615#p4536615"]аргумент синуса должен быть в радианах, а не в градусах..[/uquote]Если значение 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:
[uquote="akl",url="/forum/viewtopic.php?p=4536837#p4536837"]Почему i<130, а не 129?[/uquote]i=130, чтобы в таблице получить 129 значений.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

Alex_ka писал(а):Если значение i переводить в радианы
i - это переменная цикла, целое число. а радианах должен быть аргумент синуса.
и градусы в формуле вообще не нужны.
360 градусов - это 2*PI.
и формула должны выглядеть так:
sin(2 * PI * i / steps)
где steps - число шагов, у тебя их 129.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

А чего такой маленький диапазон (амплитуда всего 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
};
Исходник (если это так можно назвать) надо?
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

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

Сообщение Alex_ka »

[uquote="viiv",url="/forum/viewtopic.php?p=4536927#p4536927"]Исходник (если это так можно назвать) надо?[/uquote]Не плохо было бы. При i=130, значений в таблице у меня сформировало почему-то 129. Спасибо всем за помощь.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

у тебя не может быть i=130, так как в твоей формуле
for (int i=0;i<130;i++)
i всегда меньше 130.
а сформироваться у тебя должно 130 значений, так как от 0 до 129 количество значений переменой цикла равно 130.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="Alex_ka",url="/forum/viewtopic.php?p=4536950#p4536950"]Не плохо было бы[/uquote]

В личку кинул исходник (в 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
};
linkov1959
Держит паяльник хвостом
Сообщения: 923
Зарегистрирован: Пн сен 10, 2018 19:16:28

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

Сообщение linkov1959 »

Чтобы управлять амплитудой, таблицу нужно пересчитывать. Имеет смысл сократить таблицу до четверти и памяти меньше занимает. Вторая четверть зеркальна и т.д.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

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 с модуляцией.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

akl писал(а):SIN(I*360/129)
то есть, мои слова, что аргумент должен быть в радианах, для тебя пустой звук?
повторю специально для тебя:
Starichok51 писал(а):градусы в формуле вообще не нужны.
360 градусов - это 2*PI.
и формула должна выглядеть так:
sin(2 * PI * i / steps)
где steps - число шагов, у тебя их 129.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Starichok51 писал(а):мои слова, что аргумент должен быть в радианах, для тебя пустой звук
:cry: да.
Специально для тебя значение синуса для i=1
Изображение
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

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

Вернуться в «AVR»