Гость MagicianT

Делаем спектроаналайзер из ардуино.

7 сообщений в этой теме

Гость MagicianT   
Гость MagicianT

Один из прошлогодних проэктов, может кому будет интересно. Видео тут: https://www.youtube.com/watch?v=r7Mm5jKa0qc

БПФ-512, плата ардуино Уно, ЖКИ-ТФТ с алиэкспресс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Q-ti    3

Частота дискретизации 20480  возможно её уменьшить ?

Как реализовать вывод на lcd в цифрах , частоты с максимальной амплитудой ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость MagicianT   
Гость MagicianT

Библиотека тестировалась на ардуино Уно, 16 МГц,  для других тактовых частот там формулу подправить маленько надо будет. Дискретизация любая, какую таймер потянет, кажется до 488 Гц можно уменьшать.

На ЖКИ вы чего хотите можете выводить, максимумы или минимумы, после вычисления амплитуд запускайте цикл фор

  for ( int i = 0; i < FFT_SIZE/dlina; i++)
   { if ( (data[i]) > peak ){
        peak = data[i];
        nbr = i;
       }

Там же в библиотеке есть код скетча

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Q-ti    3

А как же быть мне нужна частота дискретизации 240 как быть ?

Изменено пользователем Q-ti

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость MagicianT   
Гость MagicianT

Так, давайте по порядку. Здесь топик спектроаналайзера, в нём частота выборки определяется здесь

#define  SMP_RATE                20480       // Sampling Rate, in Hz
#define  SMP_TMR1 ((16000000UL/SMP_RATE) -1) // Sampling Period of Timer1

и здесь

void adc_init()
{ 
  ADMUX    = 0xC5;        // PIN 5 Analog. REF Internal. Bias = 0.55V
  ADCSRA = ((1<< ADEN)|   // 1 = ADC Enable
      (0<< ADSC)|         // ADC Start Conversion 
      (1<<ADATE)|         // 1 = ADC Auto Trigger Enable
      (0<< ADIF)|         // ADC Interrupt Flag
      (0<< ADIE)|         // ADC Interrupt Enable
      (1<<ADPS2)|
      (0<<ADPS1)|         // ADC Prescaler : 1 MHz.
      (0<<ADPS0));  
  ADCSRB = ((1<<ADTS2)|   // Sets Auto Trigger source - Timer/Counter1 Compare Match B
      (0<<ADTS1)|
      (1<<ADTS0));
  /* Set up TIMER 1 - ADC sampler */
  TIMSK0 = 0x00;
  TIMSK1 = 0x00;
  TIMSK2 = 0x00; 

  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1C = 0;

  TCCR1A =  ((1<<WGM11) | (1<<WGM10));       // Mode 15, Fast PWM
  TCCR1B =  ((1<<WGM13) | (1<<WGM12));       // Mode 15, Fast PWM

  TCCR1B |=  (1<<CS10);                      // clk/1 prescaling.
  OCR1A  = SMP_TMR1;
  OCR1B  = SMP_TMR1;

  TCNT1  = 0;
  TIFR1   |= (1<<OCF1B); 
  TIMSK1  |= (1<<OCIE1B);
}

Для низких частот преселектор таймера изменить надо, это вы сами делайте или открывайте другой топик по конфигурации таймеров на АтМеге. Регистр TCCR1C, CS10-CS11-CS12.

В примере (скетче) библиотеки всё проще

void sampling() {
  ADCSRA = 0x85;   // turn on adc, freq  = 1/32,   500 kHz/ 13.5 =~ 36 kHz sampling rate
  ADMUX = 0x40;    //Bit 5 – ADLAR: NO ADC Left Adjust Result
  ADCSRA |= (1<<ADSC);

  while(!(ADCSRA & 0x10));
  int sum2b;
  for(int i = 0; i < FFT_SIZE; i++ ) {
    while(!(ADCSRA & 0x10));
    ADCSRA |= (1<<ADSC);
    sum2b =  ADCL; 
    sum2b += (ADCH << 8);   
    f_r[i] = sum2b - sdvig;
  }  
  ADCSRA = 0x00;
}

Вопрос в том, надо в реальном времени выборки - сэмплирование делать, или можно периодически, второй вариант намного проще

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Гость Алексей
      Автор: Гость Алексей
      Помогите с прошивкой вылезает ошибка , пытаюсь собрать вот такой девайс http://cxem.net/arduino/arduino148.php
    • Гость Борис
      Автор: Гость Борис
      Народ, подскажите пожалуйста, есть задумка управления транспортерной лентой при помощи ардуино. Смысл таков: при вращении датчика скорости сигнал с опто-пары поступает на ардуино (как тахометр) и при достижении определенного кол-ва оборотов включает реле и удерживает его во включенном положении до тех пор, пока обороты не достигнут нулевого значения. Проблема состоит в написании скетча, пробовал отталкиваться от скетча на тахометр, но на включение реле не хватает тока( даже светодиод горит тускло); от скетча на прерывание опто-прерывателя реле включается когда опто-пара перекрыта и отключается, когда открыта( реле щелкает очень часто). Может кто сталкивался с подобными вещами или знает примерный код ??? 
    • Автор: Nick Iskrov
      Здравствуйте, форумчане!
      Прошу у вас помощи разобраться в проблеме с диммером лампы накаливания на основе фазового управления.
      Прикрепил схему, которую я спаял для тестов с ардуиной. Также прикрепил показания осциллографа, снятые с контактов нагрузки через делитель напряжения (с лампой в цепи и без лампы в цепи).
      При подключении лампы, напряжение на нагрузке = 0. Во всем диапазоне. Лампа загорается на 100% только когда фаза = 0. При всех остальных значениях фазы, напряжение на нагрузке = 0.
      При выключении лампы из цепи нагрузки, фазовое управление работает как надо (судя по осциллографу). Включаю лампу в цепь - диммер перестает работать, лампа загорается только в момент, когда симистор пропускает полное напряжение...
      Код ардуинки:
      #include <CyberLib.h> //Библиотека от Cyber-Place.ru volatile uint8_t tic, Dimmer1; uint8_t data; int i; void setup()  {    D4_Out; //Настраиваем порты на выход   D4_Low; //установить на выходах низкий уровень сигнала   D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль       attachInterrupt(0, detect_up, LOW);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень     StartTimer1(halfcycle, 40); //время для одного разряда ШИМ     StopTimer1(); //остановить таймер     UART_Init(115200); //инициализация порта } //********************обработчики прерываний******************************* void halfcycle()  //прерывания таймера {    tic++;  //счетчик     if(Dimmer1 < tic ) D4_High; //управляем выходом } void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту {    tic=0;             //обнулить счетчик  ResumeTimer1();   //запустить таймер  attachInterrupt(0, detect_down, HIGH);  //перепрограммировать прерывание на другой обработчик }   void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту {     StopTimer1(); //остановить таймер  D4_Low; //логический ноль на выходы  tic=0;       //обнулить счетчик  attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик }  //************************************************************************* void loop()  {Start   if (i >= 0 && i <= 200) {delay(50); Dimmer1 = i; i = i+1;}   else {i = 0;}   //Dimmer1=100;   End}    



    • Автор: Uborevich
      Доброго всем времени суток.
      Решился я на изготовление намоточного станочка для трансформаторов и катушек. Мелкая моторика после двух инсультов не дает мне заниматься такими работами.
      Загвоздка возникла с датчиком направления вращения двигателя. Где то встречал что возможно использование кода Грэя, но я далек от всего этого.
      Аппаратная платформа - ардуино уно.  Использовать буду двигатель с редуктором от дворников ВАЗ копейка. Есть в наличии герконы.
      Мое виденье такое - на вал редуктора устанавливается неодимовый магнит и на неподвижную часть пару герконов (допустим G1 и G2) при прохождении герконов магнитом отслеживаем последовательность срабатываний. Допустим - G1,G2 - это по часовой (увеличиваем счетчик оборотов), при срабатывании G2,G1 - против часовой (уменьшаем счетчик оборотов). Или два геркона мало?
      Правильно ли я рассуждаю? может есть идеи воплощенные в жизнь? Помогите пожалуйста. с железками я еще худо бедно разберусь а вот с алгоритмами  - совсем все плохо..
      Ардуино выбрана для последующего апгрейда станочка, т.е. хотелось бы сделать еще у укладку провода на шаговике в зависимости от его диаметра и длинны намотки слоя.
    • Автор: olderman
      Помогите советом. Захотел внуку машину сделать с управлением на Ардуино. Но как подключить мотор если motorshield отсутствует. Спаял мост на биполярных транзисторах. Работает, но большие потери на PN переходах. Мотор слабо тянет. Услышал про МОСФЕТы.
      Приобрел пары SI2101 и SI2102. Спаял прилагаемую схему. Оказалось, что для начала вращения мотора в ту или иную сторону, надо не только подать соответствующие противоположные (1и 0) уровни на управляющие выводы, но и кратковременно коснуться рукой или щупом осциллографа вывода с 0 уровнем (точки А и В ).После этого мотор отлично крутится до смены управляющих сигналов. И опять пуск происходит после касания соответствующей точки. Кто подскажет почему и как исправить схему.