|
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 через логический элемент "исключающее ИЛИ". В этом случае, по мере вращения двигателя и прохождения возле каждого датчика, в канале будет генерироваться событие захвата. Это приведет к копированию текущего состояния таймера в регистр захвата канала, а также к сбросу таймера. Таким образом, значение счетчика, которое окажется в регистре захвата, можно пересчитать в частоту вращения электродвигателя.
|
|
|
|
|
 |
Ответов
(1 - 49)
|
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
Причина редактирования: избыточное цитирование
|
|
|
|
|
Dec 2 2014, 11:08
|
Участник

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

|
Следовательно, подходит вариант второй: подсчет числа зубцов прошедших мимо датчика за определенное время
|
|
|
|
|
Dec 2 2014, 19:24
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
ну строго говоря надо еще понять какого уровня изменения возможны за этот интервал. То есть возможно шестерня крутиться так медленно что несколько 5 мСек интервалов попадут на 1 зуб и вам ничего делать не надо, просто тупо раз в 5 мСек опрашивать состояние входа и если оно изменилось из 0 в 1, считать импульс, и ждать изменения из 1 в 0.
Если же скорость вращения выше, или импульсы коротки и есть шанс их пропустить с 5 мСек опросами, то надо их заводить на ногу клока таймера, и пусть он их считает. А вы раз в 5 мСек спрашиваете сколько он насчитал....
Одна хитрость остается, это сброс таймера. Если вы раз в 5 мСек будете забирать значение и сбрасывать таймер, существует вероятность что вы сбросите сразу после импульса, и отсчет потеряется. то есть вы вошли в прерывание берете из таймера значение Н (в этот момент проходит импульс и таймер становится Н+1) вы пишите в таймер 0, и 1 импульс потерялся.
Бороться с этим можно если таймер не сбрасывать, а просто запоминать значение, и определять каждый раз дельту между текущим и прошлым запомненным, только надо еще правильно отследить переполнение таймера.
Вот как бы и все. Так что заводите ваши сигналы на источник клока таймера и дерзайте
|
|
|
|
|
Dec 2 2014, 23:31
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Спасибо, интересная тема. Правда пришлось несколько раз перечитать первые страницы прежде чем в их попытках измерения длинны органов разглядел суть.
Смысл поста такой можно относительно частоты проца считать импульсы измеряемой частоты и получить их с точностью +-1. А можно так вывернуться что относительной измеряемой частоты считать импульсы частоты проца, получить их опять с точность +-1.
Поскольку считается что частота проца в сотни раз выше измеряемой частоты, то и погрешность в 1 процовый такт будет так же в сотни раз, в итоге выше.
Но на самом деле метод что предлагал, когда с равными интервалами относительно частоты проца забираются разницы счета измеряемой величины в мгновенном варианте дает погрешность +-1, а в дальней перспективе значительно выше. Те остатки такта, что были не учтены на текущем интервале перейдут на следующий, и выразятся в дрожании значения, которое после фильтрации (а ее все равно по уму надо делать) как раз даст доп точность....
|
|
|
|
|
Dec 3 2014, 08:03
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(arthedza @ Dec 2 2014, 13:23)  Просмотрел внимательно ТЗ, опрос датчика скорости должен производиться с периодичностью в 5мс Странное ТЗ. В ТЗ не нужно писать _как_делать, а нужно описать _что_делать_. Формулировка в виде: - Диапазон измеряемых скоростей от 5 зуб/с до 300 зуб/с. - Время реакции на изменение скорости не более 1 с. (цифры разумеется должны быть из вашей задачи). сократит число вариантов решения и постов в этой теме)
|
|
|
|
|
Dec 3 2014, 10:34
|
Участник

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

|
Цитата(adnega @ Dec 3 2014, 10:03)  Странное ТЗ. В ТЗ не нужно писать _как_делать, а нужно описать _что_делать_.
Формулировка в виде: - Диапазон измеряемых скоростей от 5 зуб/с до 300 зуб/с. - Время реакции на изменение скорости не более 1 с. (цифры разумеется должны быть из вашей задачи).
сократит число вариантов решения и постов в этой теме) Частота вращения будет изменяться в диапазоне 0..5200с^-1. 1 оборот=30 зуб. Хотя для объекта управления (гидроклапан) указана частота шим 100гц (10мс) с точки зрения обеспечения устойчивости такт решения задачи производительности гидросистемы необходимо сделать в 5мс. Т.е каждые 5 мс нужно обрабатывать частоту вращения и считать фильтры. Частота выдачи упр. сигнала должна соответствовать частоте ШИМ-сигнала. формировать значение упр. сигнала можно и каждые 5 мс но ШИМ будет менять свою скважность каждые 10мс. Т. е сигнал ШИМ с заданной скважностью должен пройти полностью Цитата(Golikov A. @ Dec 3 2014, 10:49)  периодичность опроса и время реакции системы также нормальные требования ТЗ, особенно если это ТЗ на блок, и оно учитывает общую загрузку системы... написал выше
|
|
|
|
|
Dec 3 2014, 11:12
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(arthedza @ Dec 3 2014, 14:34)  Частота вращения будет изменяться в диапазоне 0..5200с^-1. 1 оборот=30 зуб. Хотя для объекта управления (гидроклапан) указана частота шим 100гц (10мс) с точки зрения обеспечения устойчивости такт решения задачи производительности гидросистемы необходимо сделать в 5мс. Т.е каждые 5 мс нужно обрабатывать частоту вращения и считать фильтры. Частота выдачи упр. сигнала должна соответствовать частоте ШИМ-сигнала. формировать значение упр. сигнала можно и каждые 5 мс но ШИМ будет менять свою скважность каждые 10мс. Т. е сигнал ШИМ с заданной скважностью должен пройти полностью Считаем число импульсов от датчика за 5мс. Имеем число от 0 до 780 импульсов. Разрешающая способность 6.(6) об/сек. При времени реакции 5мс и скоростях ниже 6 об/сек имеем ситуацию, когда на выходе измерителя будет ШИМ: 5 мс скорость будет равна нулю, а в следующие 5 мс = 6.(6) об/сек. На низких оборотах скорость нужно усреднять с большим интервалом.
|
|
|
|
|
Dec 3 2014, 11:48
|
Участник

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

|
Цитата(adnega @ Dec 3 2014, 13:12)  Считаем число импульсов от датчика за 5мс. Имеем число от 0 до 780 импульсов. Разрешающая способность 6.(6) об/сек. При времени реакции 5мс и скоростях ниже 6 об/сек имеем ситуацию, когда на выходе измерителя будет ШИМ: 5 мс скорость будет равна нулю, а в следующие 5 мс = 6.(6) об/сек. На низких оборотах скорость нужно усреднять с большим интервалом. А если низкие обороты будут только при пуске/останове, а основная частота, к примеру, будет составлять 1000-1500 с^-1?
|
|
|
|
|
Dec 3 2014, 13:05
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
1000-1500 - это 150 - 225 импульсов в 5мСек 6.666666 оборотов в секунду - это 1 импульс в 5 мСек получается что у вас 1000 оборотов в секунду не отличимо от 1001, 1002, 1003, 1004, 1005, 1006, но вот 1007 уже отличается это 151 импульс так что если вы шимом будете стараться поддержать обороты, то вы это сможете сделать с точностью до 6 оборотов в 5 мСек. Но обычно системы несколько более инертны, и можно использовать показания за несколько 5 мСек периудов, и получить разрешение повыше, ценой потери оперативность регулировки. Но думаю что мотор все равно мгновенно скорость не поменяет, наверняка будет там какой то ПИД, который все сгладит...
|
|
|
|
|
Dec 4 2014, 07:11
|
Участник

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

|
Цитата(adnega @ Dec 3 2014, 13:12)  Считаем число импульсов от датчика за 5мс. Имеем число от 0 до 780 импульсов. Разрешающая способность 6.(6) об/сек. При времени реакции 5мс и скоростях ниже 6 об/сек имеем ситуацию, когда на выходе измерителя будет ШИМ: 5 мс скорость будет равна нулю, а в следующие 5 мс = 6.(6) об/сек. На низких оборотах скорость нужно усреднять с большим интервалом. Простите, не то написал. Обороты в минуту, а не в секунду. Выходит: 5200 об/мин * 30 = 156000 имп/мин 156000/60 = 2600 имп/сек 2600/1000*5 = 13 импульсов в 5 милисекунд при 5200 об/мин.
Сообщение отредактировал arthedza - Dec 4 2014, 07:19
|
|
|
|
|
Dec 4 2014, 07:25
|
Участник

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

|
Цитата(adnega @ Dec 4 2014, 09:15)  Что ж - стало хуже ровно в 60 раз) Всего будет три режима работы: V1 = 1800 об/мин = 4,5 имп/5мс V2 = 3000 об/мин = 7,5 имп/5мс V3 = 5200 об/мин = 13 имп/5мс Делать мгновенные выборки через каждые 5 мс в несколько тактов, а потом усреднять? Или как?
Сообщение отредактировал arthedza - Dec 4 2014, 07:42
|
|
|
|
|
Dec 4 2014, 08:13
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(arthedza @ Dec 4 2014, 11:25)  Или как? Мотор - штука инертная, поэтому за 5 мс скорость поменяться не может, и даже если поменяется зубцов не так много, чтобы уловить эти изменения. Я бы предложил: 1. Запустить 16-разрядный счетчик на непрерывный подсчет импульсов. 2. Раз в 5 мс считывал значение из счетчика и считал дельту с предыдущим считанным значением (аккуратно на переходе 0xFFFF -> 0x0000 !). 3. Полученную дельту помещал в очередь (LIFO) из N элементов, где N*5мс = интервал усреднения/сглаживания. 4. Зная N и общее число импульсов в очереди (сумма всех элементов), можно рассчитать мгновенную (каждые 5 мс) скорость усредненную за большой интервал (N * 5 мс).
|
|
|
|
|
Dec 4 2014, 09:24
|
Участник

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

|
Цитата(adnega @ Dec 4 2014, 10:13)  Мотор - штука инертная, поэтому за 5 мс скорость поменяться не может, и даже если поменяется зубцов не так много, чтобы уловить эти изменения. Я бы предложил: 1. Запустить 16-разрядный счетчик на непрерывный подсчет импульсов. 2. Раз в 5 мс считывал значение из счетчика и считал дельту с предыдущим считанным значением (аккуратно на переходе 0xFFFF -> 0x0000 !). 3. Полученную дельту помещал в очередь (LIFO) из N элементов, где N*5мс = интервал усреднения/сглаживания. 4. Зная N и общее число импульсов в очереди (сумма всех элементов), можно рассчитать мгновенную (каждые 5 мс) скорость усредненную за большой интервал (N * 5 мс). 5 мс ведь заложили потому, что период управляющего ШИМ-воздействия с контроллера составляет 10 мс. Как я понял, за 10 мс мы должны успеть опросить датчик холла, вычислить частоту вращения, сформировать закон управления по полученной скорости и в соответствии с этим законом выдать ШИМ на выход контроллера.
|
|
|
|
|
Dec 4 2014, 09:55
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
ну при такой частоте у вас ничего просто не выйдет.... вот смотрите вы хотите V1 = 1800 об/ми - это 4.5 импульса пусть мотор крутиться со скоростью 1700 об/ми это дает 1700/60*30/1000*5 = 4.25 импульсов допустим вы ничего не меняете в первые 5 м секу вы получили 4 импульса - надо увеличить скорость 0.25 осталось на след такт, в след раз будет 4.5, целое снова 4 - надо увеличить скорость 4.75 - целое 4, надо увеличить 5 - опачки перебор, надо уменьшить а потом опять 4 - надо увеличить.... А теперь представьте что вы выдаете управляющие воздействия, у 5 импульсов на 5 мСек - это скорость 2000 об/мин, 4 импульса - это 1600, то есть в схеме отлова мгновенной скорости 1600 - 2000 оборотов не различимы, а любые попытки управления будут кидать ваш мотор от 1600 до 2000... Система войдет в генерацию и будет пипец..... вам надо существенно увеличить точность, а это можно сделать только увеличив время выборки.... к примеру мотор вращается с частотой 1700 об/мин, это 4.25 имп в 5 мСек, 0.25 - теряется если же взять 20 мСек, то это ровно 4.25*4=17 импульсов и потерь нет... если собирать за 50 мСек то вы сможете обрабатывать с точностью до 0.1 на те же 5 мСек... не важно как быстро вы можете изменить ШИМ, важно насколько точно вы можете вычислить изменение... При работе с тактами 5 мСек, вам придется делать очень плавные интеграционные коэффициенты и нулевые пропорциональные, и что в итоге? получите очень медленное регулирование, хоть и с частыми поправками, то есть фильтр перейдет не на измерение, а на регулирование.... Я предлагаю такое решение, которое здорово повысит точность... (ну как я... я подглядел его в ссылке что давали вам выше  ) Импульсы заводите на клок таймера, выход таймера заводите на капчу второго таймера... Задаете первому таймеру интервал счета 5 (например), а второй таймер запускаете просто вперед на максимальной частоте от клока проца. Как это будет работать.... импульсы идут и заставляют считать первый таймер, как только таймер досчитает до 5, он закапчит сигнал второго таймера и в итоге, вы получите сколько тактов проц пошло на 5 импульсов. То есть вы будите знать время за которое прошло 5 импульсов с точностью +-1 клок проца, что значительно выше чем число импульсов за 5 мСек с точностью +-1 импульс... надо предусмотреть обработку переполнения 2 таймера, а так же надо учесть если 5 импульсов не поступят за какое-то понятное время, что мотор стоит, возможно для этого нужен еще таймер, или проверять время от времени счетчик 1 таймера в общем цикле, и если ничего не меняется бить тревогу... проверку можно делать с вашими любимыми 5 мСек интервалами...
|
|
|
|
|
Dec 4 2014, 10:16
|
Участник

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

|
Цитата(Golikov A. @ Dec 4 2014, 11:55)  ну при такой частоте у вас ничего просто не выйдет....
Я предлагаю такое решение, которое здорово повысит точность... Спасибо за исчерпывающий ответ! Ушел разбираться с инфой.
|
|
|
|
|
Dec 6 2014, 17:13
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(arthedza @ Dec 4 2014, 12:16)  Спасибо за исчерпывающий ответ! Ушел разбираться с инфой. Я почитал предыдущих ораторов. Мне кажется, точность можно существенно повысить, а точнее - она появится сама собой, - если тупо: - считать мгновенную скорость вращения путем измерения интервала между двумя зубцами, - корректировать ШИМ с указанной периодичностью в 5мс. При максимальных оборотах в 5200/мин время между соседними зубцами (их 30) будет 1/2600Hz=384.1мкс. Это просто вечность! За это время при частоте процессора 24MHz таймер насчитает число 9230. То есть, скорость будет измеряться с точностью почти 0.01%. При медленном вращении в 1 оборот в минуту будет 9230 х 5200 < 48мио. тактов таймера, то есть это явно вписывается в 32-бита. Счетчик нужен 32-х разрядный, что можно организовать, считая переполнения 16-ти битного таймера в прерывании от него. Каждый импульс от датчика вырабатывает прерывание, в котором вычисляется мгновенная скорость на основании разницы между текущим и предыдущим значением составного 32-х битного числа. Нужно в этом прерывании лишь подсуетиться в том плане, чтобы составное 32-х битное число из значения таймера и старшего 16-битного слова переполнения было "цельным" (ключевое слово - "атомарная" операция). И вот с этим числом можно потом спокойно работать в 5мс тактах: вычислений с частотой 200Hz для механики мотора более достаточно. Кстати, в качестве таймера достаточно использовать и SysTick, в прерывании от которого и "создается" 32-х битный счетчик. Если SysTick настроен, скажем, даже на 1ms, то его значение (при 24MHz CPU) будет бегать от 0 до (24000-1). Пусть в прерывании от SysTick будет выполняться SysTickCnt++. Тогда 32-х битный счетчик (в тактах CPU) составляется как Код volatile uint32_t cnt32 = 0, cnt32_last = cnt32;
void SysTick_Handler(void) { static uint32_t SysTickCnt = 0;
uint32_t b = SysTick->LOAD;
SysTickCnt++;
cnt32 = (SysTickCnt * (b + 1)) + (b - SysTick->VAL); } Время между импульсами датчика (точнее, количество тактов, которые потом пересчитываются в скорость): Код uint32_t cnt = cnt32, diff = cnt - cnt32_last; cnt_last = cnt; При этом, как многократно обсуждалось в темах, не нужно суетиться по поводу, что cnt и cnt32_last могут быть по разную сторону от нуля.
Сообщение отредактировал KnightIgor - Dec 6 2014, 17:30
|
|
|
|
|
Dec 6 2014, 18:01
|
Участник

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

|
Вот появился еще такой вопрос: как можно смоделировать работу МК? Есть ли решения для STM32 типа Proteus|Multisim?
|
|
|
|
|
Dec 6 2014, 18:15
|
Участник

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

|
Цитата(Golikov A. @ Dec 6 2014, 20:09)  а чем симулятор то не годиться?
в IAR, KEIL есть возможность запустить программу в симуляторе, и подавать воздействия... Дело в том, что работаю в CoIDE
|
|
|
|
|
Dec 6 2014, 18:24
|
Участник

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

|
Цитата(Golikov A. @ Dec 6 2014, 20:22)  работайте  вы скачайте триальную версию на 30 дней, и проверьте как оно там.... легче купить старкит, типа дискавери за 10 баксов, и все на нем проверить, у вас же периферия стандартная. А симуляторы - это от лукавого ИМХО... Так дискавери и купил) Генератор импульсов какой-то к ней присобачить, чтоб в железе посмотреть?
|
|
|
|
|
Dec 6 2014, 18:36
|
Участник

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

|
Цитата(Golikov A. @ Dec 6 2014, 20:33)  кнопку тактовую и нажимайте рукой... или с одной ножки подайте на другую
в работе с железом самое первое это поднять интерфейс с компьютером типа RS232, по которому слать отладочную информацию. Можно слать сколько намерено времени между импульсами, и формировать их хоть руками Слать нужно в какой-то терминал же? Или куда?
|
|
|
|
|
Dec 6 2014, 21:01
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
да я в терминал шлю. Раньше был гипертерминал, сейчас в новой винде его нет, шлю в Terminal http://www.gaw.ru/html.cgi/txt/interface/rs232/start.htmсмотрите в конце есть описание Насколько помню в дискавери вроде ком порт не распаян, есть просто выход на уарт, можно паять преобразователь уровня в ком порт, но есть готовые решения типа UART<->USB, очень советую обзавестись, если занимаетесь разработкой, то это очень удобное средство, и отладка в порт очень эффективна. Позволяет смотреть работу в динамике, надо следить чтобы не засрать порт сообщениями, конечно, но это по мне лучше чем остановки с житагом...
|
|
|
|
|
Dec 9 2014, 08:13
|
Участник

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

|
Цитата(Golikov A. @ Dec 4 2014, 11:55)  Я предлагаю такое решение, которое здорово повысит точность... Немного погуглил в свободное время и нарыл чуток информации. Для измерения частоты существует 2 метода: метод захвата и метод "временных ворот". Для метода захвата достаточно одного таймера, имеющего прерывания по захвату и по переполнению. Числом переполнений определяется требуемое время измерения, а захватами -- начало и конец счета (программным счетчиком) целого числа периодов измеряемой частоты. Метод "временных ворот" реализуется на двух таймерах. Один для формирования базы времени, другой для счета периодов измеряемой частоты. В этом случае нужно как можно точнее формировать "временные ворота". Для МК минимальная ширина "временных ворот" ограничена машинным циклом, т.е. периодом через который CPU может опрашивать состяние входного вывода. Каким методом считать импульсы проще?
|
|
|
|
|
Dec 9 2014, 09:49
|
Участник

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

|
Цитата(Golikov A. @ Dec 9 2014, 11:06)  проще временными воротами точнее методом захвата... при условии что частоту импульсов меньше частоты процессора
кстати добавив прерывание на переполнение, можно расширить и ограничение времени счета Поговорил со своим куратором. Как я понял, надо делать так: на ножку подается пульсирующий сигнал, по нарастанию фронта -- уходим в прерывание. Соответственно, каждый период будет срабатывать прерывание, нам остается только подсчитывать их количество за 5мс. Цитата(Golikov A. @ Dec 9 2014, 11:06)  проще временными воротами точнее методом захвата... при условии что частоту импульсов меньше частоты процессора
кстати добавив прерывание на переполнение, можно расширить и ограничение времени счета Как мне уже написали: Цитата "При максимальных оборотах в 5200/мин время между соседними зубцами (их 30) будет 1/2600Hz=384.1мкс."
|
|
|
|
|
Dec 9 2014, 14:52
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Поговорил со своим куратором. Как я понял, надо делать так: на ножку подается пульсирующий сигнал, по нарастанию фронта -- уходим в прерывание. Соответственно, каждый период будет срабатывать прерывание, нам остается только подсчитывать их количество за 5мс. скажите своему куратору что на электрониксе не одобрили. Это самое прямое решение в лоб, просто грубая сила, никакой изюминки... вы будете получать результат с точностью +- 1 импульс, на ваших рабочих частотах вращения +-1 импульс от 4.5, то есть точность данного метода +-25% И чего вы хотите срегулировать таким образом? гораздо умнее сделать так: на ножку подается пульсирующий сигнал, только на ножку капча таймера который просто бежит вперед с максимальной частотой проца. По прерыванию капча вы запоминаете новое значение и считаете дельту с прошлым. Все собранные дельты вы суммируете, и усредняете за 5 мСек, в результате вы получите точность +-0.5 импульса, только не вашего а проца. То есть длительность вы определите на несколько порядков точнее... Цитата Как мне уже написали: Цитата "При максимальных оборотах в 5200/мин время между соседними зубцами (их 30) будет 1/2600Hz=384.1мкс."
переполнение определяет максимальное время ожидания, так что интересует время между зубцами на минимальной скорости, но у вас там всяко 5 мСек раньше наступит...
|
|
|
|
|
Dec 10 2014, 06:38
|
Участник

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

|
Цитата(Golikov A. @ Dec 9 2014, 16:52)  на ножку подается пульсирующий сигнал, только на ножку капча таймера который просто бежит вперед с максимальной частотой проца. По прерыванию капча вы запоминаете новое значение и считаете дельту с прошлым. Все собранные дельты вы суммируете, и усредняете за 5 мСек, в результате вы получите точность +-0.5 импульса, только не вашего а проца. То есть длительность вы определите на несколько порядков точнее... Правильно ли я понял: всего на одну ножку таймера в режиме input capture, который настроен на счет вперед с максимальной частотой CPU, поступают импульсы от датчика скорости. По фронту импульса уходим в прерывание, запоминаем значение, которое набежало в таймере, считаем разницу с предыдущим значением. Уже вне подпрограммы обработки прерывания усреднить дельты за 5мс.
|
|
|
|
|
Dec 10 2014, 07:16
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
да. в прерывании вы только определяете интервалы... можете этот таймер что будет капчить запустить считать не до переполнения а до 5 мСек. Тем самым получить еще одно прерывание в котором будете организовывать обработку 5 мСек интервалов, причем там можно просто флаг выставлять, а обрабатывать в главной петле. Только в таком режиме трудно на границе таймера отсчитывать интервалы, при переполнении 32 битного таймера, разница двух показаний как беззнаковых всегда будет давать интервал между ними. Причем это верно даже если будет переполнение и перекрут таймера. Если же таймер считает до 5 мСек, то тут придется переполнение обрабатывать чуть сложнее... Цитата По фронту импульса уходим в прерывание, запоминаем значение так можно реализовать и без капчи ноги. Капча сама запишет значение таймера именно в момент когда будет импульс, и не будет влиять время входа в прерывание. В прерывании вы просто извлекаете это значение, считаете разницу с прошлым, и запоминаете как прошлое. я бы сделал массив из 20 элементов чтобы наверняка, каждое прерывание полученный интервал клал бы в очередную ячейку. а когда получал бы 5 мСек прерывание ставил бы флаг, на обработку этого массива и его сброс А может быть я положил бы простенький фильтр который усреднял бы интервалы на каждое получение, и вообще отказался бы от 5 мСек интервалов. Обычная экспонента y = Xold - (Xold - Xnew)/2, дает неплохую фильтрацию и реализуется сдвигом. Вместо 2 могут быть и другие константы, которые можно рассчитать и заменить на умножение. Можно работать в целых числах и сдвигах. Вариантов много... Цитата всего на одну ножку таймера в режиме input capture с 2 таймерами и 2 ножками можно еще повысить или обеспечить такую же точность не нагружая контроллер доп усреднением, как было предложено по ссылке в начале темы, но это вам уже наверное не нужно, да и к тому же там просто перенос сложной обработки на конец интервала и есть сложности с режимом когда импульсов вообще не будет...
|
|
|
|
|
Dec 10 2014, 07:33
|
Участник

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

|
Цитата(Golikov A. @ Dec 9 2014, 16:52)  Все собранные дельты вы суммируете, и усредняете за 5 мСек, в результате вы получите точность +-0.5 импульса, только не вашего а проца. То есть длительность вы определите на несколько порядков точнее... В итоге, я получу время между импульсами датчика (период сигнала датчика, это выйдет 1/30 оборота) в тактах МК. И если я умножу полученное число тактов на 30 -- получу длительность в системных тактах одного оборота. Учитывая, что тактирование будет производиться от кварца 8.000MHz, смогу узнать, сколько пройдет оборотов в секунду, а домножив на 60 -- узнаю и обороты за минуту, так?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|