Синус из ШИМ

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

Сообщение linkov1959 »

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

Сообщение Jack_A »

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

Сообщение akl »

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

Сообщение 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); // Задержка, чтобы успеть скопировать
}
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 19077
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

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

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

Сообщение Starichok51 »

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

Сообщение akl »

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

Сообщение Starichok51 »

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

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

Сообщение Starichok51 »

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

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

Сообщение Alex_ka »

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

Сообщение Starichok51 »

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

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

Сообщение linkov1959 »

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

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

Сообщение Starichok51 »

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

Сообщение akl »

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

Сообщение Starichok51 »

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

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