Matematický výpočet

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Matematický výpočet

Příspěvek od Axamith » 02 úno 2021, 17:27

Píšu program na řízení DC motoru pomocí PWM regulace. Narazil jsem při zadávání matematického výpočtu na zajímavou situaci.
Potřebuji vypočítat hodnotu PWM v % z maxima.
max. hodnota = 255
10 % = (255/100) * 10
50 % = (255/100) * 50
100 % = (255/100) * 100

zadáno do programu:

Kód: Vybrat vše

byte rot_speed = 100; // otáčky rozsah 1-100 %
byte pwm_speed = (255/100) * rot_speed ;


void setup() {
    Serial.begin(9600);
    Serial.print("pwm_speed ");
    Serial.println(pwm_speed);
}

void loop() {

}
Podle uvedeného výpočtu bych měl získat vypočtenou hodnotu pwm_speed = 255. Kupodivu se mi vrací hodnota 200. Asi bych měl vrátit vysvědčení z první třídy . . .

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Matematický výpočet

Příspěvek od ArduXPP » 02 úno 2021, 17:52

Já bych tam dal 2.55*rot_speed, další problém je u 50% což vychází na 127,5 :) Ale myslím, že bude potřeba změnit byte nebo dát 255*rot_speed a pak dělit 100.

Ještě dodám, že byte neumožňuje desetinou čárku.

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Matematický výpočet

Příspěvek od Axamith » 02 úno 2021, 18:05

Výpočtově jsem to vyřešil takto s následným převodem do byte (tedy celé číslo).
V tomto příkladu (53 % z 255) vrátí správně 135.

Kód: Vybrat vše


float rot_speed = 53; // otáčky rozsah 1-100 %
float speed = 2.55*rot_speed  ;
byte pwm_speed = speed;

void setup() {
    Serial.begin(9600);
    Serial.print("pwm_speed ");
    Serial.println(pwm_speed);
}

void loop() {

}
Jen mi uniká, proč při počítání přímo s byte vrací tak diametrálně rozdílné výsledky.

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Matematický výpočet

Příspěvek od ArduXPP » 02 úno 2021, 18:12

Jestli byte ti neveme desetinnou čárku, tak pak byte počítal místo 2.55 jen 2 :)

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Matematický výpočet

Příspěvek od Axamith » 02 úno 2021, 18:29

To je ono, nedokáže v byte vypočítat n / 100, zaokrouhlí na celé číslo.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Matematický výpočet

Příspěvek od kiRRow » 02 úno 2021, 20:21

byte 255 / byte 100 = byte 2
byte 2 * byte 100 = byte 200
výsledek je naprosto správný ...

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Matematický výpočet

Příspěvek od gilhad » 03 úno 2021, 00:04

V podstate ano, akorat to je

Kód: Vybrat vše

int 255 / int 100 = int 2
int 2 * byte 100 = int 200
int 200 = byte 200
protoze v C++ se defaultne prevadi na inty, pokud neni uveden typ

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Matematický výpočet

Příspěvek od KamilV » 03 úno 2021, 00:20

Kód: Vybrat vše

pwm_speed = map(rot_speed, 0, 100, 0, 255);
Zdá se mi to o dost čtivější a pokud dobře počítám, zabere to v paměti i méně místa, než varianta s floaty.

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Matematický výpočet

Příspěvek od Axamith » 03 úno 2021, 06:17

Kamile díky, vyzkouším. Při posledním větším projektu jsem se dostával do úzkých s kapacitou paměti, tohle by byla dobrá cesta, jak ušetřit.
Tady jsem dohledal nějaké info https://www.arduino.cc/reference/en/lan ... /math/map/

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Matematický výpočet

Příspěvek od ondraN » 03 úno 2021, 07:01

Ono by bohatě stačilo změnit pořadí operací
(255*rot_speed)/100;

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 15 hostů