|
|
  |
STM32F0 + датчик Холла SCM Sunfab |
|
|
|
Dec 1 2014, 16:57
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922

|
Доброго времени суток всем! Товарищи, нужна ваша помощь. Буду краток. В универе проходил курс АВРок, настало время диплома. Диплом делаю на предприятии (и кураторы тоже от предприятия), в виду этого приходится на ходу осваивать STM32F0. Да и в универском курсе ни разу не сталкивался с датчиками. Пока имеется один вопрос, с остальным вроде разобрался. Он заключается в следующем: как мне подключать сей датчик скорости на эффекте Холла к СТМке? В программе MicroXplorer есть такой пунктик интересный — XORED Inputs Hall Sensor Interface (3 ноги под это дело заводится, 3 канала таймера). Что, все три ноги датчика на таймер МК подавать? Или лучше просто задействовать один канал таймера в режиме input capture? Если нужна дополнительная инфа — пишите, я укажу все, что знаю. Вот что написано в инсайдерском руководстве: Цитата 5.1.4.2.2. Интерфейс датчика Холла Каждый из таймеров, в т.ч. и расширенный, разработан с учетом простоты подключения к датчику Холла, предназначенного для измерения угловой частоты вращения электродвигателя. Первые три вывода захвата каждого таймера можно связать с каналом 1 через логический элемент "исключающее ИЛИ". В этом случае, по мере вращения двигателя и прохождения возле каждого датчика, в канале будет генерироваться событие захвата. Это приведет к копированию текущего состояния таймера в регистр захвата канала, а также к сбросу таймера. Таким образом, значение счетчика, которое окажется в регистре захвата, можно пересчитать в частоту вращения электродвигателя.
|
|
|
|
|
Dec 1 2014, 18:01
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922

|
Цитата(Golikov A. @ Dec 1 2014, 19:29)  ну просто если брать мотор для которого положение определяют по датчику хола, то от него идут 3 датчика хола, мож потому и 3 ноги?
я бы как уже не студент начал бы с чтения документации на датчик чтобы понять что с него приходит за сигнал, а потом читал бы читать про процессор для понимания того какая есть периферия для детекции этого сигнала. Тут предлагаю начать так же, а мы вам поможем знаниями о периферии.
Доложите нам пожалуйста какой сигнал выходит с датчика, и что он означает и какие показания вы ожидаете получать и регистрировать с датчика и в какой ситуации
Потому что как вы сами, надеюсь понимаете, с помощью датчиков на эффекте Холла можно намерить от тока в проводнике до положения севера на земле... С датчика идет 4 провода: питание, земля и два информационных (разные направления вращения, 30 импульсов за оборот) Цитата(kovigor @ Dec 1 2014, 19:33)  У него две ножки, а не три. Фазовый сдвиг между ними указывает на направление вращения (см. даташит, на который вы сослались). Если нужно определять частоту вращения, то вполне можно подключить эти ножки к Capture - входам таймера ... Направление вращения в конкретной задаче не важно, реализации реверса не требуется
|
|
|
|
|
Dec 1 2014, 18:39
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922

|
Цитата(Golikov A. @ Dec 1 2014, 20:24)  по описанию похоже больше на энкодер, возможно магнитный на датчике холла, чем на датчик холла... Ну, его "обозвали" датчиком скорости на эффекте Холла. Он двухканальный. Как я понял, датчик скорости этот контролирует зубцы шестерни гидромотора и содержит в себе магнит и ,собственно, датчик Холла в одном корпусе (смотри рисунок). Датчик Холла и магнит размещаются вблизи зубьев шестерни, как только зуб шестерни проходит вдоль устройства — магнитное поле между магнитом и датчиком усиливается, в результате чего на выходе блока формируется импульс. 30 зубьев = 30 импульсов за оборот.
|
|
|
|
|
Dec 1 2014, 19:51
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922

|
Цитата(Golikov A. @ Dec 1 2014, 21:28)  Вот.... теперь вопрос в датчике стоят 2 магнита и 2 датчика холла, на расстояние в пол. зубца шестерни или там просто стоит 2 датчика на 2 шестерни? Что вы понимали под 2 канальностью?
едем дальше, какие вы хотите получить показания? Как я понимаю значение скорости вращения шестерни. Тут может быть много решений, и от этого зависит подключение.
1. можно по 1 проводу ловить импульсы, мерить время между импульсами и определять скорость вращения по этой величине. Вы получаете тут время на путь длинной в 1 зуб. 2. Если второй канал смещен на ползуба, то можно мерить время между 2 импульсами и определять скорость вращения по этой величине. Вы получаете время на путь длинной в 0.5 зуба. 3. Можно за определенное время накапливать импульсы и по этому параметру определять скорость вращения. Вы получаете сколько зубцов проходит мимо датчика за определенное время.
так какое решение выбираете вы? Давайте я завтра постараюсь уточнить на счет структуры датчика и двухканальности, а потом отпишусь
|
|
|
|
|
Dec 2 2014, 07:30
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922

|
Цитата(Golikov A. @ Dec 1 2014, 21:28)  Вот.... теперь вопрос в датчике стоят 2 магнита и 2 датчика холла, на расстояние в пол. зубца шестерни или там просто стоит 2 датчика на 2 шестерни? Что вы понимали под 2 канальностью?
едем дальше, какие вы хотите получить показания? Как я понимаю значение скорости вращения шестерни. Тут может быть много решений, и от этого зависит подключение.
1. можно по 1 проводу ловить импульсы, мерить время между импульсами и определять скорость вращения по этой величине. Вы получаете тут время на путь длинной в 1 зуб. 2. Если второй канал смещен на ползуба, то можно мерить время между 2 импульсами и определять скорость вращения по этой величине. Вы получаете время на путь длинной в 0.5 зуба. 3. Можно за определенное время накапливать импульсы и по этому параметру определять скорость вращения. Вы получаете сколько зубцов проходит мимо датчика за определенное время.
так какое решение выбираете вы? Конструктивное решение принято уже до меня: канал используется только один, обратного направления вращения нет в реализации. Так что будет использоваться 1 провод. Как мне сказали, двухканальность никого не интересует. Считать зубцы будем одним датчиком
|
|
|
|
|
Dec 2 2014, 07:39
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922

|
Цитата(Сергей Борщ @ Dec 2 2014, 09:27)  А еще почитайте (для общего ознакомления) о квадратурных энкодерах. Любой инженер - электроник должен иметь представление о принципе работы таких энкодеров, также как любой инженер должен иметь представление о логарифмах. Увидите много общего между своим датчиком и таким энкодером. У STM32 некоторые таймеры имеют специальный режим для прямой работы с такими энкодерами. Да на днях поверхностно ознакомился с энкодерами Цитата(Сергей Борщ @ Dec 2 2014, 09:34)  Значит задача измерения скорости сводится к задаче определения частоты поступающих импульсов, к построению частотомера. Вот вам и еще одно ключевое слово для поисков: "измерение частоты". Это тоже я гуглил) Даже нарыл некий фрагментик: CODE #include "iostm8l152c6.h" #include "lcd.h"
long int count; //описываем прерывание #pragma vector=EXTI1_vector __interrupt void Pin1_interrupt(void) { unsigned char ch = 'с'; TIM1_CR1_bit.CEN ^= 1; PE_ODR_bit.ODR7 ^= 1; if ( !TIM1_CR1_bit.CEN ) { LCD_eWrite_Int( &count, 1, 5, 4 ); LCD_Write_Char( &ch, 0, 0, 6 ); count = 0; } EXTI_SR1_bit.P1F = 1; //сброс флага прерывания, чтобы вернуться в код } #pragma vector=TIM1_OVR_UIF_vector __interrupt void TIM1_OVF(void) { count++; TIM1_SR1_bit.UIF = 0; //Сброс флага прерывания } void timinit( void ) { CLK_PCKENR2_bit.PCKEN21 = 1; //Включаем тактирование таймера 1 TIM1_PSCRH = 0; TIM1_PSCRL = 7; //Делитель на 8 TIM1_ARRH = (1000) >> 8; //Частота переполнений = 8М / 8 / 1000 = 100 Гц TIM1_ARRL = (1000)& 0xFF; TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика TIM1_EGR_bit.UG = 1; //Вызываем Update Event TIM1_IER_bit.UIE = 1; //Разрешаем прерывание } void main( void ) { unsigned char text[7] = " READY"; CLK_SWCR_bit.SWEN = 1; CLK_SWR = 0x04; CLK_CKDIVR = 0x00; //ядро работает на 8 МГц PC_DDR_bit.DDR1 = 0; PE_DDR_bit.DDR7 = 1; PE_CR1_bit.C17 = 1; PC_CR1_bit.C11 = 1; PC_CR2_bit.C21 = 1; EXTI_CR1_bit.P1IS = 2;//реагировать на спад, т е нажатие кнопки ITC_SPR3_bit.VECT9SPR = 3; timinit(); LCD_Init(); LCD_Contrast(7); LCD_Write_String( text ); asm("RIM"); //глобальное разрешение прерываний while( true ); }
Сообщение отредактировал IgorKossak - Dec 2 2014, 19:40
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Dec 2 2014, 08:34
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Ну тут достаточно применить смекалку:
у вас осталось 2 варианта
1. Определение мгновенной скорости, то есть измерение времени прошедшего между 2 зубцами 2. Подсчет числа зубцов прошедших мимо датчика за определенное время
Реализация этого может быть такие 1. Прерывание по импульсу от проходящего зубца. В прерывании вы считываете значение таймера, сбрасываете его и запускаете бежать вперед без остановок. Первый интервал после остановки будет определен криво, дальше все поедет как надо. 2. Завести таймер на определенный интервал, 1 секунда, например. Завести сигнал от датчика как клок другого таймера, каждый импульс таймер будет прибавлять по 1 в счетчик. Как пройдет секунда, по прерыванию можете считать сколько насчитал 2 таймер, и сбросить это число. Таким способом вас реже дергают в прерывание, и получается некая фильтрация по времени, но теряется оперативность.
Так же можно завести сигнал и обратный сигнал на 2 капча таймера, и определять разницу между фронтами. Можно по 1 капчу, если у проца есть такой режим таймера. Можно как вариант 2 заставить таймер тактируемый внешним сигналом считать до какого то числа и по прерыванию как он досчитал забирать время системного таймера, определяя сколько времени прошло за Н зубцов. Можно придумать еще вариантики.
А фрагменты не ищите, если понять задачу она реализуется за полдня, а если не понять то будет как в начале темы, заведете 2 сигнала на какие то ножки а потом выясниться что 1 сигнала нет, а ножки не совсем подходят потому что от датчика ждали другого.... Вообще на вопрос куда завести датчик Холла, я бы ответил на компаратор или АЦП, так что постановка и понимание задачи очень важно!
|
|
|
|
|
Dec 2 2014, 09:23
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922

|
Цитата(Golikov A. @ Dec 2 2014, 10:34)  ... А к какому варианту посоветуете склониться лично мне, как начинающему? Естесственно, желательно "что полегче" Цитата(arthedza @ Dec 2 2014, 11:04)  А к какому варианту посоветуете склониться лично мне, как начинающему? Естесственно, желательно "что полегче" Просмотрел внимательно ТЗ, опрос датчика скорости должен производиться с периодичностью в 5мс
Сообщение отредактировал IgorKossak - Dec 2 2014, 19:41
Причина редактирования: избыточное цитирование
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|