Конкурс

Hello Andrej.

28 Jun 06 15:05, you wrote to George Shepelev:

А можно в двух словах, что оно делает? Ато запихивать комменты в переводчик на альтависте... а потом читать этот перевед и чихать... Nicolas

Reply to
Nicolas Minakov
Loading thread data ...

Hello, George! You wrote to Nicolas Minakov on Tue, 27 Jun 2006 10:23:31 +0600:

GS> Пятница Июнь 23 2006 08:09, Nicolas Minakov wrote to Alexandr GS> Torres:

??>>> "ноу-хау" - назывется "кусочно-линейная аппроскимация". ??>>> Извини, сплайном на пике, или на той мотороле для которой это ??>>> писалось когда-то, делать трудно :) NM>> Ж;-). Посыпаю головy пеплом. NM>> Для меня самая сложная часть в этом конкyрсе - подогнать таблицy NM>> под реальный NTC. GS> Подгонкой может персоналка заняться, не только ведь игрушки на ней GS> гонять ;) Программка подгонки пишется на чём угодно (привычно, GS> наглядно...) Да это имхо ввобще дело десятое, откуда табличка возмётся. Мне сама идея, как интерпретировать значения в точках, как вычислять промежточные, уж больно "прямолинейной" показалась. Никакого куража, никакой выдумки. Скучно, нудно.

Извините, что коментарии тут на немецком, выдернул из проекта как есть...

//- Andrej Arnold 01_10_2005 #define MAIN_GPS

/* -->|----- 12 -----|<-- #define MASKE 0xF000 - 1111.0000.0000.0000 #define BIT_CHECK 0x0800 - 0000.1000.0000.0000 #define SHIFT_BIT 12 Natuerlich es alles kann man auch programmmaessig berechnen aus belibiger einer definition, aber es ist aufwendig und bringt uns hier keine Vorteile.

*/

#include "iom128v.h" #include "gps_wert.h"

/*...wird der Wert fuer "berechnung_position" gesucht und am Ende zurueckgegeben. Gemeint ist, dass Werte zwischen bekanten Punkten befinden sich auf einer Gerade... ... wegen schieben "int" nach links kann das Ergebnis bis auf zwei digits kleiner (weil Endwert ist 0xFFFF und nicht 0x10000) oder ein digits groesser sein als man erwartet, aber dieser Fehler ist viel kleiner (0,003%) als der erwartete Fehler vom Aenderung des Widerstands der Zufuehrleitungen und Genauigkeit der Analogtechnik. (Endlast ist zur Zeit mir nicht bekant.)

Vorteil ist dass verwendet werden nur resursensparende Befehle. Nachteil - es koennen nur (2^n+1), bekante Punkte sein mit gleichem Abstand zwischen ihnen.

*/ unsigned int gps_berechnen(unsigned int berechnung_position) { unsigned int wert_l, wert_h, wert_m; unsigned int temp_low; unsigned int temp_high; unsigned int temp_bit; unsigned int position;

temp_bit = BIT_CHECK; //werden bekante Werte zwischen denen der gesuche //Wert ligt, ermittelt position = berechnung_position>>SHIFT_BIT; wert_l = punkt_werte[position]; wert_h = punkt_werte[position +1];

while (temp_bit) { temp_low = wert_l>>1; temp_high = wert_h>>1; wert_m = temp_low + temp_high; //Mittelwert ist gefunden if (berechnung_position & temp_bit) { wert_l = wert_m; } else { wert_h = wert_m; } //und so kommen wir dem gesuchtem Wert naeher temp_bit = temp_bit>>1; } return wert_m; }

ещё хидер

/* ADCDAC16_DAC.h */ #ifndef _GPS_WERT_H_ #define _GPS_WERT_H_

#define PUNKTEN 17 #define MASKE 0xF000; #define BIT_CHECK 0x0800; #define SHIFT_BIT 12;

#define PUNKT0 0x0000 #define PUNKT1 0x1000 #define PUNKT2 0x2000 #define PUNKT3 0x3000 #define PUNKT4 0x4000 #define PUNKT5 0x5000 #define PUNKT6 0x6000 #define PUNKT7 0x7000 #define PUNKT8 0x8000 #define PUNKT9 0x9000 #define PUNKT10 0xA000 #define PUNKT11 0xB000 #define PUNKT12 0xC000 #define PUNKT13 0xD000 #define PUNKT14 0xE000 #define PUNKT15 0xF000 #define PUNKT16 0xFFFF

#ifdef MAIN_GPS #define EXTERN #else #define EXTERN extern #endif

EXTERN unsigned int punkt_werte[PUNKTEN];

extern unsigned int gps_berechnen(unsigned int);

#endif /* _ADCDAC16_DAC_H_ */

и ещё текстовый кусок, какой он был, для полного счастья...

#include "iom128v.h" #include "gps_wert.h"

void foo(void);

void foo(void) { //------------------------ // fuer Testzwecke fuellen... punkt_werte[0] = PUNKT0; punkt_werte[1] = PUNKT1; punkt_werte[2] = PUNKT2; punkt_werte[3] = PUNKT3; punkt_werte[4] = PUNKT4; punkt_werte[5] = PUNKT5; punkt_werte[6] = PUNKT6; punkt_werte[7] = PUNKT7; punkt_werte[8] = PUNKT8; punkt_werte[9] = PUNKT9; punkt_werte[10] = PUNKT10; punkt_werte[11] = PUNKT11; punkt_werte[12] = PUNKT12; punkt_werte[13] = PUNKT13; punkt_werte[14] = PUNKT14; punkt_werte[15] = PUNKT15; punkt_werte[16] = PUNKT16; //------------------------ }

void main(void) { unsigned int w; w = 0x1111; // das man Enderungen sieht foo(); //------------------------- w = gps_berechnen(0xf7fe); //------------------------- punkt_werte[0] = 0x4321; punkt_werte[1] = 0x2345; }

With best regards, Andrej Arnold. E-mail: snipped-for-privacy@aol.com

Reply to
Andrej Arnold

Hello, Nicolas! You wrote to Andrej Arnold on Wed, 28 Jun 2006 12:55:00 +0600:

??>> Извините, что коментарии тут на немецком, выдернул из ??>> проекта как есть... ??>> //- Andrej Arnold 01_10_2005 ??>> #define MAIN_GPS

Находит значения расположенные между известными точками загнанной в память кривой. (В примере просто линия от 0 до FFFF) Формат представления исходного значения величины и результата - int. Ошибка вычисления (от мах) там указана. А так не более двух единиц из-за того, что конечное значение не 0х10000.

Другими словами имеешь результат с ADC, его подставляешь, получаешь на выходе температуру в указанном выше (int) формате.

ЗЫ. А уж красиво выбрать пределы для конкретной задачи - это подогнать по месту то, что требуется;) Например, 10000 соответствует 100,00╠C. В формате выбрать, что 100╠C соответствует 40000 ( 0х9С40 чтобы точность вычисления не страдала). В самом конце тогда результат сдвинуть вправо на 2 позиции, ну и при желании, для пущей важности можно ещё и округлить. Хотя последнее лишнее. Так точно такими сенсорами и конверторами температуру не измерить.

With best regards, Andrej Arnold. E-mail: snipped-for-privacy@aol.com

Reply to
Andrej Arnold

Andrej, ты ещё здесь сидишь?

Среда Июнь 28 2006 15:05, Andrej Arnold wrote to George Shepelev:

NM>>> Ж;-). Посыпаю головy пеплом. NM>>> Для меня самая сложная часть в этом конкyрсе - подогнать таблицy NM>>> под реальный NTC. GS>> Подгонкой может персоналка заняться, не только ведь игрушки на GS>> ней гонять ;) Программка подгонки пишется на чём угодно GS>> (привычно, наглядно...) AA> Да это имхо ввобще дело десятое, откуда табличка возмётся.

По большому счёту любая табличка изначально берётся из чьей-то головы ;)

AA> Мне сама идея, как интерпретировать значения в точках, AA> как вычислять промежточные, уж больно "прямолинейной" AA> показалась.

Hикто тебе не запрещает попробовать написать свой собственный вариант расчёта таблички аппроксимации. Иногда удаётся сделать лучше, чем предлагают, особенно если конкретные условия нетипичные.

Георгий

Reply to
George Shepelev

Hello Andrej.

28 Jun 06 18:25, you wrote to me:

??>>> Извините, что коментарии тут на немецком, выдернул из ??>>> проекта как есть... ??>>> //- Andrej Arnold 01_10_2005 ??>>> #define MAIN_GPS >>> А можно в двух словах, что оно делает?

Спасибо. Переведу и посмотрю обязательно. Nicolas

Reply to
Nicolas Minakov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.