Официальный сайт компании Arduino по адресу arduino.cc
Синус 10кГц
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 18/03/2018 - 08:36
Здравствуйте. Подскажите пожалуйста, можно ли программно решить такую задачку на ардуино уно:
1. Синус 10 кГц
2. ШИМ с регулируемой скважностью (переменник) 500 Гц
3. Снятие синуса с внешней обмотки и сравнение с синусом генерируемым ардуинкой.
Зарание всем спасибо)
Protas, первые два однозначно можно, и примеры на форуме есть. (3) -это уже задача для осциллографа. В любом случае одновременно задачи (1) и (3) вряд ли могут сосуществовать на одном МК.
Да, форум я смотрел. Не пойму просто как частоты в 10 кГц достичь
Protas, Ардуино - это не конкретный контроллер, а целое семейство.
На данном форуме под Ардуино зачастую подразумевается семейство AVR. Строго говоря, аналоговые сигналы это семейство не способно генерить в принципе, поэтому задача 1 невыполнима.
Хотя, при наличии некоторого внешнего обвеса можно получить результат достаточно длизкий к желаемому. Например, генерить Ардуиной меандр 10 кГц, а в синус превращаать его узкополосным фильтром. И, кстати, для такой реализации увтерждение уважаемого dimax о невозможности совмещения 1 и 3 перестает быть истинным.
Что касается ввода аналоговых сигналов, то для указанного семейства максимальная частота дискретизации по умолчанию - 9 кГц. Если мы хотим уверенно отличать синус от прямоугольника, оцифровка должна ловить, минимум, 5-7 гармоник, для чего частота дискретизации должна быть не ниже 120-150 кГц.
Думаю, что единственный контроллер из семейства Ардуино, который способен выполнять задачи типа тех, что приведены Вами - это Arduino Due.
Спасибо. Уже заказал
Вот я причесал старый DDS для удобного использования.
Он на Bluepill STM32. Эта плата, в отличии от Due, стоит 100 р, а не 1000.
Замечу, что loop() - пустой и в нем можно делать, что захочется ;).
ДДС построен на ДМА и Таймере. ЦАП сделан за счет ШИМ и RC фильтра на выходе.
В примере использован RC фильтр из 180 Ом и 10 нФ.
Вот поясняющее видео на youtube.
Ниже - код. Он самодокументирован. Если нужны пояснения - пишите тут, я когда-нибудь отвечу ;). Если кто-то считает это правильным - можно перенести в проекты, Хоть это и смешно.
Делал я генерацию синусов, причем сразу двух для DTMF, и ввод аналогового сигнала (собственно этого самого DTMF). Все это в прерывании таймера 1 на 62,5КГц. На нем же и ШИМ. Может можна и больше частоту, насколько помню выбиралась по возможностям ШИМа, его период равен 256 тактов и он 8-битный. Синус конечно таблично генерится, не как у wdrakula. Походу введеный сигнал еще на экран выводится, гдето на форуме даже ссылка на видео работы есть.
Добавлю еще функцию табличного синуса по четверти периода. А то есть любители целый период хранить.
Синус конечно таблично генерится, не как у wdrakula.
Стесняюсь спросить: а у меня как?
Я и строю таблицу при запуске в init_wave(). Строю для сигнала любой формы. Там первый for ишет максимум, а второй строит таблицу.
Если в контроллере дохрена памяти, то таблицу можно и нужно строить прямо в нем, нет?
Я люблю эффективное программирование, люблю "упихаить" а тиньку13 сложный код, но (!) для практической, не тренировочной, задачи - предпочту (в случае нехватки ресурсов) взять контроллер "потолще" ;).
А я обычно строю таблицы на ПК и объявляю const PEROGMEM. На практике более половины используемого объема flash уходит именно на таблицы.
Купил Due. Залил скетч, найденый в инте...
На цифровом осцилографе показывает синус, но частота постоянно скачет. Примерно 8кГц - 20 кГц. Подскажите плз, как стабилизировать частоту на 10 кГц.
Вот ссылка на автора http://arduino-er.blogspot.com.by/2014/12/generate-sin-wave-on-arduino-due.html
P.S. огромное спасибо всем кто откликнулся!
Protas, это пожалуй самый плохой генератор синуса из всех, что существуют =) Посмотрите в этой ветке программу от Волшебника. Там к слову есть и мой вариант для дуе, который даёт максимально качественный синус, но он занимает 100% вычислительной мощности, и делать что-то ещё во время генерации синуса невозможно. Вариант Волшебника с точностью до наоборот. Синус не выского качества, но вычислительная мощность почти вся свободна.
Все это в прерывании таймера 1 на 62,5КГц. На нем же и ШИМ.
А в примере wdrakula и прерывания не понадобились... и луп пустой... Прикинь!!!??? )))))))))
Может можна и больше частоту, насколько помню выбиралась по возможностям ШИМа, его период равен 256 тактов и он 8-битный.
Убогость налицо...
Синус конечно таблично генерится, не как у wdrakula.
А у него и таблично, и хардварно... )))))))))
Добавлю еще функцию табличного синуса по четверти периода. А то есть любители целый период хранить.
Нашёл чем удивить... И дельта Т меняется??? ))))))))
dimax, спасибо. Буду пробовать скетч от Волшебника!
030
//уже служебные вещи, не нужно лезть, если нет знаний, тут определяем таймер и канал
031
timer_dev *dev1 = PIN_MAP[out1].timer_device;
032
uint8 cc_channel1 = PIN_MAP[out1].timer_channel
А то не лез а уже заблудился. В МАПЛЕ не нашёл или не увидел.может зрение конечно не то.
Если от корня Arduino_STM32, то вот тут:
./STM32F1/variants/generic_stm32f103c/board.cpp
А зачет это тебе?
Если задал такой вопрос, значит не понимаешь в теме. Если не понимаешь - ничего не сумеешь изменить.
И конечно, такой файл есть и в мапл и в мапл-мини. Это часть пакета ардуино-стм32, то есть программирования плат СТМ в среде ардуино.
wdrakula.
Спасибо. А что всё так безнадёжно? :)
Пока я слежу за темой, можно попросить меня пояснить или изменить что либо. К сожалению мне лень было доделывать код так, что бы все параметры и таймера и канала дма сами опредеоялись по выходному пину.
Так что, если поменяешь пин, придется менять во могих местах руками. Это собственно все, что тут нужно знать про СТМ.
wdrakula. Буду весьма признателен. Поясните пожалуйста. PB7 это вроде 2 канал. тогда что значит 32 строка. так же непонятно назначение 17ст. и 55-66 в частности (dma_cfg.tube_). также инициализация таймеров например в http://arduino.ru/forum/programmirovanie/stm32-preryvanie-po-sravneniyu-v-taimere выглядит иначе.ещё не понятно с чего начинать если понадобится допусти режим шим захвата.честно говоря думал что с ардуино проще чем к примеру с кейлом или иаром.
Нужно уточнить, что я обещал пояснения по коду, а не лекции по программированию СТМ32 в среде Ардуино.
Итак:
1. в строке з2 определячется канал таймера по пину. Ссылку я уже давал, изучай STM32duino.
2. в 17 строке декларация переменной dma_cfg. вторая (dma_cfg2) - не нужна, наследство от версии для двух каналов.
3. 55-66 - конфигурация DMA канала, Таймер 4 канал 2 соответствуют 4ому каналу DMA.
ОЧЕНЬ ПОДРОБНО ИЗУЧАЕМ rm0008 от ST! Он ищется в яндексе просто первым в выдаче по rm0008 ;).
Там написано абсолютно все про контроллер и его настройки.
4. там же про таймеры. Замечу, что прерывания таймера в этом коде не используются совсем, используется DMA.
-------------------------------------
За сим благотворительность прекращаю. Изучайте даташиты и мануалы. СТМ это не ардуино и порог вхождения гораздо выше.
Учитесь пользоваться гуглом, а не форумом.
wdrakula. Спасибо.