[Решен] Pulsein (нераствование)

Такшак
Пт 8 мая 2015 г., 7:34
Я пытаюсь взаимодействовать с датчиком ультразвукового расстояния HC-SR04 с моей платой STM32F103C8T6 с использованием Arduino IDE... Для получения длины импульса сигнала Echo (время взято) используется метод Pulsein, но Pulsein находится в списке TODO на официальном сайте Maple. Так есть ли альтернативы для этого...?

Пробовал изменить код, но вывод всегда показывает "вне диапазона".
*/ #define trigPin PA6 #define echoPin PA7 #define led PA4 #define led2 PB0 void setup() {   pinMode(trigPin, OUTPUT);   pinMode(echoPin, INPUT);   pinMode(led, OUTPUT);   pinMode(led2, OUTPUT);   Serial.begin (115200); }

Мадиас
Пт, 8 мая 2015 г., 9:40
...Просто мое быстрое думание: работает ли утрасонный работает с 3.3 В вместо 5 В?

Rogerclark
Пт 8 мая 2015 г. 10:11
ммм

Похоже, это должно быть что -то добавленное в Arduino 1.0 API, и никто другой не заметил, что его отсутствует ;-)

Я скоро вернусь к вам

Rogerclark
Пт 8 мая 2015 г. 10:26 утра
хорошо.

Нам нужно добавить функцию для этого

Это версия SAM
/* Copyright (c) 2011 Arduino. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "Arduino.h" #include "wiring_private.h" /* Measures the length (in microseconds) of a pulse on the pin; state is HIGH * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds * to 3 minutes in length, but must be called at least a few dozen microseconds * before the start of the pulse. */ extern uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) { // cache the port and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling // digitalRead() instead yields much coarser resolution. PinDescription p = g_APinDescription[pin]; uint32_t width = 0; // keep initialization out of time critical area // convert the timeout from microseconds to a number of times through // the initial loop; it takes 22 clock cycles per iteration. uint32_t numloops = 0; uint32_t maxloops = microsecondsToClockCycles(timeout) / 22; // wait for any previous pulse to end while (PIO_Get(p.pPort, PIO_INPUT, p.ulPin) == state) if (numloops++ == maxloops) return 0; // wait for the pulse to start while (PIO_Get(p.pPort, PIO_INPUT, p.ulPin) != state) if (numloops++ == maxloops) return 0; // wait for the pulse to stop while (PIO_Get(p.pPort, PIO_INPUT, p.ulPin) == state) { if (numloops++ == maxloops) return 0; width++; } // convert the reading to microseconds. The loop has been determined // to be 52 clock cycles long and have about 16 clocks between the edge // and the start of the loop. There will be some error introduced by // the interrupt handlers. return clockCyclesToMicroseconds(width * 52 + 16); }

Rogerclark
Пт 8 мая 2015 г., 11:30 утра
Вот мой первый проход в Pulsein
#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) #define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) ) #define microsecondsToClockCycles(a) ( (a) * (F_CPU / 1000000L) ) /* Measures the length (in microseconds) of a pulse on the pin; state is HIGH * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds * to 3 minutes in length, but must be called at least a few dozen microseconds * before the start of the pulse. */ uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) { // cache the port and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling // digitalRead() instead yields much coarser resolution. gpio_dev *dev=PIN_MAP[pin].gpio_device; uint32_t bit = (1U << PIN_MAP[pin].gpio_bit); uint32_t width = 0; // keep initialization out of time critical area // convert the timeout from microseconds to a number of times through // the initial loop; it takes 22 clock cycles per iteration. uint32_t numloops = 0; uint32_t maxloops = microsecondsToClockCycles(timeout) / 22; // wait for any previous pulse to end while ( (dev->regs->IDR & bit) == state) if (numloops++ == maxloops) return 0; // wait for the pulse to start while ((dev->regs->IDR & bit) != state) if (numloops++ == maxloops) return 0; // wait for the pulse to stop while ((dev->regs->IDR & bit) == state) { if (numloops++ == maxloops) return 0; width++; } // convert the reading to microseconds. The loop has been determined // to be 52 clock cycles long and have about 16 clocks between the edge // and the start of the loop. There will be some error introduced by // the interrupt handlers. return clockCyclesToMicroseconds(width * 52 + 16); }

Такшак
Пт, 8 мая 2015 г., 11:56 утра
Rogerclark написал:Вот мой первый проход в Pulsein

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

Придлен код имеет 16 циклов за петлю, STM32 может быть разным,


Но вы можете также попробовать, и сообщите нам, если это смутно работает

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

Такшак
Пт 8 мая 2015 г., 11:57
Мадиас написал:...Просто мое быстрое думание: работает ли утрасонный работает с 3.3 В вместо 5 В?

Zoomx
Пт, 8 мая 2015 г. 15:27
Мадиас написал:...Просто мое быстрое думание: работает ли утрасонный работает с 3.3 В вместо 5 В?

Rogerclark
Сб 09 мая 2015 г. 2:10
Версия Pulsein, которую я опубликовал, не сработала, потому что я неправильно понял, как одна из функций pio_get в Die Works, я просто собираюсь использовать прямой GPIO, так как она будет быстрее, и у нас нет функции pio_get

Но мне нужно будет поместить функцию в конкретный файл F1 или, вероятно, просто иметь обертку в Wirish_digital, а затем вызовуте конкретную реализацию процессора низкого уровня материала

Rogerclark
Сб, 09 мая 2015 г., 5:03
Ребята

К вашему сведению

Я нашел то, что кажется ошибкой в ​​Pulsein как на AVR, так и на SAM

Я поставил проблему на GitHub

https: // github.com/arduino/arduino/voldings/3112

Rogerclark
Сб 09 мая 2015 г. 5:15 утра
ХОРОШО

Это было реализовано.

Это изменение глубоко в ядре, поэтому я бы порекомендовал вам просто загрузить репо и заменить все ваши файлы


Примечание


Я только тестировал, используя свой осциллограф с помощью квадратной волны 1 кГц, но я калибровал на это.

Я не думаю, что Pulsein гарантированно будет настолько точным либо для AVR, либо с учетом, так как это не учитывает время для любых прерываний.
Но я использовал тот же базовый код, что и AVR и Due (SAM), поэтому реализация должна дать аналогичные результаты с причтенными

Я заметил, что по разным причинам зарегистрировано не менее 10 ошибок, зарегистрированных на GitHub, и я зарегистрировал другой, потому что AVR и Due Cod.

Редактировать

Глядя на старый сайт Leaflabs, похоже, что 2 другие функции не реализованы

Tone (): Todo
notone (): todo
pulsein (): todo
Так что я думаю, нам (мне) нужно посмотреть, как кодировать это. Я постановлю это в свой список ;-)

Такшак
Сб 09 мая 2015 г. 8:34 утра
Rogerclark написал:Ребята

К вашему сведению

Я нашел то, что кажется ошибкой в ​​Pulsein как на AVR, так и на SAM

Я поставил проблему на GitHub

https: // github.com/arduino/arduino/voldings/3112

Rogerclark
Сб 9 мая 2015 г., 9:28
Мой датчик выводит квадратную волну с высокой длиной периода, равным временной задержке

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

Я опубликовал простой эскиз, как работает ViewTopic.PHP?F = 44&t = 106

Портирование Newping - это отдельная проблема, так как его AVR и, вероятно, использует прерывания

У STM32 есть несколько причудливых функций, в которых водопроводные таймеры могут использовать внешние прерывания, однако на данный момент я подумал, что это было наиболее целесообразно только для переноса кода Arduino (SAM) в STM32 для наибольшей совместимости

Пожалуйста, не стесняйтесь писать версию или Newping и т. Д., Который использует аппаратное обеспечение STM32 в меру своих способностей

Rogerclark
Сб 30 мая 2015 г., 7:11 утра
Теперь кажется, что версия сборки на должность

https: // github.com/arduino/arduino/comm ... BA533D12EF

Мы можем его использовать

Zoomx
Сб 30 мая 2015 г. 13:27
* AVR+SAM: reworked pulseIn() function to become GCC agnostic * AVR+SAM: added pulseInLong() (based on micros()) to help getting good results in interrupt-prone environments

Rogerclark
Сб 30 мая 2015 г., 21:29
Хорошо.

Это то, что нужно вести в списке для выполнения