Обсуждаем контроллеры компании Atmel.
Ответить

Re: Измерение скорости автомобиля по штатному датчику

Вт сен 05, 2023 22:12:14

a_b_r_a, вы же можете аппаратно считать импульсы одним из счётчиков, без использования прерываний. Время от времени смотреть, сколько там натикало. И дельту прибавлять уже к счётчику, допустим, 32-х битному.
Изображение

Re: Измерение скорости автомобиля по штатному датчику

Вт сен 05, 2023 22:35:45

Все тайминги из даташита

Добавлено after 3 minutes 15 seconds:
a_b_r_a, вы же можете аппаратно считать импульсы одним из счётчиков, без использования прерываний.

Как вариант можно попробовать.

Добавлено after 17 minutes 2 seconds:
Как я думаю тогда поступить. Да, идея хорошая по входу внешнего тактирования T1 считать импульсы. У меня есть прерывание по таймеру T0. Каждую 1 миллисекунду. Можно проверять счетчик миллисекунд и когда он дойдет до тысячи (1 сек) смотреть содержимое счетного регистра. Наверно это будет не совсем точно, но попробовать можно.

Re: Измерение скорости автомобиля по штатному датчику

Вт сен 05, 2023 22:35:57

Martian
Если 4000 импульсов на километр, то при скорости 300 км/ч какая частота импульсов? 350 герц? И не успевает? :shock:
Ну чему тут удивляться - логическая обработка на уровне решения задач третьего класса. Какое-то деление или умножение на какой-то коэффциент, зачем-то подсчёт герц, ... :shock: . С "железом" надо работать несколькопо по друному. На его "мышлении" 0/1, т.е. как там в фильме: <без фанабериев всяких>, :) уходя от неоправданных сложных вычислений (тем более, что это вполне достаточный, но всё же маленький МК),

Martian
...а вот с программой что-то не то...
Да уж и с работой с прерываниями не совсем и попытка в языке высокого уровня изгаляться при решении простейших текущих задач, решаемых в две команды на ассмеблере.

Короче - проект может и интересный, но подготовка исполнителя по его логической и языковой реализации, мягко говоря, пока слабовата.
a_b_r_a, чтоб не "тонуть" в словофлуде вокруг да около, я вот вижу это так (т.е. сугубо имхо): если писать о достаточно многозадачном проекте, то его, вами видимое, прохождение желательно предоставлять к совету не словесно, а в графическом виде с вашими комментариями. Сначала отдельными кусками по задачам, потом уже обьединять.

Re: Измерение скорости автомобиля по штатному датчику

Вт сен 05, 2023 22:39:40

Кстати, попробую я завтра в прерывании которое каждую миллисекунду инвертировать какую-нибудь ножку МК и гляну осликом, что там происходит. А потом подам 113 герц на вход скорости и гляну еще раз.

Re: Измерение скорости автомобиля по штатному датчику

Вт сен 05, 2023 22:47:59

И прислушаться к valentinovich - разбить задачу, нарисовав и описав некую блок-схему, получить в итоге ТЗ и решить его оптимальнейшим образом. По тому что сейчас непонятно, зачем каждую миллисекунду что-то там вызывается (хотя, мож и говорилось, но я пропустил)? это ведь чуть ли не на порядок быстрее, чем частота вспышек в цилиндрах...

Re: Измерение скорости автомобиля по штатному датчику

Вт сен 05, 2023 22:53:14

И прислушаться к valentinovich По тому что сейчас непонятно, зачем каждую миллисекунду что-то там вызывается.

Вы писали код когда-нибудь на Си? Если я вам скину проект, можете конкретно указать, что не так написано или конкретно кодом помочь в оптимизации? Там собственно все структурировано.

Re: Измерение скорости автомобиля по штатному датчику

Вт сен 05, 2023 22:58:07

Код:
 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

Спасибо, поправлю в коде.

Re: Измерение скорости автомобиля по штатному датчику

Ср сен 06, 2023 06:32:27

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

akl писал(а):Выделил Ваш текст, вставил в сообщение, выделил, обрамил тегом Code, выделил всё, обрамил тегом spoiler.
чтобы не делать до хера выделений, сначала вставляешь тег spoiler, потом внутри его вставляешь тег code, и потом внутри тега code вставляешь текст.

Re: Измерение скорости автомобиля по штатному датчику

Ср сен 06, 2023 23:15:19

a_b_r_a писал(а): я вам скину проект, можете конкретно указать, что не так написано или конкретно кодом помочь в оптимизации? Там собственно все структурировано.
Если вы не возражаете, то давайте переведём вашу мысль, т.е. вы предлагаете:
1. с вашего наброска программы надо попробовать изобразить какое-то ТЗ (и наверное вы его ещё и утвердить должны? :) ),
2. потом попытаться понять и проанализировать видимую вами логику реализации проекта (причём уже видимо в как-то собранном виде),
3. далее по каждому логическому участку по моему усмотрению поправить логику,
4. следом (если получиться) состыковать все ваши хотелки воедино, ну и -
5. наконец написать программу на желаемом вами языке (именно получается, что уже написать заново, а не править :( ).
Уверяю вас, что это уже как бы "Реверс-инжиниринг", который несколько сложнее, чем просто написать кому-то свою программу по вашему ТЗ. Причём к МК, который исполнителю удобнее и на языке, который исполнитель сочтёт для сего нужным. Ну а вам тогда купить этот проект со вплюс его схемной реализацией вкупе
Ну или попытаться идти по пути который я вам уже порекомендовал:
где (повторюсь) сначала надо отделить "мух от котлет". :) И сорри, но ещё раз - (1)например я не вижу подробности того что вы хотите реализовать (подробного ТЗ, графической структуры видимой вами реализации, см. посты выше). Хотя в общих чертах проект понятен.
И только когда проект будет "вылизан" логически под возможности выбранного МК, то (2)тогда уже можно будет говорить о его реализации на каком либо языке.
Вот тогда на каждом представленном вами этапе, начиная с графического представления процесса, можно будет чего-то посоветовать.

P.S. Мне это видится как-то так. Или может кто-то из форумчан вам порекомендует какой-нибудь другой путь. :roll:
P.P.S И при многих желаниях от небольшого МК, для выжима из него максимальной его производительности, Имхо проект надо бы реализовывать на ассемблере.
Последний раз редактировалось valentinovich Чт сен 07, 2023 22:52:14, всего редактировалось 1 раз.

Re: Измерение скорости автомобиля по штатному датчику

Чт сен 07, 2023 07:51:21

valentinovich, пишется не PSS, а PPS.

Re: Измерение скорости автомобиля по штатному датчику

Чт сен 07, 2023 08:44:19

Интереснее было бы реализовать измерение скорости по принципу оптической мышки. Авто = мышь, светит на покрытие под машиной, принимает отражение. Фантастика, конечно, но. .. когда нибудь…
При работе с 1820 я вводил переменную Mode_DS.
Возникла потребность в температуре- ставим туда 0. Далее (cli), слот reset, инкремент переменной и (sei). Спустя сколько то времени проверить переменную, она будет равна 1, - опять (cli) и следующий слот. И так далее. Тогда работа с датчиком размазывается по времени и не мешает.

Re: Измерение скорости автомобиля по штатному датчику

Чт сен 07, 2023 13:56:26

не такая уж и фантастика, но требует решений кучки задач, и в первую очередь: поддержание чистоты оптики

Re: Измерение скорости автомобиля по штатному датчику

Чт сен 07, 2023 14:39:44

Так ведь не обязательно оптика. Какой то другой сигнал.

Re: Измерение скорости автомобиля по штатному датчику

Чт сен 07, 2023 14:44:18

Надо на автомобиль установить курвиметр, только большой. Специальное колесо, которое касается дороги и измеряет пройденный путь. А если от этого пути взять производную, то получим скорость. Жаль, что на автомобилях не бывает колёс, которые всё время касаются дороги.

Re: Измерение скорости автомобиля по штатному датчику

Чт сен 07, 2023 16:40:37

можно вдоль дорог прокладывать зубчатую рейку, тогда зубчатое колесо очень точно отработает :)

Re: Измерение скорости автомобиля по штатному датчику

Чт сен 07, 2023 23:29:04

Starichok51 писал(а):valentinovich, пишется не PSS, а PPS.
:shock: Во блин, как оно оказывается.
Благодарствую. Век живи - век учись. :))

Добавлено after 34 minutes 44 seconds:
>TEHb< писал(а):Надо на автомобиль установить курвиметр
Вам бы только возможности ляктроники обкакать. :)
А мы, например, вот не совсем курвОметр, :) но аля что-то похожее с ребятами делали как-то.
Светодиодная полоса мгновенного расхода горючки (л/100км) без МКов ей уев, :facepalm: без них короче. Практически на 2-х МС.
Оченно забавно, вполне наглядно и информативно получилось. Изображение

Re: Измерение скорости автомобиля по штатному датчику

Чт сен 07, 2023 23:34:20

Да, аналог нагляднее цифры. А в качестве сенсора что?

Re: Измерение скорости автомобиля по штатному датчику

Пт сен 08, 2023 00:21:57

Martian писал(а):в качестве сенсора что?
Оооо, это надо было видеть (слышать). :)
Предложений по первУ сыпалось как из рога изобилия ... вот где понимаешь, что такое весёлая жизнь. :))
Как раз и курвиметры (почему и вспомнилось), и даже тахометры (не они, но идею выдали на горА правильную), и много чего смешного и прочего ещё. Но занимались мы не фантастическими или космическими проектами и посему волевым 8) решением всё же были выбраны и утверждены всё те же пресловутые стандартные родные датчики. Так как "во главу угла" всё же ставились мозговой штурм неокрепшими (но стремящихся к познаниям) умами решения задачи и попытка её реализация в пределах желательно простой электроники.
Ответить