STM32F103 BPSK

Жан-Поль
Чт 10 августа 2017 г., 20:39
Привет,

Я хотел бы сделать BPSK с синей доской для таблеток для ультразвукового проекта.

Мне удалось генерировать сигнал 40 кГц ШИМ, и я хотел бы модулировать фазу каждого импульса (максимум 10-30 импульсов). Как вы думаете, это возможно с STM32F1? Я видел этот проект https: // github.com/chrismicro/bluepillsound/ где он генерирует несколько королей сигнала, но он работает на более низких частотах.

Большое спасибо,
Жан-Поль

Chismicro
Пт 11 августа 2017 г. 6:32
Привет, Жан-Поль,
вероятно, нет необходимости использовать PWM.
Вы можете просто использовать цифровые уровни в качестве вывода.
Фазовый сдвиг может быть сделан дискретным. Разрешение таймера при 72 МГц растолости до 40 кГц, часто должна быть достаточно точной.
Ваше здоровье,
Chismicro

Жан-Поль
Пт 11 августа 2017 г. 10:10
Привет, Крис,

Мне нужно делать другие вещи, пока генерируется ШИМ, поэтому я не могу иметь блокировку DigitalWrite.

Спасибо,
Жан-Поль

Chismicro
Пт 11 августа 2017 г. 10:35 утра
Одним из возможных решений может быть использование аппаратного таймера с прерыванием 80 кГц и переключать булавку вручную. С этим прерыванием вы также можете очень легко реализовать фазовый сдвиг на 180 °.
Есть примеры аппаратного таймера в Rogers Repo и таймер Hal-Hardware с прерыванием в STM32Generic Repo.

Жан-Поль
Пт 11 августа 2017 г. 11:05
Привет,

Хорошо, спасибо, кажется, работает. Я настрою таймер1, чтобы вызвать этот ISR:
void handler_ISR(void) { static uint8_t count = 0; digitalWrite(PA8, raw_pulse[count]); digitalWrite(PB13, !raw_pulse[count]); count++; if (count >= 70){ count = 0; timer.pause(); } }

Rogerclark
Пт 11 августа 2017 г. 11:24
Я не знаю, поможет ли это, но был запрос (в другой теме), чтобы иметь возможность установить частоту ШИМ с помощью вызова API, и я написал код для этого, но я не добавил ее в Мастер репо еще.

Но это не изменяет фазу, он просто позволяет любой FREQ до 280 кГц для PWM.

Если у меня будет время на выходных, я добавлю API для этого

Chismicro
Пт 11 августа 2017 г. 15:03
Если у меня будет время на выходных, я добавлю API для этого Было бы действительно хорошо, если бы вы могли рекламировать аудио -ШИМ. Это означает прерывание после каждого образца для обновления значения.
Я сделал почти что -то подобное здесь. За исключением того, что это прерывание «бит» вместо ШИМ, которое удваивает нагрузку прерываний и не обеспечивает рельс для рельса ШИМ (расстояние должно быть сохранено во времени = 0 или времени = период).
Для аудио 280 кГц было бы слишком много, потому что это вызывает высокую нагрузку прерываний. Что -то, что задействовало 48 кГц, было бы достаточно.

Rogerclark
Пт 11 августа 2017 г. 11:35
Крис

Аудио Шм было бы интересно.

Я вижу, что у вас есть библиотека, которая проводит звук PWM, поэтому я не уверен, подходит ли мне просто включить код в ядро.

Я предполагаю, что это зависит от того, насколько он велик, и значит ли он больше такого мигального эскиза, поскольку сообщество, как правило, против раздувания кода ядра.

Chismicro
Сб 12 августа 2017 г. 7:13
Я вижу, у вас есть библиотека, которая делает аудио PWM Вы имеете в виду это один?
Это не должно быть библиотекой. Это скорее коллекция примеров кода, где я пробовал много шаг за шагом, чтобы как -то звучать из чертежа.
До этого я сделал это для различных архитектур MCU с упомянутым прерыванием ШИМ, но каждый раз, когда его запустил трудный способ.
На этот раз я не хотел делать это снова и пытался обойти материал, связанный с глубоким микроконтроллером и попытался использовать то, что было доступно (в конце оказалось, что я должен был начать с STM-Cube, который, вероятно, не стоил бы мне больше времени).
Если бы был пример в вашем репо STM32, показывающем, как вывести синусоидальную волну или вал, это спасло бы мне много часов экспериментов.
Пока было бы очень полезно, если бы вы могли включить простые примеры аудио (синусоидальная, модулированная синусоидальная волна в прерывании, вывод WAV-файла) в вашем репо.
Взятие некоторого из более интересного примера из моего репо потребует серьезной уборки, я думаю, потому что у них все еще есть не очень элегантные остатки процесса разработки внутри.

Жан-Поль
Сб 12 августа 2017 г. 8:57
Привет,

Я использовал Fastwrite Fonction, который вы написали. BPSK работает, но у меня есть проблема, мне нужно 2 выхода с фазовым сдвигом на 180 °, поэтому я сделал в прерывании:
fastWrite(PIN_A, raw_pulse[count]); fastWrite(PIN_B, !raw_pulse[count]);

Пито
Сб 12 августа 2017 г. 10:02
Создайте 2 бита на основе значений вашего массива, а затем напишите их в порт за одну запись..
Используйте контакты одного порта - прочитайте порт, измените 2 бита, напишите обратно.

Или используйте специальные инструкции по манипуляциям с портами:
http: // www.STM32duino.com/viewtopic.PHP?t = 1220

Chismicro
Сб 12 августа 2017 г. 10:26 утра
но у него есть задержка около 2-3 мкс между двумя изменениями. Как вы думаете, можно уменьшить эту задержку и синхронизировать 2 выхода? Pitos Way - самый быстрый, но задержки в больших времени возникают потому, что вы читаете булавки перед написанием. Если бы вы подготовили биты в двух переменных перед написанием, это было бы намного быстрее.

КСТАТИ.: Почему вы хотите передавать данные с помощью ультразвука? Какое приложение?

Пито
Сб 12 августа 2017 г. 10:33
Одна вещь - это время для подготовки 2 бита для записи, а другая - задержка между фазами.
Задержка между фазами будет 0NS, если вы используете отдельный порт и написание битов с 1 инструкцией.

Пример:
.. // prepare the pin values, output pins are PB1 (in phase) and PB0 (phase + 180deg) uint32_t data = ((raw_pulse[count] & 0x1) << 1 ) + (!(raw_pulse[count] & 0x1)); uint32_t result = GPIOB->regs->IDR; // read the entire PB port result = (result & 0xFFFFFFFC) | data; // modify PB1 and PB0 with your values only GPIOB->regs->ODR = result; // single instruction write back to the port PB ..

Жан-Поль
Сб 12 августа 2017 г. 13:14
Привет,

Спасибо, я попробовал код Пито, и он работает. За задержку я не думаю, что это проблема, потому что она будет в каждом прерывании, поэтому все данные отправляются с задержкой, но форма волны сохраняется правильной.

Я делаю измерение ультразвукового расстояния с фазовым кодированием. Я хотел бы повысить точность и диапазон датчика HC-SR04 с использованием кодов Barker.

Благодарить,
Жан-Поль

Пито
Сб 12 августа 2017 г. 13:49
Изум будет дрожать, вызванное моментом, когда прерывание фактически запускает рутину ISR.
Это может немного модулировать ваш сигнал (продолжительность битов будет различаться).
Отключение других прерываний (Systick, USB..) может также помочь..

Chismicro
Сб 12 августа 2017 г. 13:58
340 м/с * 1e-6s = 0.34 мм
это означает 0.34 мм при точке времени 1US Time. Я думаю, что прерывание намного точнее 1US (если не блокировано), и я бы не ожидал влияния.
Я делаю измерение ультразвукового расстояния с фазовым кодированием. Я хотел бы повысить точность и диапазон датчика HC-SR04 с использованием кодов Barker. Интересный .. Что в настоящее время является точностью HC-SR04 ?

Пито
Сб 12 августа 2017 г. 14:16
Интересное чтение: http: // www.академия.edu/28754009/an_int ... IC_Signals
Кодовая страница Barker 27, HW Inc. Ардуино :) со страницы 45 ..
Где -нибудь есть PDF??

Chismicro
Сб 12 августа 2017 г. 14:30
Потому что это интересно, я подключаю американского отправителя с чертежом и записал сигнал с помощью Bitscope:
Изображение

Синий: 24 импульсного сигнала
Красный: сдвиг фазы на 180 ° после 12 импульсов

Пито
Сб 12 августа 2017 г. 14:32
США - Сделано в США или Ультра?? :)
Вы отправили код Barker?
B13 = 1111100110101

Жан-Поль
Сб 12 августа 2017 г. 14:38
Крис,

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

Я не понимаю тебя сюжет? Что красное? Полученный сигнал ?

Жан-Поль

Chismicro
Сб 12 августа 2017 г. 15:33
US = Ultra Sound

Красные и синие получены сигналы. Смотрите код:
/* US modulatéd sender hardware: STM32F103 BluePill, 72Mhz Arduino Framework: STM32GENERIC Aug. 2017 ChrisMicro */ #include "HardwareTimer.h" #define SOUNDPIN PB1 #define SIGNALLENGTH 24 uint8_t Signal[SIGNALLENGTH]; int SignalIndex = 0; void interrupt() { if (SignalIndex < SIGNALLENGTH) { digitalWrite(SOUNDPIN,Signal[SignalIndex]); SignalIndex++; } } void setup() { pinMode(LED_BUILTIN, OUTPUT); pinMode(SOUNDPIN, OUTPUT); // T=1/f = 1/40000 int frequency_Hz = 40000; //Timer1.setPeriod(1000000/frequency_Hz/2); // half period interrupt Timer1.setPeriod(6); // 41.67khZ half period interrupt ( error of factor 2 in setPeriod ) Timer1.attachInterrupt(interrupt); Timer1.resume(); } void loop() { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // blue signal for (int n = 0; n < SIGNALLENGTH; n++) { Signal[n] = n & 0x01; // zero degree phase signal } SignalIndex = 0; // send new Signal delay(10); // red signal for (int n = 0; n < SIGNALLENGTH; n++) { if (n < SIGNALLENGTH / 2) Signal[n] = n & 0x01; // zero degree phase signal else Signal[n]=(n-1) & 0x01; // 180 degree phase signal } SignalIndex = 0; // send new Signal delay(10); }

Жан-Поль
Сб 12 августа 2017 г., 19:10
О, хорошо, я вижу.
Это то, что я получил:
Отправил пульс
Изображение
Отправлен и получен около 1.7 м, с данными 20 мс.
Изображение

Я думаю, что у США есть проблемы со сменой фазы на 180 °. Я думаю, что лучше сдвиг частоты, но эти датчики с низкой полосой.

Жан-Поль

Chismicro
Сб 12 августа 2017 г. 9:51 вечера
Хорошие картинки. Мое впечатление состоит в том, что преобразователи не подходят ни для фазового кодирования, ни для частотного кодирования. У них слишком большой саморезонанс.
Если ваша цель - это реализовать позиционирование в помещении, новым способом является использование времени измерения полета UWB. В настоящее время есть первые доски приложений, также пригодные для использования с Arduino:
https: // www.Декававе.com/продукты/обзор

Rogerclark
Сб 12 августа 2017 г. 22:03
Decawave выглядит интересно, но довольно дорого.

Другой вариант - время на основе лазерной основы от STM от STM.
Есть еще одна ветка об использовании этих,
У меня есть часть длинной версии, но диапазон ограничен ниже 2 м

Жан-Поль
Солнце 13 августа 2017 г. 11:31
Да, вы правы, я попытался отправить еще одну частоту, и она резонансирует в другой с большим количеством гармоник!

БПК импульсов при 41 кГц
Изображение


БПК импульсов при 44 кГц
Изображение

Мне нужно найти лучший преобразователь...

Chismicro
Пн 14 августа 2017 г. 14:55
Я просто ищу схему HC-SR04.
Может ли это быть правильным?
Изображение

Жан-Поль
Ср 16 августа 2017 г., 6:35
Привет,

Да, я думаю, что это правильно. Но на моем у меня нет двух транзисторов!

ZMEMW16
Ср 16 августа 2017 г. 15:31
Я видел пакеты SMD с дополнительными транзисторами в них.
SRP

Chismicro
Чт 17 августа 2017 г. 5:06 утра
Да, я думаю, что это правильно. Но на моем у меня нет двух транзисторов! Я думаю, что Q1 предназначен только для адаптации порогового уровня, которая, вероятно, не является действительно необходимым, и Q2 для экономии питания, который они удалили, чтобы сэкономить расходы.
Интересным моментом является драйвер MAX232 RS232, который они злоупотребляют в качестве драйвера отправителя.