Страница 4 из 5
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Вт сен 05, 2023 22:12:14
mont-oriol
a_b_r_a, вы же можете аппаратно считать импульсы одним из счётчиков, без использования прерываний. Время от времени смотреть, сколько там натикало. И дельту прибавлять уже к счётчику, допустим, 32-х битному.

Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Вт сен 05, 2023 22:35:45
a_b_r_a
Все тайминги из даташита
Добавлено after 3 minutes 15 seconds:
[uquote="mont-oriol",url="/forum/viewtopic.php?p=4473385#p4473385"]a_b_r_a, вы же можете аппаратно считать импульсы одним из счётчиков, без использования прерываний.[/uquote]
Как вариант можно попробовать.
Добавлено after 17 minutes 2 seconds:
Как я думаю тогда поступить. Да, идея хорошая по входу внешнего тактирования T1 считать импульсы. У меня есть прерывание по таймеру T0. Каждую 1 миллисекунду. Можно проверять счетчик миллисекунд и когда он дойдет до тысячи (1 сек) смотреть содержимое счетного регистра. Наверно это будет не совсем точно, но попробовать можно.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Вт сен 05, 2023 22:35:57
valentinovich
Martian
Если 4000 импульсов на километр, то при скорости 300 км/ч какая частота импульсов? 350 герц? И не успевает?

Ну чему тут удивляться - логическая обработка на уровне решения задач третьего класса. Какое-то деление или умножение на какой-то коэффциент, зачем-то подсчёт герц, ...

. С "железом" надо работать несколькопо по друному. На его "мышлении" 0/1, т.е. как там в фильме: <без фанабериев всяких>,

уходя от неоправданных сложных вычислений (тем более, что это вполне достаточный, но всё же маленький МК),
Martian
...а вот с программой что-то не то...
Да уж и с работой с прерываниями не совсем и попытка в языке высокого уровня изгаляться при решении простейших текущих задач, решаемых в две команды на ассмеблере.
Короче - проект может и интересный, но подготовка исполнителя по его логической и языковой реализации, мягко говоря, пока слабовата.
a_b_r_a, чтоб не "тонуть" в словофлуде вокруг да около, я вот вижу это так (т.е. сугубо имхо): если писать о достаточно многозадачном проекте, то его, вами видимое, прохождение желательно предоставлять к совету не словесно, а в графическом виде с вашими комментариями. Сначала отдельными кусками по задачам, потом уже обьединять.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Вт сен 05, 2023 22:39:40
a_b_r_a
Кстати, попробую я завтра в прерывании которое каждую миллисекунду инвертировать какую-нибудь ножку МК и гляну осликом, что там происходит. А потом подам 113 герц на вход скорости и гляну еще раз.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Вт сен 05, 2023 22:47:59
Martian
И прислушаться к valentinovich - разбить задачу, нарисовав и описав некую блок-схему, получить в итоге ТЗ и решить его оптимальнейшим образом. По тому что сейчас непонятно, зачем каждую миллисекунду что-то там вызывается (хотя, мож и говорилось, но я пропустил)? это ведь чуть ли не на порядок быстрее, чем частота вспышек в цилиндрах...
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Вт сен 05, 2023 22:53:14
a_b_r_a
[uquote="Martian",url="/forum/viewtopic.php?p=4473401#p4473401"]И прислушаться к valentinovich По тому что сейчас непонятно, зачем каждую миллисекунду что-то там вызывается.[/uquote]
Вы писали код когда-нибудь на Си? Если я вам скину проект, можете конкретно указать, что не так написано или конкретно кодом помочь в оптимизации? Там собственно все структурировано.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Вт сен 05, 2023 22:58:07
Starichok51
Код: Выделить всё
uint8_t dt_test_device(void)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
uint8_t dt;
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(485); // Задержка на минимум 480 мкС
sei();
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(65); //Задержка на минимум 60 мкС
if ((PINTEMP & (1<<BITTEMP))==0 ) // Проверяем, ответит ли устройство
{
dt=1; // Устройство ответило
}
else dt=0; // Устройства нет
SREG=stektemp; // Вернем значение стека
_delay_us(420); //
sei();
return dt;
}
тут вообще можно не запрещать прерывания.
в крайнем случае запретить прерывания на время проверки ответа. например, так:
Код: Выделить всё
uint8_t stektemp=SREG; // сохранение значения стека
uint8_t dt;
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(485); // Задержка на минимум 480 мкС
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
cli(); // запрещаем прерывания
_delay_us(65); //Задержка на минимум 60 мкС
if ((PINTEMP & (1<<BITTEMP))==0 ) // Проверяем, ответит ли устройство
{
dt=1; // Устройство ответило
}
else dt=0; // Устройства нет
sei();
SREG=stektemp; // Вернем значение стека
_delay_us(420); //
return dt;
чтобы любое прерывание не растянуло проверочный интервал в 60 мкс.
Код: Выделить всё
uint8_t dt_readbit(void)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
uint8_t bt; // Переменная хранения бита
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(13);
bt=(PINTEMP & (1<<BITTEMP))>>BITTEMP; // Читаем бит
_delay_us(45);
SREG=stektemp; // Вернем значение стека
sei();
return bt;
}
здесь sei(); нужно поставить сразу после
bt=(PINTEMP & (1<<BITTEMP))>>BITTEMP; // Читаем бит
Код: Выделить всё
void dt_sendbit(uint8_t bt)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
if(bt)
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(65);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
SREG=stektemp; // Вернем значение стека
sei();
}
здесь делаем так:
Код: Выделить всё
cli(); // запрещаем прерывания
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
if(bt)
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
sei();
_delay_us(65);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
SREG=stektemp; // Вернем значение стека
тогда датчик уже не будет мешать работе прерываний.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Вт сен 05, 2023 23:03:29
a_b_r_a
Спасибо, поправлю в коде.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Ср сен 06, 2023 06:32:27
akl
a_b_r_a писал(а):Блин, не знаю, как спойлер сделать.
Выделил Ваш текст, вставил в сообщение, выделил, обрамил тегом Code, выделил всё, обрамил тегом spoiler.
Спойлер
Код: Выделить всё
#include "ds18b20.h"
volatile uint32_t last_time;
uint8_t st=0;
//=======
//Определение датчика на шине
uint8_t dt_test_device(void)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
uint8_t dt;
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(485); // Задержка на минимум 480 мкС
sei();
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(65); //Задержка на минимум 60 мкС
if ((PINTEMP & (1<<BITTEMP))==0 ) // Проверяем, ответит ли устройство
{
dt=1; // Устройство ответило
}
else dt=0; // Устройства нет
SREG=stektemp; // Вернем значение стека
_delay_us(420); //
sei();
return dt;
}
//=======
// Функция чтения бита с датчика
uint8_t dt_readbit(void)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
uint8_t bt; // Переменная хранения бита
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(13);
bt=(PINTEMP & (1<<BITTEMP))>>BITTEMP; // Читаем бит
_delay_us(45);
SREG=stektemp; // Вернем значение стека
sei();
return bt;
}
//======
// Функция чтения байта с датчика
uint8_t dt_readbyte(void)
{
uint8_t c=0;
uint8_t i;
for(i=0;i<8;i++)
c|=dt_readbit()<<i; // Читаем бит
return c;
}
//=======
// Функция записи бита
void dt_sendbit(uint8_t bt)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
if(bt)
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(65);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
SREG=stektemp; // Вернем значение стека
sei();
}
//=======
// Функция записи байта в датчик
void dt_sendbyte(uint8_t bt)
{
uint8_t i;
for(i=0;i<8;i++)
{
if ((bt & (1<<i))==1<<i)
dt_sendbit(1); // Передаем 1
else
dt_sendbit(0); // Передаем 0
}
}
//========
uint16_t dt_check(void)
{
uint8_t bt; // переменная для считывания байта
if (!st) // Начало первой фазы измерения
{
if (dt_test_device()==1) // Если устройство нашлось
{
dt_sendbyte(NO_ID); // Пропускаем идентификацию
dt_sendbyte(T_CONVERT);// Измеряем температуру
st=1; // Установим флаг окончания первой фазы измерения
last_time=millis;
}
}
// Вторая фаза измерения
if (millis-last_time>750) // Проверяем, прошло ли 750 мС. В 12 битном режиме преобразование 750 мС
{
last_time=millis;
dt_test_device();
dt_sendbyte(NO_ID);
dt_sendbyte(READ_DATA); //Даем команду на чтение данных
bt=dt_readbyte(); // Читаем младший бит
ttt=dt_readbyte();
ttt=(ttt<<8)|bt; // Сдвигаем старший байт влево, на его место пишем младший байт
st=0; // Готовимся к новому измерению
}
else asm("nop");
return ttt; // Возвращаем измеренную температуру
}
//======
// Преобразование температуры в единицы
uint8_t converttemp(uint16_t tt)
{
uint16_t b=0;
uint8_t t;
b=tt;
b=b>>11; // Оставляем 5 старших знаковых бит
if (b) // Если хотя бы один из этих бит равен 1, то температура отрицательная
{
v=1; // Установим флаг отрицательной температуры
t=((~tt)+1)>>4; // Проинвертируем побитно и прибавим 1 для преобразования
}
else
{
v=0; // Температура положительная
t=tt>>4; // отсекаем часть младших битов. Оставляем только единицы градусов.
}
return t;
}
Для спидометров лучше, на мой взгляд, применить измерение периода захватом. Для Вашего случая
10*S[км/час]=(36000*Fo/4073)*Nx/nox
Fo- частота тактирования таймера
Nx- число измеряемых периодов
nox- число периодов частоты тактирования за время прохождения Nx
Число в скобках является константой
Пример
Fo=8000000
Nx=1
(36000*Fo/4073)=70709550
Измеряется скорость 100км/час
nox=70709
10*S[км/час]~1000,00
Измеряется скорость 5км/час
nox=1414191
10*S[км/час]=50
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Ср сен 06, 2023 09:00:53
Starichok51
akl писал(а):Выделил Ваш текст, вставил в сообщение, выделил, обрамил тегом Code, выделил всё, обрамил тегом spoiler.
чтобы не делать до хера выделений, сначала вставляешь тег spoiler, потом внутри его вставляешь тег code, и потом внутри тега code вставляешь текст.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Ср сен 06, 2023 23:15:19
valentinovich
a_b_r_a писал(а): я вам скину проект, можете конкретно указать, что не так написано или конкретно кодом помочь в оптимизации? Там собственно все структурировано.
Если вы не возражаете, то давайте переведём вашу мысль, т.е. вы предлагаете:
1. с вашего наброска программы надо попробовать изобразить какое-то ТЗ (и наверное вы его ещё и утвердить должны?

),
2. потом попытаться понять и проанализировать видимую вами логику реализации проекта (причём уже видимо в как-то собранном виде),
3. далее по каждому логическому участку по моему усмотрению поправить логику,
4. следом (если получиться) состыковать все ваши хотелки воедино, ну и -
5. наконец написать программу на желаемом вами языке (именно получается, что уже написать заново, а не править

).
Уверяю вас, что это уже как бы "Реверс-инжиниринг", который несколько сложнее, чем просто написать кому-то свою программу по вашему ТЗ. Причём к МК, который исполнителю удобнее и на языке, который исполнитель сочтёт для сего нужным. Ну а вам тогда купить этот проект со вплюс его схемной реализацией вкупе
Ну или попытаться идти по пути который я вам уже порекомендовал:
где (повторюсь) сначала надо отделить "мух от котлет".

И сорри, но ещё раз - (1)например я не вижу подробности того что вы хотите реализовать (подробного ТЗ, графической структуры видимой вами реализации, см. посты выше). Хотя в общих чертах проект понятен.
И только когда проект будет "вылизан" логически под возможности выбранного МК, то (2)тогда уже можно будет говорить о его реализации на каком либо языке.
Вот тогда на каждом представленном вами этапе, начиная с графического представления процесса, можно будет чего-то посоветовать.
P.S. Мне это видится как-то так. Или может кто-то из форумчан вам порекомендует какой-нибудь другой путь.

P.P.S И при многих желаниях от небольшого МК, для выжима из него максимальной его производительности, Имхо проект надо бы реализовывать на ассемблере.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Чт сен 07, 2023 07:51:21
Starichok51
valentinovich, пишется не PSS, а PPS.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Чт сен 07, 2023 08:44:19
ciaas
Интереснее было бы реализовать измерение скорости по принципу оптической мышки. Авто = мышь, светит на покрытие под машиной, принимает отражение. Фантастика, конечно, но. .. когда нибудь…
При работе с 1820 я вводил переменную Mode_DS.
Возникла потребность в температуре- ставим туда 0. Далее (cli), слот reset, инкремент переменной и (sei). Спустя сколько то времени проверить переменную, она будет равна 1, - опять (cli) и следующий слот. И так далее. Тогда работа с датчиком размазывается по времени и не мешает.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Чт сен 07, 2023 13:56:26
Martian
не такая уж и фантастика, но требует решений кучки задач, и в первую очередь: поддержание чистоты оптики
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Чт сен 07, 2023 14:39:44
ciaas
Так ведь не обязательно оптика. Какой то другой сигнал.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Чт сен 07, 2023 14:44:18
>TEHb<
Надо на автомобиль установить курвиметр, только большой. Специальное колесо, которое касается дороги и измеряет пройденный путь. А если от этого пути взять производную, то получим скорость. Жаль, что на автомобилях не бывает колёс, которые всё время касаются дороги.
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Чт сен 07, 2023 16:40:37
Martian
можно вдоль дорог прокладывать зубчатую рейку, тогда зубчатое колесо очень точно отработает

Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Чт сен 07, 2023 23:29:04
valentinovich
Starichok51 писал(а):valentinovich, пишется не PSS, а PPS.

Во блин, как оно оказывается.
Благодарствую. Век живи - век учись.
Добавлено after 34 minutes 44 seconds:
>TEHb< писал(а):Надо на автомобиль установить курвиметр
Вам бы только возможности ляктроники обкакать.
А мы, например, вот не совсем курвОметр,

но аля что-то похожее с ребятами делали как-то.
Светодиодная полоса мгновенного расхода горючки (л/100км) без МК
ов ей уев,

без них короче. Практически на 2-х МС.
Оченно забавно, вполне наглядно и информативно получилось.

Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Чт сен 07, 2023 23:34:20
Martian
Да, аналог нагляднее цифры. А в качестве сенсора что?
Re: Измерение скорости автомобиля по штатному датчику
Добавлено: Пт сен 08, 2023 00:21:57
valentinovich
Martian писал(а):в качестве сенсора что?
Оооо, это надо было видеть (слышать).
Предложений по первУ сыпалось как из рога изобилия ... вот где понимаешь, что такое весёлая жизнь.
Как раз и курвиметры (почему и вспомнилось), и даже тахометры (не они, но идею выдали на горА правильную), и много чего смешного и прочего ещё. Но занимались мы не фантастическими или космическими проектами и посему волевым

решением всё же были выбраны и утверждены всё те же пресловутые стандартные родные датчики. Так как "во главу угла" всё же ставились мозговой штурм неокрепшими (но стремящихся к познаниям) умами решения задачи и попытка её реализация в пределах желательно простой электроники.