Jump to content
astrgan

Какие Есть Способы Регулировать Частоту Синусоиды?.

Recommended Posts

Какие есть способы регулировании частоты синусоиды, которая генерирует с помощью шим?

Хочу сделать чтобы один счетчик (который будет работать в режиме сброс при совпадении) тактировал другой.

Получится что один счетчик будет как бы делителям частоты для другого, на котором сделан шим.

Share this post


Link to post
Share on other sites

Видимо, имелось в виду "генерируетСЯ с помощью ШИМ"?

Так и поступают - один счётчик (N) считает период до какого-то Nmax (хотя на практике считают четверть периода или реже половину, если синус хранится табличкой), а второй уже непосредственно генерирует ШИМ со скважностью, зависящей от показаний первого счётчика и текущего четвертьпериода. Но максимальная частота будет невелика, в 90% случаев проще на микроконтроллере реализовать DDS.

Share this post


Link to post
Share on other sites

А в любом случае и получится цифровой синтез, независимо от программного способа реализации...

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

DDS позволяет более точно указывать частоту, а любой другой способ - только кратные после деления опорной...

Ознакомься все же с принципом DDS - он вообще не имеет отношения к способу формирования выходного сигнала, таблица синуса и ЦАП(в виде ШИМ) неизменны для любого способа формирования синуса на выходе. Только DDS позволяет установить частоту более мелкими шагами - дробную по отношению к опорной частоте, особенно при формировании низкочастотных сигналов.

Share this post


Link to post
Share on other sites

Ну удачи в получении стабильной частоты, не кратной опорке, используя чисто программные методы :)

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

Ну удачи в получении стабильной частоты, не кратной опорке, используя чисто программные методы :)

А как лучше сделать?

Share this post


Link to post
Share on other sites

Ну удачи в получении стабильной частоты, не кратной опорке, используя чисто программные методы :)

Не кратной, разумеется, невозможно, но некоторые методы позволяют нам использовать бОльшие числа в этой рациональной дроби, что даёт лучшее приближение :) С увеличением разрядности счётчиков в какой-то момент стабильность опорного генератора становится сравнима с шагом синтезируемой частоты и все разговоры о "кратности" и "дискретности" теряют смысл.

Share this post


Link to post
Share on other sites

А собственно, почему частота не должна быть стабильной? Она будет стабильной ровно на столько на сколько стабилен опорный генератор.

Share this post


Link to post
Share on other sites

Так каким методом нужно регулировать частоту полученной синусоиды???

Может ктонимбуть описать как лучше сделать?

Share this post


Link to post
Share on other sites

Я правильно понимаю принцип DDS:

1) Таймер считает до определенного значения.

2) Берется значение из таблицы синуса.

3) Выводится на цап.

4) Повтор

Share this post


Link to post
Share on other sites

нет, не так... в сумматоре(как правило 32 бит) постоянно накапливается фаза, и каждый такт берутся старшие биты сумматора и по ним берется из таблицы значение синуса и выводится на ЦАП(8-16-24 бит).

В зависимости от того какое число будет суммироваться постоянно в сумматоре зависит частота переполнения, а значит и частота выходного сигнала. Суть в том что после переполнения, остается еще какое-то значение фазы в младших разрядах и следующее переполнение произойдет несколько раньше нежели суммировать целые числа. Если прибавлять в 32-битном сумматоре просто "1" то переполнятся он будет каждые 4млрд тактов при частоте суммирования в 100Мгц какая это частота будет? ну какие-то милигерцы... если прибавлять "10" - частота будет ровно в 10 раз больше. А если прибавлять "42354" ? вот и считай...

Share this post


Link to post
Share on other sites

Массив тоже должен быть 32 битным т.е. состоять из 8556380160 элементов?

Можно сделать на 8-битном avr задействовав три регистра?

Хотя порты же 8-битные. Значит получится только 8 битный сделать.

Edited by astrgan

Share this post


Link to post
Share on other sites

нет, не так... в сумматоре(как правило 32 бит) постоянно накапливается фаза, и каждый такт берутся старшие биты сумматора и по ним берется из таблицы значение синуса и выводится на ЦАП(8-16-24 бит).

Хорошая реализация, чем то смахивает на алгоритм Брезенхема. А я всегда менял частоту выборки из таблицы с помощью таймера, как не додумался... :rolleyes:

Спасибо !

Share this post


Link to post
Share on other sites

Так будет правельно?

.include "m128def.inc"

.def zero       = r7
.def accumulator = R8
.def index_frequency = R16
.def conct = R17

       LDI R16,0b11111111
       OUT DDRB,R16

       CLR zero
       CLR accumulator
       LDI index_frequency,1
       LDI conct,255
DDS_CYCLE:

       LDI ZL,low(MAS1<<1)
       LDI ZH,high(MAS1<<1)
       ADD ZL,accumulator
       ADC ZH,zero
       LPM
       OUT PORTB,R0
       ADD accumulator,index_frequency
       CPSE accumulator,conct
       RJMP DDS_CYCLE

       CLR accumulator
       RJMP DDS_CYCLE

MAS1:
.db 131,        134,    137,    140,    143,    146,    149,    152,    155,    158,    162,    165,    167,    170,... (255 элементов)

синус.rar

avr.rar

Share this post


Link to post
Share on other sites

Так работает аппаратный DDS - только в аппаратной реализации можно обеспечить максимальную скорость счета. С частотой тактового генератора например. А при реализации в контроллере эта частота счета будет зависеть от скорости алгоритма, и едва ли быстрее чем тактовая частота контроллера деленная на 10-20. И это в лучшем случае. Т.е. аппаратный сумматор построенный на самой медленной ПЛИС будет работать быстрее чем алгоритм на микроконтроллере.

А если какие-то задержки неконтроллируемые в алгоритме будут? Появится джиттер в генерируемом сигнале, или вообще частотная модуляция(если алгоритм суммирования будет зависеть от операндов).

Таблица синусоиды на выходе можешь выбирать любую - разрядностью кратную двойке, т.е. 2048 ячеек, 4096 ячеек и т.д. просто бери выход сумматора необходимое количество старших бит. Да, и не обязательно 32-битный сумматор использовать, если не нужен мелкий шаг то можно использовать сумматор на 16-24 бит и таблицу синуса на 256 значений с 8-битным ЦАП.

Share this post


Link to post
Share on other sites

Если сумматор 16 бит, то таблицу из 256 значений просто прогнать два раза за один цикл?

Share this post


Link to post
Share on other sites

Два раза за какой цикл? Просто берешь старшие разряды сумматора и КАЖДЫЙ такт суммирования на выходе имеется нужное значение которое можно применить к таблице.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Павел Лопатин
      Добрый день!
      Подскажите, пожалуйста, можно ли вынести переменный резистор 16K1-B10K, L20KC, 10 кОм с ШИМ регулятора на отдельную плату? 
      Какие провода лучше использовать? На какое расстояние можно вынести (длина провода) и изменятся ли от этого характеристики? (все-таки, как я понимаю, появится дополнительное сопротивление от провода)
      ШИМ покупной в RDC2-0024 - фото и схема в аттаче
      DOC002726141.pdf
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • Guest Денис
      By Guest Денис
      В общем, есть такое чудо китайской техники (фото)
      Что оно может:
      1. Заряжаться через microUSB порт
      2. Кнопка вкл/выкл, она же переключает режимы
      3. 3 режима свечения светодиода (он светит разными цветами)
      Что я хочу сделать:
      1. Пункты 1 и 2 выше
      2. Разнообразить количество режимов, переливание статичный цвет и тд...
      Вопрос: как это сделать? что купить?

      P.S. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


  • Сообщения

    • Ребят а вообще с чем этот возбуд та связан.
    • Зарегился молодой пользователь со сверхмалым весом. https://forum.cxem.net/index.php?/profile/242093-หนุ่มกิโลสี่-บุญยัง/    
    • где-то я уже видел этот желтый трансформатор (от электрического стула, ага) потом вспомнил, что в одном из видосов креосана, где он ходил к товарищу-высоковольтнику, фигурировало данное оборудование. после фото обладателя сомнения отпали, известная личность, как никак. что бы там не говорили недовольные терпилы - за одну только коллекцию мощнейшего советского оборудования (лампы, тиратроны, конденсаторы, трансформаторы... эх, мечта) респект и уважуха, а за проделанную работу уж тем более!   
    • На кондее есть, но она для другого двигателя и с другой цветовой маркировкой. Исходный движок сгорел(обрыв) На картинке- подключение штатного двигла.
    • Вряд ли. Просто в последнее время в магазинах появилось большое число малогабаритных импульсных зарядных устройств по цене менее $50. И тема потеряла актуальность. Тем не менее, в одной из последующих версий мне удалось таки разработать вариант с очень хорошим стабилизатором тока зарядки на базе нелинейного И-регулятора. Именно этот вариант я упоминал 14 октября 2015 года. Схема, разумеется, усложнилась, хотя и не катастрофически. Причем, в ней по-прежнему нет ни одного операционного усилителя, – своего рода продолжение деревенско-гаражной традиции. Нет в ней и привычного сложного в изготовлении и сильно греющегося датчика тока. В качестве шунта запланирован либо амперметр, либо вообще провод сечением 1,5мм2 и длиной 4,5м, который все равно нужно использовать для подключения аккумулятора. Разработка этой схемы – это у меня теперь такое развлечение в обеденный перерыв. Благо, мощный компьютер всегда доступен.
    • Устройство для ручной подачи припоя. Припой диаметром 1 мм наматывается на катушку от 13 мм ленты для пишущих машинок и помещается в их же коробочку. В коробочке сверлится отверстие 2,5 мм для выхода припоя. В куске изоленты проделывается отверстие и коробочка оборачивается с краёв  для фиксации крышки. Нужное количество припоя  вытягивается вручную. На катушку помещается около 15 м припоя диаметром 1 мм. Диаметр  готового устройства 55 мм, толщина 20 мм. Остальное понятно по фото.
    • почему же не стабилитрон  затвор - эмиттер ?. реальная схема  Lenze . :
  • Покупай!

×
×
  • Create New...