Stránka 1 z 2

Matematický výpočet

Napsal: 02 úno 2021, 17:27
od Axamith
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 . . .

Re: Matematický výpočet

Napsal: 02 úno 2021, 17:52
od ArduXPP
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.

Re: Matematický výpočet

Napsal: 02 úno 2021, 18:05
od Axamith
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.

Re: Matematický výpočet

Napsal: 02 úno 2021, 18:12
od ArduXPP
Jestli byte ti neveme desetinnou čárku, tak pak byte počítal místo 2.55 jen 2 :)

Re: Matematický výpočet

Napsal: 02 úno 2021, 18:29
od Axamith
To je ono, nedokáže v byte vypočítat n / 100, zaokrouhlí na celé číslo.

Re: Matematický výpočet

Napsal: 02 úno 2021, 20:21
od kiRRow
byte 255 / byte 100 = byte 2
byte 2 * byte 100 = byte 200
výsledek je naprosto správný ...

Re: Matematický výpočet

Napsal: 03 úno 2021, 00:04
od gilhad
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

Re: Matematický výpočet

Napsal: 03 úno 2021, 00:20
od KamilV

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.

Re: Matematický výpočet

Napsal: 03 úno 2021, 06:17
od Axamith
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/

Re: Matematický výpočet

Napsal: 03 úno 2021, 07:01
od ondraN
Ono by bohatě stačilo změnit pořadí operací
(255*rot_speed)/100;