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;