|
сделать конвертацию бит с АЦП в температуру, по таблице |
|
|
|
Feb 6 2015, 15:32
|
Профессионал
    
Группа: Свой
Сообщений: 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; } надо как-то избавиться от цифр, а то не так поймут. Вот как?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Feb 6 2015, 16:15
|

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

|
Цитата(Метценгерштейн @ Feb 6 2015, 15:42)  точно! про него-то и не подумал)
зависимость логарифмическая Какова разрядность ацп-то ? А то размер массива (lookup table) будет 2^(разрядность ацп). Для 16-битного ацп потребуется массив размером 65536 элементов. Забивать в него значения ручками будете ?  Кроме того, при неграмотном написании кода весь этот массив может копироваться из ROM в RAM при каждом входе в функцию перекодировки. Кое-кто тут уже всласть побегал по этим граблям  Может дешевле будет вычислять с помощью кусочно-линейной аппроксимации. На easyelectornics.ru DiHalt (а может кто-то еще) писал очень доступную статью по этому поводу.
Сообщение отредактировал CrimsonPig - Feb 6 2015, 16:15
|
|
|
|
|
Feb 8 2015, 10:04
|
Профессионал
    
Группа: Свой
Сообщений: 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; } данные в экселе посчитал и скопировал туда. Их не много. Такой код нормальный?
|
|
|
|
|
Feb 8 2015, 13:29
|

Знающий
   
Группа: Участник
Сообщений: 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) так более нормально.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Feb 8 2015, 14:25
|
Профессионал
    
Группа: Свой
Сообщений: 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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|