Синус из ШИМ
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Синус из ШИМ
Jack_A, никакой ШИМ не сравнится по качеству и частоте синуса с ЦАПом 16 бит на резисторах. Есть специальные синусные микросхемы, но дорого. Можно на операх собрать, но гемор. На GD407 DAC только 12бит, но тактовая 400Мгц!
- Реклама
Re: Синус из ШИМ
Как вариант. Составить таблицу синуса из 129/период, тогда синус получается 775,19Гц. Таблица составляется по выражению
OCR1B=40+40*sin(i*360/129)-1
При этом из опыта
-нежелательно генерировать точки с вырожденным pwm, для чего, немного жертвуя амплитудой, множитель перед sin немного уменьшить. Допустим до 32
-применить контроллер с более продвинутым 8-разрядным таймером, что нибудь типа tiny. Тогда можно таблицу уменьшить в 2 раза за счет занесения в регистр сравнения байта вместо слова
-поднять частоту тактирования до максимально возможной. Тогда можно и амплитуду поднять.
OCR1B=40+40*sin(i*360/129)-1
При этом из опыта
-нежелательно генерировать точки с вырожденным pwm, для чего, немного жертвуя амплитудой, множитель перед sin немного уменьшить. Допустим до 32
-применить контроллер с более продвинутым 8-разрядным таймером, что нибудь типа tiny. Тогда можно таблицу уменьшить в 2 раза за счет занесения в регистр сравнения байта вместо слова
-поднять частоту тактирования до максимально возможной. Тогда можно и амплитуду поднять.
-
Alex_ka
- Нашел транзистор. Понюхал.
- Сообщения: 193
- Зарегистрирован: Ср сен 04, 2019 17:59:23
- Откуда: Гомель
Re: Синус из ШИМ
[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); // Задержка, чтобы успеть скопировать
}
Добавлено 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: Синус из ШИМ
ну и что ты там успел скопировать?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Реклама
-
Alex_ka
- Нашел транзистор. Понюхал.
- Сообщения: 193
- Зарегистрирован: Ср сен 04, 2019 17:59:23
- Откуда: Гомель
Re: Синус из ШИМ
Типа вот такой последовательности цифр 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 и т.п.
63,9,76,4,70,11,62,58,14,67 и т.п.
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Синус из ШИМ
ну да, чушь нереальная.
вообще-то, аргумент синуса должен быть в радианах, а не в градусах. видимо, поэтому и получил ты такие результаты.
лучше нп компе посчитай - там калькулятор считает в градусах.
и даже на компе быстрее будет - не надо ждать по 100 секунд твою задержку.
вообще-то, аргумент синуса должен быть в радианах, а не в градусах. видимо, поэтому и получил ты такие результаты.
лучше нп компе посчитай - там калькулятор считает в градусах.
и даже на компе быстрее будет - не надо ждать по 100 секунд твою задержку.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Синус из ШИМ
Нифига не понимаю в этих кыржиках. Поэтому, в качестве ликбеза. Почему i<130, а не 129? Почему открывающих скобок меньше чем закрывающих? 
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Синус из ШИМ
пересчитай скобки.
я вижу одинаковое количество.
я вижу одинаковое количество.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
-
Alex_ka
- Нашел транзистор. Понюхал.
- Сообщения: 193
- Зарегистрирован: Ср сен 04, 2019 17:59:23
- Откуда: Гомель
Re: Синус из ШИМ
[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 значений.
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: Синус из ШИМ
i - это переменная цикла, целое число. а радианах должен быть аргумент синуса.Alex_ka писал(а):Если значение i переводить в радианы
и градусы в формуле вообще не нужны.
360 градусов - это 2*PI.
и формула должны выглядеть так:
sin(2 * PI * i / steps)
где steps - число шагов, у тебя их 129.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Синус из ШИМ
А чего такой маленький диапазон (амплитуда всего 40)? Так надо?
Несколько нулей: это (скорей всего):
* из-за маленького динамического диапазона (вблизи к максимуму/минимуму cинус мало меняется - производная то нулевая или близкая к нулю)
* и скорей всего, ты не округляешь (не правильно округляешь) у меня нулей меньше
То, что не так округление работает говорит то, что первое значение в таблице 39, а вообще-то должно быть 40 (как я понял из ранее выложенного исходника).
Вот такоая таблица на 129 элементов у меня получилась (если амплитуда 40 и смещение 40)
Исходник (если это так можно назвать) надо?
Несколько нулей: это (скорей всего):
* из-за маленького динамического диапазона (вблизи к максимуму/минимуму cинус мало меняется - производная то нулевая или близкая к нулю)
* и скорей всего, ты не округляешь (не правильно округляешь) у меня нулей меньше
То, что не так округление работает говорит то, что первое значение в таблице 39, а вообще-то должно быть 40 (как я понял из ранее выложенного исходника).
А у тебя 130 значений: i = 0, 1, 2, .... 129Alex_ka писал(а): i=130, чтобы в таблице получить 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: Синус из ШИМ
[uquote="viiv",url="/forum/viewtopic.php?p=4536927#p4536927"]Исходник (если это так можно назвать) надо?[/uquote]Не плохо было бы. При i=130, значений в таблице у меня сформировало почему-то 129. Спасибо всем за помощь.
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Синус из ШИМ
у тебя не может быть i=130, так как в твоей формуле
for (int i=0;i<130;i++)
i всегда меньше 130.
а сформироваться у тебя должно 130 значений, так как от 0 до 129 количество значений переменой цикла равно 130.
for (int i=0;i<130;i++)
i всегда меньше 130.
а сформироваться у тебя должно 130 значений, так как от 0 до 129 количество значений переменой цикла равно 130.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Синус из ШИМ
[uquote="Alex_ka",url="/forum/viewtopic.php?p=4536950#p4536950"]Не плохо было бы[/uquote]
В личку кинул исходник (в stdout выводит си-шный массив). Но тебе же еще модулировать, как мне кажется, желательно использовать весь диапазон значений (0.255), а не его треть (0..80). В исходнике константами настраивается число точек в периоде, амплитуда и смещение.
Ну и частота у тебя константа (как я понял), непонятно почему не хочешь в таблицу положить кратное число периодов, чтобы была точная частота на выходе без "фазового дрожания" и без необходимости что-то пересчитывать "на лету" - во флеше то места навалом (или нет?).
Таблица синуса для амплитуды 120 (смещение 128)
В личку кинул исходник (в 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: Синус из ШИМ
Чтобы управлять амплитудой, таблицу нужно пересчитывать. Имеет смысл сократить таблицу до четверти и памяти меньше занимает. Вторая четверть зеркальна и т.д.
Re: Синус из ШИМ
Думаю, при тактовой 8МГц частота при такой таблице будет 8'000'000/256/129~242Гц вместо 775 требуемых. Придется уменьшать число точек/период или задирать тактирование до 25,6МГц. Не каждая mega8 справится.viiv писал(а):Таблица синуса для амплитуды 120 (смещение 128)
Можно таблицу синуса нормировать типа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: Синус из ШИМ
то есть, мои слова, что аргумент должен быть в радианах, для тебя пустой звук?akl писал(а):SIN(I*360/129)
повторю специально для тебя:
Starichok51 писал(а):градусы в формуле вообще не нужны.
360 градусов - это 2*PI.
и формула должна выглядеть так:
sin(2 * PI * i / steps)
где steps - число шагов, у тебя их 129.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Синус из ШИМ
Starichok51 писал(а):мои слова, что аргумент должен быть в радианах, для тебя пустой звук
Специально для тебя значение синуса для i=1
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Синус из ШИМ
ты лучше покажи, что посчитает МК по твоей формуле
SIN(I*360/129)
для i=1,
а не в компьютерном калькуляторе.
SIN(I*360/129)
для i=1,
а не в компьютерном калькуляторе.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.



