0

У меня есть устройство, и у него есть цифровое i/o, аналоговое i/o. Я посылаю на устройство ниже команды для связи. Устройство имеет модуль gpio. Мое устройство documantation является hereГенерировать прямоугольную волну для аналогового ввода/вывода на программном обеспечении

Записи на цифровой вход: gpio set/clear x
Чтение из цифрового выхода: gpio read x
прочитанных из цифрового выхода: adc read x
(х: контактный номер)

Как создать синус/квадрат волна и вычислять амплитуду? Чтобы создать квадратные волны:

  • открытое устройство
  • сна
  • записи в устройство низкого режима (t0)
  • сна
  • записи в режиме высокого устройства
  • сна
  • записи на устройство низкий уровень (t1)

период = (t1 - t0)

Это прямоугольная волна?

+0

Хмм кажется, что вы пишете SW для USB для уменьшения GPIO, поэтому это не код для MCU, а для ПК? вместо этого отправляя данные через какой-то драйвер в эту плату USB. Вы должны добавить некоторую информацию об этом, и даже retag будет хорошей идеей (если возможно, добавьте имя устройства в теги).так что теперь я не уверен, что мой ответ хорош для этого (могут возникнуть проблемы с синхронизацией). Вы - синхронный порт ввода-вывода устройства или асинхронный (вы устанавливаете время, когда IO должен переключать или читать или когда вы отправляете команду, тогда это выполнено + некоторая задержка грубой?) – Spektre

ответ

1

кажется ваш пример действительно меандр

, если write to device low mode(t0) устанавливает выходной контакт с низким и write to device low mode(t1) к высокому или обратному, то период сумма спит + некоторое время для создания GPIO состояния. Не знаю, почему у вас есть время находящихся внутри GPIO набора линий, а не в снах ... (может быть что-то зависят от платформы?)

Для перехода к греху волне

использования DAC или PWM + RC-фильтр с некоторой предварительно вычисленной таблицей амплитуд, в которой индекс периодически увеличивается.

BYTE sintab[32]={ 128,...,255,...,128,...,0,....,127 }; 

кодируются: 128 равен нулю, 255 является +1 и 0 является -1; теперь только добавить индекс:

int ix=0' 

и один раз в некоторое время (на какой-то таймер, возможно) увеличить его и установите выход на новое значение:

ix=(ix+1)&31; 

что и 31 просто вызвать Тхо цикла индекс от начала снова, если конец достигнут (синтаб должен иметь размер 2). Период частота таймера/sintab размер

[ноты]

Вы можете изменить это для ваших целей, например, сделать sintab[][] 2D-массив, где первый индекс означает, что амплитуда и второй является ix как сейчас.На старых платформах (MCU), вы можете кодировать PWM последовательность непосредственно sintab конца так далее ...

Вы можете предварительно вычислить sintab значения, как это:

sintab[ix]=128.0+127.0*sin(float(2.0*M_PI*ix)/32.0); 

или если ваши опоры платформы достаточно быстро sin вы можете использовать выше линии непосредственно без фактического массива ...

[edit1]

для sinwave можно использовать только 0/1. Если вам нужен аналоговый выход и:

  1. У вас есть ЦАП (цифро-аналоговый преобразователь)

    затем отправить фактическую амплитуду к ней, как dac write sintab[ix]; что создаст аналоговое напряжение на выходном контакте для вас ,

  2. Вы не имеете запасной ЦАП использование ШИМ широтно-импульсной модуляции вместо

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

    Выходное значение является совокупным энергии/напряжения за временной кусок, чтобы вы генерировать сигнал

    • соотношение прямоугольных 1: 1 означает, что половина период представляет собой Н, а остальные л
    • отношение 2: 1 означает, что 2/3 периода представляет собой Н, а остальные л

    Чем больше времени выходной сигнал представляет собой Н, тем больше выходное значение. Это все еще цифровой выход, но если вы подключите к нему какое-либо нелинейное устройство, такое как конденсатор или катушка, тогда energy inertia приведет к снижению напряжения H до некоторого уровня в зависимости от коэффициента квадратной волны. Наиболее распространенным является RC фильтр (R является серийным и C является параллельным земле). Если вы хотите намотать катушку (мотор), вам не нужен фильтр. Этот вид использования, как правило, генерируют высокий звук основного тона (частота ШИМ) часто слышал вблизи машин ...

    img

    PWM частота должна быть достаточно высокой (во много раз выше, чем в sinwave частоты)

Некоторый код для ШИМ с амплитудой и частотой настройки:

const int timer_T=1;  // used timer interval [ms] 
const int PWM_max=10;  // PWM max amplitude+1 
int PWM_s=0;     // PWM actual step 
int PWM_t=0;     // PWM actual time 

int PWM_a=3;     // PWM amplitude <0,PWM_ratio_max) 
int PWM_T=200;    // PWM period [ms] 

void OnTimer() 
{ 
int PWM_T0=PWM_T/PWM_max; // PWM step period must be >=1 !!! 
PWM_t+=timer_T; 
if (PWM_t>=PWM_T0) 
    { 
    if (PWM_s<=pwm_a) gpio set x; else gpio clear x; 
    PWM_s++; if (PWM_s>=PWM_max) PWM_s=0; 
    PWM_t-=PWM_T0; 
    } 
} 
+0

Я не понимаю, как я использую таблицу sin. Я могу установить вывод только 0 или 1. Но цифры в таблице разные. Например, число равно 128, если я должен установить «0»? – Sdn

+0

Я добавляю документацию устройства. – Sdn

+0

@sdn сделано редактирование – Spektre