Тахометр на эффекте Холла

Efftek
Чт, 3 августа 2017 г., 22:47
Привет,

Я не хочу изобретать колесо, но не нашел кода для STM32Duino, используя датчик эффекта Холла для измерения RPM, просто код для Arduinos.

У кого -нибудь есть рабочий код для расчета RPM с датчика эффекта Холла? Как правило, я хочу попробовать в течение 3-5 секунд и рассчитать обороты по количеству импульсов из датчика.

Ура, Стив.

Rogerclark
Чт, 3 августа 2017 г., 22:54
Пожалуйста, используйте Google для поиска форума

По крайней мере, один другой человек делает что -то подобное

Олли
Пт, 04 августа 2017 г. 14:40
Efftek,

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

Вот список решений, которые вы можете использовать для скорости (и измерения положения)
  • Прерывание, которое вызвано датчиком Холла. Увеличить счетчик 32 или 64 бит в каждом прерывании.
    При расчете RPM Рассчитайте время дельты и количество дельты.
    В случае 32 -битного счетчика игнорируйте обертку. Счет дельты будет справляться с этим по своей природе.
  • Таймер подключен к датчику Холла. Счетчик таймера увеличивается датчиком.
  • Если в дополнение к скорости (оборотной линии) необходимо положение, то вам нужно использовать два датчика Холла для квадратурного кодирования
    > Прерывания могут использоваться для расчета скорости и положений
    > Таймеры имеют специальный режим для квадратурного кодирования, но скорость не может быть измерена одновременно
Я разработал контроллеры двигателя постоянного тока (30 В, 15А), используя квадратурные энкодеры датчика Холла, подключенные к прерываниям в следующих конфигурациях
- 2 двигателя от Teensy 3.2
- 4 двигателя от Teensy 3.5
- 6 двигателей от STM32F407VE (Blue Pad)

С внутренним знанием магнитов, управляющих датчиками Холла, я могу иметь точное показание скорости на миллисекундном уровне, это требует много специальных реализаций, которые не имеют отношения к показаниям RPM с 3-5 секундными интервалами.

Efftek
Пт, 04 августа 2017 г., 16:18
Спасибо, Олли

По сути, я хочу взять вибрационное чтение с машины с переменной скоростью. FMAX (максимальная частота в спектрах БПК) будет зависеть от скорости машины. Мне нужно читать скорость только раз в пять минут или около того, когда требуется чтение вибрации. То, как я думал о том, что это следующее

Начните искать (опрос) на моем входном выводе
Подождите, пока он не поднимется и установите время начала
Применить небольшую задержку для дебатации
Подождите, пока он снова не поднимется и установите время
Рассчитайте время для одной революции и, следовательно, скорость
Сделай это несколько раз и среднее

Я сделал единицу для отображения скорости потока и кумулятивного потока для перистальтического насоса сточных вод на месте производителей, и это было установлено около года - на том, что я использовал Arduino Uno и установил прерывание, которое послужило подсчетом каждой революции. Экран обновил Avery 5 секунд и сбросит счетчик, чтобы получить ноль. Я полагаю, что мог бы сделать это так же, сбросить счетчик, когда я хочу рассчитать скорость и выяснить, сколько импульсов было в определенное время - так как скорость будет около 20-25 оборотов в секунду, если я Читайте, скажем, 3 секунды, это должно быть достаточно точным. Однако до сих пор я не использовал прерывания на STM32

Я бы признателен за ваши мысли.

Стив

Zoomx
Сб 05 августа 2017 г., 6:58
Получите не линейный датчик Холла. В этом приложении будет работать лучше, чем линейный датчик Холла.

Олли
Сб 05 августа 2017 г. 15:42
Если вы используете обычный датчик Холла, активированный магнитом, нет никакого дебатации. Вот несколько общих комментариев:
1. Занятое чтение ввода - не очень хорошая идея. В то время ваше приложение не может реагировать на что -либо еще - если вы не используете подлинные RTOS
2. Сброс счетчиков/таймеров может иметь неожиданные побочные эффекты. Лучше позволить счетчикам обернуться и просто принимать чтение, когда это необходимо. Хранив старое значение логически так же, как сброс счетчика.
3. Если вы делаете какой -либо анализ FFT, то средние значения влияют на информацию о частоте. Для целей отображения можно использовать простой экспоненциальный фильтр вместо средних значений ящика.
4. Вы должны изучить обработку прерываний на 3 разных платформах Arduino
- Atmel Avr, довольно просто
- Teensy 2x/3x, похожий на AVR
- STM32, архитектура «ограничения» видны разработчику приложения.
> Некоторые пользователи предпочитают делать это близко к железу
> Некоторым пользователям нравятся дополнительные библиотечные слои, которые упрощают некоторые вещи, но добавляют некоторые сложности

Если вы сделаете несколько приложений на STM32, то знание обработки прерываний очень полезно.

Пито
Сб 05 августа 2017 г. 16:55
С 20-25REV/SEC вы можете отметить временные растущие (или падающие) прерывание края каждого Халльсенсора, т.е. с micros ().
С 25 эрив/сек вы получаете разницу в ~ 40000mros каждый раз, это может быть достаточно точным..
Например (упрощено): volatile uint32_t current_rev_period, tstamp, old; .. attachInterrupt(Hall_PIN_INPUT, Hall_interrupt, RISING); .. void Hall_interrupt() { tstamp = micros(); current_rev_period = tstamp - old; old = tstamp; }

Дэнниф
Сб 05 августа 2017 11:27
не нашли кода для STM32Duino, используя датчик эффекта Холла для измерения RPM, просто код для Arduinos. Они должны быть довольно легко переносить в / из.

По сути, установите ISR, который называется, когда выход тахометра меняет состояние (или поднимается / падает). и рассчитать дифференциалы по времени и добавить переносную дискретику, если хотите.

Это почти все, что вам нужно.

что -то подобное сработает:
void tacho_isr(void) { static uint8_t count=0; static uint32_t time_elapsed=0; //time elapsed uint32_t tmp; count+=1; //increment counter if (count == RPM_COUNT) { tmp = time_now(); //save current time time_elapsed = tmp - time_elapsed; //calculate time elapsed //calculate rpm from time_elapsed, RPM_COUNT, and other parameters here time_elapsed = tmp; // update time_elapsed for the next round of counting count = 0; } }

Rogerclark
Солнце 06 августа 2017 1:15
Я был бы осторожен с попыткой микросекундного времени в ISR из -за того, как его реализовано
static inline uint32 micros(void) { uint32 ms; uint32 cycle_cnt; do { ms = millis(); cycle_cnt = systick_get_count(); asm volatile("nop"); //allow interrupt to fire asm volatile("nop"); } while (ms != millis()); #define US_PER_MS 1000 /* SYSTICK_RELOAD_VAL is 1 less than the number of cycles it * actually takes to complete a SysTick reload */ return ((ms * US_PER_MS) + (SYSTICK_RELOAD_VAL + 1 - cycle_cnt) / CYCLES_PER_MICROSECOND); #undef US_PER_MS }

Пито
Солнце 06 августа 2017 5:41
В ISR вы можете прочитать счетчик процессора с 13.88NS (F103) или 5.95NS (F407) разрешение вместо micros () - см

http: // www.STM32duino.com/viewtopic.PHP ... NOS#P26692
volatile uint32_t current_rev_period, tstamp, old; .. attachInterrupt(Hall_PIN_INPUT, Hall_interrupt, RISING); DWTEn(); CpuTicksEn(); .. double my_revs = 1.0 / (current_rev_period * 13.888889e-9); //Revs per second // ISR void Hall_interrupt() { tstamp = CpuGetTicks(); current_rev_period = tstamp - old; old = tstamp; }

Rogerclark
Солнце 06 августа 2017 7:19
@pito

Спасибо

Я не помню, чтобы читал эту ветку

Я вижу тебя определил
#define DWTEn() (*((uint32_t*)0xE000EDFC)) |= (1<<24) #define CpuTicksEn() (*((uint32_t*)0xE0001000)) = 0x40000001 #define CpuTicksDis() (*((uint32_t*)0xE0001000)) = 0x40000000 #define CpuGetTicks() (*((uint32_t*)0xE0001004))

Карвас
Пт 11 августа 2017 г. 9:15 утра
Да, как говорят другие, прерывания будут использоваться для измерения оборотов. Entrupt будет запускаться каждый раз, когда магнит обнаруживается датчиком Hall Sensor.
Я также купил доску STM и выучил прерывания, теперь пытаясь построить тот же счетчик RPM с помощью датчика Холла.

Я измерил RPM простого двигателя постоянного тока с Arduino, используя ниже код. Теперь пытаюсь использовать ту же концепцию в STM. Вы также можете посмотреть на код: void loop() { /*To drop to zero if vehicle stopped*/ if(millis()-dtime>1500) //no magnet found for 1500ms { rpm= v = 0; // make rpm and velocity as zero Cycle_BT.write(v); dtime=millis(); } v = radius_of_wheel * rpm * 0.37699; //0.33 is the radius of the wheel in meter } void magnet_detect() //Called whenever a magnet is detected { rotation++; dtime=millis(); if(rotation>=2) { timetaken = millis()-pevtime; //time in millisec for two rotations rpm=(1000/timetaken)*60; //formulae to calculate rpm pevtime = millis(); rotation=0; Cycle_BT.write(v); //Cycle_BT.println("Magnet detected...."); //enable while testing the hardware } }

AG123
Пт 11 августа 2017 г. 12:08
Я на полпути задаюсь & Намотанная катушка вокруг феррита (индуктора соленоида) в основном сделает той же трюк, я думаю, что многие велосипедные тахосы делают именно это :ржу не могу:

Олли
Пт 11 августа 2017 г. 14:44
Это сработает. Требуется особое внимание, чтобы закрепить высокое напряжение, которое генерируется на высокой скорости.

Пито
Пт 11 августа 2017 г., 17:06
i'm halfway wondering if a simple magnet on the wheel & a coil

OV7670, Generic STM32F103RC и ILI9341 Дисплей

Beescale & STM32F103C8T6