Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.02.2010, 18:31
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Сообщение от kison
|
Нет, это не проще, так работоспособность вообще нарушится. ptrsin - это накопитель фазы, а F_OUT_BIT1 это константа определяющая частоту сигнала
|
Спасибо, за ссылки, я всё это знаю, даже писал программу с 8, 7 и 4 тактами на выборку. Как бы то ни было,
строка из программы SasaVitebsk
if(ptrsin›&sinus[VOL_SIN-1]) ptrsin -= VOL_SIN;
и строка, предлагаемая мной
if(ptrsin›&sinus[VOL_SIN-1]) ptrsin = &sinus[0];
функционально совершенно равны, поскольку после выполнения
ptrsin = ptrsin - VOL_SIN = &sinus[0];
указатель оказывается одинаковым в обоих вариантах.
Однако, в первом случае компилятор выбирает два байта памяти ptrsin, вычитает два байта константы VOL_SIN и сохраняет результат в ptrsin.
Во второй случае компилятор берет константу &sinus[0], это начальный адрес буфера, и сохраняет её в ptrsin. Пропадает операция двухбайтного вычитания, о чём я и толкую.
Вообще-то, там и второй вопрос был.
|
|
|
|
08.02.2010, 18:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Сообщение от =GM=
|
строка из программы SasaVitebsk
if(ptrsin›&sinus[VOL_SIN-1]) ptrsin -= VOL_SIN;
и строка, предлагаемая мной
if(ptrsin›&sinus[VOL_SIN-1]) ptrsin = &sinus[0];
функционально совершенно равны, поскольку после выполнения
|
Вы в этом уверены? Подсчитаем на пальцах. Пусть sinus[VOL_SIN] массив в 1 килобайт, начинается с адреса 1000. VOL_SIN соответственно =1000. Пусть указатель равен 1950 и F_OUT_BIT1 = 100. После исходной конструкции
Код:
|
ptrsin += F_OUT_BIT1;
if(ptrsin›&sinus[VOL_SIN-1])ptrsin -= VOL_SIN; |
ptrsin = 1950+100-1000 = 1050
После Вашей ptrsin = 1000.
Неужели одно и то же?
Одинаково бы было :
Код:
|
if(ptrsin == &sinus[VOL_SIN-1]) ptrsin = &sinus[0]; |
|
|
|
|
08.02.2010, 18:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Сообщение от =GM=
|
Вообще-то, там и второй вопрос был.
|
Про второй вопрос не понял. Это типа можно ли сложение с ПРОИЗВОЛЬНОЙ константой заменить на ++?
|
|
|
|
08.02.2010, 19:02
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Ну, если F_OUT_BIT1!=1, то вы правы. Я рассматривал как раз случай 1.
Второе моё упрощение основано на том же предположении, так что с первыми двумя вопросами всё ясно.
Третий вопрос. Допустимо ли на си для мк писать так
dpwm = *(ptrsin+=F_OUT_BIT1);
|
|
|
|
08.02.2010, 19:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Сообщение от =GM=
|
Ну, если F_OUT_BIT1!=1, то вы правы. Я рассматривал как раз случай 1.
|
В DDS-e приращение фазы обычно далеко не 1. Иначе чем частоту то задать?
Сообщение от =GM=
|
Третий вопрос. Допустимо ли на си для мк писать так
dpwm = *(ptrsin+=F_OUT_BIT1);
|
В принципе да, но делать этого не стОит. ИМХО конечно. Читабельность падает, а выигрыша в коде не будет.
Вот это:
Код:
|
ptrsin += F_OUT_BIT1;
if(ptrsin›&sinus[VOL_SIN-1])ptrsin -= VOL_SIN; |
тоже можно переписать на:
Код:
|
ptrsin = ptrsin + F_OUT_BIT1 -(ptrsin › &sinus[VOL_SIN-1])*VOL_SIN; |
Но тоже не нужно, тем более что тут используется недокументированная фича компиляторов, то что true == 1. Хотя в стандарте С это не так и истиной может быть любое ненулевое значение. Тут кстати умножения реально не будет и по коду эти две конструкции одинаковы. А вот по читабельности нет.
|
|
|
|
08.02.2010, 19:40
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Сообщение от kison
|
В DDS-e приращение фазы обычно далеко не 1. Иначе чем частоту-то задать?
|
Не совсем так, как правило, в DDS приращение фазы много меньше единицы, а ёмкость фазового аккумулятора много больше размера таблицы.
Ну а частоту можно задавать размером таблицы и/или частотой выборки, похоже у Александра весьма специфический случай.
|
|
|
|
08.02.2010, 20:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Сообщение от =GM=
|
Не совсем так, как правило, в DDS приращение фазы много меньше единицы,
|
Ну в данном случае единица - условное понятие и каждый ее по своему представляет. Назовем это не единица, а "наименьшее приращение фазы" ![Улыбка](images/smilies/icon_smile.gif) Которого практически никогда не бывает в DDS. А меньше единицы и арифметика с указателями не стыкуются никак.
|
|
|
|
08.02.2010, 21:09
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Ну почему ж так сразу не стыкуется. Берётся, например, 24 или 32 бита фазы и старшие 8/12 бит представляют адрес. Я делал с 32 битами и 10 тактов на выборку. При тактовой контроллера 20 МГц, частота выдачи выборок равна 2 МГц, при этом шаг частоты равен 0.000466 Гц. До 300 кГц очень даже неплохой синус получается.
Последний раз редактировалось =GM=; 08.02.2010 в 21:11.
|
|
|
|
08.02.2010, 21:13
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Я не знал, что этот метод обзывается DDS. Соответственно нигде об этом не читал. Смысл читать, если прога состоит из 4 строк Си? Метод - очевиден. Генерация частот с частотой, кратной частоте выборки - есть частный случай.
Совершенно очевидно, что чем больше размер таблицы и больше соотношение частоты ШИМ к формируемой частоте, тем более гладкая кривая получается. Формирование ступеньки ШИМ либо ЦАП - не меняют алгоритма. Фильтрация - это отдельный вопрос. Сделать её в широких пределах, достаточно проблематично. Конечно, можно зарезать частоту раза в 4 меньше ШИМ.
Почему такой метод применял я писал. Мне надо было менять частоту сигнала, не разрывая фазы. Кроме того, необходимо было менять и амплитуду сигнала. Причина - именно неравномерность интегрирующей/ фильтрующей цепочек для разных частот. Точность частоты меня вполне устраивала и 1%. Хотя я мог сделать и 0.1%.
В результате то, что у поляков получилось на msp430 + 4 операционника+ 4 транзистора, у меня заняла mega88 + 4 транзистора. Пассивных элементов раз в 5 меньше. Качество генерируемого сигнала - в несколько раз лучше.
|
|
|
|
08.02.2010, 21:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: ШИМ, синусоида на Мега8?
Сообщение от SasaVitebsk
|
В результате то, что у поляков получилось на msp430 + 4 операционника+ 4 транзистора, у меня заняла mega88 + 4 транзистора. Пассивных элементов раз в 5 меньше. Качество генерируемого сигнала - в несколько раз лучше.
|
Страшно представить что же у этих поляков получилось. Если Ваш "синус" в несколько раз лучше...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:36.
|
|