Генератор сигналов

Тема в разделе "Arduino & Shields", создана пользователем dea94, 1 апр 2016.

  1. dea94

    dea94 Нуб

    Решил сделать генератор сигналов на Arduino DUE. Нашел скетч, но он работает как то странно. Вроде сигнал выдает, и меняется форма сигнала, но есть несколько проблем:
    1) Нормальный сигнал я могу получить только с DAC0 (или DAC1 не помню, факт что только с одного пина), со второго только какая фигня выходит.
    2) Убрал потенциометр и хочу менять частоту с точностью до десятки. Меняю Delaymicroseconds, но частота меняется не линейно, а по какой то экспоненте.
    Кто разбирается, помогите пожалуйста. Код ниже:

    Код (C++):
    /*
      Simple Waveform generator with Arduino Due

      * connect two push buttons to the digital pins 2 and 3
        with a 10 kilohm pulldown resistor to choose the waveform
        to send to the DAC0 and DAC1 channels
      * connect a 10 kilohm potentiometer to A0 to control the
        signal frequency

    */


    #include "Waveforms.h"

    #define oneHzSample 1000000/maxSamplesNum  // sample for the 1Hz signal expressed in microseconds

    const int button0 = 2, button1 = 3;
    volatile int wave0 = 0, wave1 = 0;

    int i = 0;
    int sample;


    void setup() {
      analogWriteResolution(12);  // set the analog output resolution to 12 bit (4096 levels)
      analogReadResolution(12);   // set the analog input resolution to 12 bit

      attachInterrupt(button0, wave0Select, RISING);  // Interrupt attached to the button connected to pin 2
      attachInterrupt(button1, wave1Select, RISING);  // Interrupt attached to the button connected to pin 3
    }

    void loop() {
      // Read the the potentiometer and map the value  between the maximum and the minimum sample available
      // 1 Hz is the minimum freq for the complete wave
      // 170 Hz is the maximum freq for the complete wave. Measured considering the loop and the analogRead() time
      sample = map(analogRead(A0), 0, 4095, 0, oneHzSample);
      sample = constrain(sample, 0, oneHzSample);

      analogWrite(DAC0, waveformsTable[wave0][i]);  // write the selected waveform on DAC0
      analogWrite(DAC1, waveformsTable[wave1][i]);  // write the selected waveform on DAC1

      i++;
      if(i == maxSamplesNum)  // Reset the counter to repeat the wave
        i = 0;

      delayMicroseconds(sample);  // Hold the sample value for the sample time
    }

    // function hooked to the interrupt on digital pin 2
    void wave0Select() {
      wave0++;
      if(wave0 == 4)
        wave0 = 0;
    }

    // function hooked to the interrupt on digital pin 3
    void wave1Select() {
      wave1++;
      if(wave1 == 4)
        wave1 = 0;
    }
     
  2. Unixon

    Unixon Оракул Модератор

    Повесьте вывод в DAC на таймер.
     
  3. ANV

    ANV Гуру

    F=1/T
    Вот и зависимость между delay и частотой :)