From b07b3af91aa8640f8c60deb261a9118d06433977 Mon Sep 17 00:00:00 2001 From: schodet Date: Sun, 4 Dec 2005 17:15:56 +0000 Subject: Ajout du script de calcul de moteurs. --- m/motors/motors.pl | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 m/motors/motors.pl (limited to 'm') diff --git a/m/motors/motors.pl b/m/motors/motors.pl new file mode 100644 index 0000000..8e49a1c --- /dev/null +++ b/m/motors/motors.pl @@ -0,0 +1,104 @@ +#!/usr/bin/perl +# +# Script de calcul de moteurs. +# +use warnings; +use strict; + +my $pi = 3.14159265358979323846; + +my $cod = 2000; + +my %robot = ( + m => 10, # Poid, kg + d => 80, # Diametre des roues, mm +); + +my %motors = ( + 'RE025CLL' => { + U => 12, # Tension nominale, V + n_0 => 4860, # Vitesse à vide, tr/min + M_H => 129, # Couple de démarage, mNm + }, +); + +my %gears = ( + '10' => { + i => 10, # Rapport de réduction + ro_G => 0.75, # Rendement + }, + '20.25' => { + i => 20.25, # Rapport de réduction + ro_G => 0.75, # Rendement + }, +); + +# Calcule la constante de temps mécanique. C'est le temps qu'il faut pour +# atteindre 63% de la vitesse à vide. +sub comp_tau_m_G +{ + my ($r, $m, $g) = @_; + # Sans réducteur : + # tau_m = J * R / k_m^2 + # R / k_m^2 = (n_0 * (2pi rad/tr / 60 s/min)) / (M_H * (0.001 N/mN)) + # J = m * (d/2 * 0.001 m/mm) + # Avec réducteur et deux moteurs : + # tau_m_G = tau_m / (i^2 * ro_G * 2) + my $r_ = $$r{d} / 2 / 1000; # Rayon, m + my $J = $$r{m} * $r_ * $r_; # Moment inertiel, kg/m^2 + my $w_0 = $$m{n_0} * 2 * $pi / 60; # Vitesse angulaire à vide, rad/s + my $M_H = $$m{M_H} / 1000; # Moment de démarage, N.m + my $tau_m = $J * $w_0 / $M_H; # Constante de temps mécanique sans + # réducteur, s + my $tau_m_G = $tau_m / ($$g{i} * $$g{i} * $$g{ro_G} * 2); + return $tau_m_G; +} + +# Calcule l'accélération au démarage +sub comp_a_H +{ + my ($r, $m, $g) = @_; + my $r_ = $$r{d} / 2 / 1000; # Rayon, m + my $M_H = $$m{M_H} / 1000; # Moment de démarage, N.m + my $F_t = $M_H / $r_ * $$g{i} * $$g{ro_G} * 2; # Force tangentielle, N + return $F_t / $$r{m}; # Accélération linéaire, m/s^2 +} + +# Calcule la vitesse maximale sans frotement (utopique). +sub comp_max_speed +{ + my ($r, $m, $g) = @_; + my $r_ = $$r{d} / 2 / 1000; # Rayon, m + my $w_0 = $$m{n_0} * 2 * $pi / 60; # Vitesse angulaire à vide, rad/s + return $w_0 / $$g{i} * $r_; # Vitesse linéaire à vide, m/s +} + +# Calcule la résolution du codeur. +sub comp_cod_res +{ + my ($r, $m, $g) = @_; + my $r_ = $$r{d} / 2 / 1000; # Rayon, m + return $r_ * 2 * $pi / $$g{i} / $cod; +} + +sub compute +{ + my ($r, $mn, $gn) = @_; + my ($m, $g) = ($motors{$mn}, $gears{$gn}); + #my ($in, $out, $def) = ("", "", ""); + my ($in, $out, $def) = ("\e[31m", "\e[33m", "\e[0m"); + print "m: $in$$r{m}$def, d: $in$$r{d}$def, motor: $in$mn$def, gears: $in$gn$def\n"; + printf " vitesse max à vide : $out%.2f$def m/s\n", comp_max_speed ($r, $m, $g); + printf " accélération au démarage : $out%.2f$def m/s^2\n", comp_a_H ($r, $m, $g); + printf " résolution codeur : $out%.4f$def mm\n", comp_cod_res ($r, $m, $g) * 1000; + printf " tau_m_G : $out%.2f$def s (temps avant 63%% de la vitesse)\n", + comp_tau_m_G ($r, $m, $g); + print "\n"; +} + +compute ({ m => 10, d => 80 }, 'RE025CLL', 10); +compute ({ m => 10, d => 80 }, 'RE025CLL', 20.25); +compute ({ m => 10, d => 60 }, 'RE025CLL', 10); +compute ({ m => 10, d => 60 }, 'RE025CLL', 20.25); +compute ({ m => 10, d => 40 }, 'RE025CLL', 10); +compute ({ m => 10, d => 40 }, 'RE025CLL', 20.25); -- cgit v1.2.3