реклама на сайте
подробности

 
 
> сделать конвертацию бит с АЦП в температуру, по таблице
Метценгерштейн
сообщение Feb 6 2015, 15:32
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



немного торможу, как лучше?
т.е. получил с АЦП данные- 33.
я знаю, что по таблице это температура = 10.

как-то через ф-ю завернуть надо
Код
uint8_t convert_to_temp (uint8_t data)
{
    
}



если через дефайн, то

#define 33 10

Код
uint8_t convert_to_temp (uint8_t data)
{
    return 33;
}


надо как-то избавиться от цифр, а то не так поймут. Вот как?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Sergei_Ilchenko
сообщение Feb 6 2015, 15:34
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 180
Регистрация: 17-05-05
Из: Санкт-Петербург
Пользователь №: 5 128



Кто не так поймет?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 6 2015, 15:38
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



может где в коде еще цифры встретятся, он их возьмет и дефайнами заменит- не нравится так.
Как-то по-другому можно, уверен. Но не пойму как.
Go to the top of the page
 
+Quote Post
Sergei_Ilchenko
сообщение Feb 6 2015, 15:41
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 180
Регистрация: 17-05-05
Из: Санкт-Петербург
Пользователь №: 5 128



Через массив не экономично?
Go to the top of the page
 
+Quote Post
_pv
сообщение Feb 6 2015, 15:42
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



чтобы провести прямую надо, как известно, две точки, это в случае если зависимость кода от температуры линейная
что покажет АЦП при температуре например 20? 30?

#define, слава богу, менять одни цифры на другие не обучен. только буквы на цифры или буквы на буквы.
Go to the top of the page
 
+Quote Post
Sergei_Ilchenko
сообщение Feb 6 2015, 15:42
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 180
Регистрация: 17-05-05
Из: Санкт-Петербург
Пользователь №: 5 128



Зависимость линейная или нет?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 6 2015, 15:42
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



точно! про него-то и не подумал)

зависимость логарифмическая
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2015, 16:14
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Код
uint8_t convert_to_temp (uint8_t x)
{
    return (a + x * (b + x * (c + x * d))); // a + bx + cxx + dxxx
}
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Feb 6 2015, 16:15
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(Метценгерштейн @ Feb 6 2015, 15:42) *
точно! про него-то и не подумал)

зависимость логарифмическая


Какова разрядность ацп-то ?
А то размер массива (lookup table) будет 2^(разрядность ацп). Для 16-битного ацп потребуется массив размером 65536 элементов.
Забивать в него значения ручками будете ? sm.gif

Кроме того, при неграмотном написании кода весь этот массив может копироваться из ROM в RAM при каждом входе в функцию перекодировки.
Кое-кто тут уже всласть побегал по этим граблям sm.gif

Может дешевле будет вычислять с помощью кусочно-линейной аппроксимации. На easyelectornics.ru DiHalt (а может кто-то еще) писал очень доступную статью по этому поводу.

Сообщение отредактировал CrimsonPig - Feb 6 2015, 16:15
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 8 2015, 10:04
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



АЦП 10 бит всего-то.
написал так:
Код
uint16_t mass_convert[121]= {20,21,22,23,25,26,27,28,30,31,33,35,36,38,40,42,44,46,48,50,52,54,57,59,62,65,6
8,71,74,77,80,83,87,90,94,98,102,106,110,114,118,123,
128,132,137,142,148,153,159,164,170,176,182,188,195,201,208,215,222,229,237,244,
252,260,268,276,284,293,302,310,319,329,338,347,357,367,377,387,397,407,418,428,
439,450,461,472,483,494,506,517,529,540,553,564,576,588,600,612,625,637,649,661,
673,685,697,709,721,733,745,758,770,782,795,808,821,833,847,860,873,887,900, };
    

uint8_t convert_to_temp (uint16_t data) // return celsius
{
    for (uint8_t i =0; i < 121; i++) // data = 24
    {
        if (data == mass_convert [i])
        {
            return i;
        }
        else if (data < mass_convert [i])
        {
            return (i-1);
        }
    }
    return 0;
}

данные в экселе посчитал и скопировал туда. Их не много.
Такой код нормальный?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 8 2015, 11:28
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ViKo @ Feb 6 2015, 20:14) *
Код
uint8_t convert_to_temp (uint8_t x)
{
    return (a + x * (b + x * (c + x * d))); // a + bx + cxx + dxxx
}

+ пицот! Его только в форме Горнера и вычислять. И только кубик.
Остальные уже не так томно, особенно когда юзать стандартные полиномы для термопар.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 8 2015, 13:29
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Метценгерштейн @ Feb 8 2015, 05:04) *
АЦП 10 бит всего-то.
написал так:
Код
uint16_t mass_convert[121]= {...};
    

uint8_t convert_to_temp (uint16_t data) // return celsius
{
    for (uint8_t i =0; i < 121; i++) // data = 24
    {
    ...
        }
    return 0;
}

данные в экселе посчитал и скопировал туда. Их не много.
Такой код нормальный?


Вместо "121" в loop, лучше всегда пользовать sizeof(mass_convert)
так более нормально.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 8 2015, 14:25
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Цитата(A. Fig Lee @ Feb 8 2015, 16:29) *
Вместо "121" в loop, лучше всегда пользовать sizeof(mass_convert)
так более нормально.

а вот и нет, т.к. выведет общую сумму байт.
а у меня 2 байта на ячейку.

тогда лучше делать sizeof(mass_convert)/sizeof(uint16_t)
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 15:06
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



А какой великий смысл в двух сравнениях? На == и на <? Когда для проверки интервала достаточно одно условие <=. Докучи, Ваш код вернет (uint8_t)(0-1), что равно 0xFF для кодов АЦП, меньших 20. Это раз. А два - я бы делал поиск методом половинного деления, чем перебирать все значения по очереди... Это же долго...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 9 2015, 08:44
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Цитата(SM @ Feb 8 2015, 18:06) *
А какой великий смысл в двух сравнениях? На == и на <? Когда для проверки интервала достаточно одно условие <=. Докучи, Ваш код вернет (uint8_t)(0-1), что равно 0xFF для кодов АЦП, меньших 20. Это раз. А два - я бы делал поиск методом половинного деления, чем перебирать все значения по очереди... Это же долго...

возвращает он номер элемента массива, что равно температуре. Думаете, номер массива вылезет за 0xFF ? Нет, конечно.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 00:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01494 секунд с 7
ELECTRONIX ©2004-2016