Такшак
Пт 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, и никто другой не заметил, что его отсутствует
Я скоро вернусь к вам
Похоже, это должно быть что -то добавленное в Arduino 1.0 API, и никто другой не заметил, что его отсутствует
Я скоро вернусь к вам
Rogerclark
Пт 8 мая 2015 г. 10:26 утра
хорошо.
Нам нужно добавить функцию для этого
Это версия SAM
Нам нужно добавить функцию для этого
Это версия 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 может быть разным,
Но вы можете также попробовать, и сообщите нам, если это смутно работает
Я могу сделать это правильно завтра, используя генератор квадратных волн в своей области, но я не могу сделать это сейчас, потому что до позднего дня, и у меня был тяжелый день
Я не тестировал это, и нам также нужно посмотреть на диссоляцию кода, чтобы увидеть, сколько цикла он занимает в каждой из петлей, которые.
Придлен код имеет 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, а затем вызовуте конкретную реализацию процессора низкого уровня материала
Но мне нужно будет поместить функцию в конкретный файл F1 или, вероятно, просто иметь обертку в Wirish_digital, а затем вызовуте конкретную реализацию процессора низкого уровня материала
Rogerclark
Сб, 09 мая 2015 г., 5:03
Ребята
К вашему сведению
Я нашел то, что кажется ошибкой в Pulsein как на AVR, так и на SAM
Я поставил проблему на GitHub
https: // github.com/arduino/arduino/voldings/3112
К вашему сведению
Я нашел то, что кажется ошибкой в 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 Так что я думаю, нам (мне) нужно посмотреть, как кодировать это. Я постановлю это в свой список
Это было реализовано.
Это изменение глубоко в ядре, поэтому я бы порекомендовал вам просто загрузить репо и заменить все ваши файлы
Примечание
Я только тестировал, используя свой осциллограф с помощью квадратной волны 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
К вашему сведению
Я нашел то, что кажется ошибкой в 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 в меру своих способностей
Да. Вы можете измерить это, либо кодируя, чтобы дождаться роста края или использовать прерывание.
Я опубликовал простой эскиз, как работает 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
Мы можем его использовать
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
Хорошо.
Это то, что нужно вести в списке для выполнения
Это то, что нужно вести в списке для выполнения