ajuda com cadeira motorizada

Eu tenho esse codigo que controla minha cadeira motorizada
e não sei programar
mas preciso de um pwm com subida e descida suave ,para que não haja trancos nos motores
alguem me socorre por favor?

//usar defines nao gasta memoria RAM no armazenamento das
//constantes do programa.

#define portaH_1a 11
#define portaH_1b 10

#define portaH_2a 5
#define portaH_2b 6

#define potpin A0
#define potpin2 A3

int led = 3;

int val_pot_1;
int val_pot_2;

int pwm_1_a;
int pwm_1_b;

int pwm_2_a;
int pwm_2_b;

void setup()
{
Serial.begin(9600);

//seta os modos dos pinos
pinMode( portaH_1a, OUTPUT );
pinMode( portaH_2a, OUTPUT );
pinMode( portaH_1b, OUTPUT );
pinMode( potpin, INPUT );
pinMode( potpin2, INPUT );
pinMode( led, OUTPUT );
}

void loop()
{
//leitura do potenciometro
val_pot_1 = analogRead(potpin);
val_pot_2 = analogRead(potpin2);

//mapeamento para 0-511 pino A - 512-1023 pino B
pwm_1_a = map(val_pot_1, 0, 511, 255, 0);
pwm_1_b = map(val_pot_1, 512, 1023, 0, 255);

//mapeamento da ponte 2
pwm_2_a = map(val_pot_2, 0, 511, 255, 0);
pwm_2_b = map(val_pot_2, 512, 1023, 0, 255);

//proteçes
if (val_pot_1 > 511)
pwm_1_a = 0;
else
pwm_1_b = 0;

if (val_pot_2 > 511)
pwm_2_a = 0;
else
pwm_2_b = 0;

if (pwm_1_a > 5) //controle freio
{
digitalWrite(led, HIGH); //aciona freio
}
else if (pwm_1_b > 5) {
digitalWrite(led, HIGH);
}
else if (pwm_2_a > 5) {
digitalWrite(led, HIGH);
}
else if (pwm_2_b > 5) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW); //desliga freio
}

if ( pwm_1_a < 8) pwm_1_a = 0;
if ( pwm_2_a < 8) pwm_2_a = 0;
if ( pwm_1_b < 8) pwm_1_b = 0;
if ( pwm_2_b < 8) pwm_2_b = 0;

//Atualiza portas da ponte H1
analogWrite(portaH_1a, pwm_1_a);

analogWrite(portaH_1b, pwm_1_b);

//Atualiza portas da ponte H2
analogWrite(portaH_2a, pwm_2_a);

analogWrite(portaH_2b, pwm_2_b);

}

Basicamente precisas dum filtro para fazer uma rampa tendo em conta qualquer variação do sinal de entrada.

Este site tem um exemplo para criar o código com o filtro.
https://helpful.knobs-dials.com/index.php/Low-pass_filter

Tens de trocar o define:

[color=#339933]#define LOWPASS_ANALOG_PIN_AMT 6[/color]

Para o pino que estás a utilizar no teu código, que é 0 e 3

Diz se encontrares mais dificuldades com isto.

Grato pela resposta amigo

eu li o código , porem não sei programar
não consigo adaptar esse código filtro no meu código
não sei nem por onde começar preciso de ajuda com isso
pode me ajudar?

Queres explicar para que é isto?

preciso de uma média movel, para que filtre as entradas do joystick , e na saida do pwm não haja variações bruscas que podem ser causadas com o acionamento do jystick

Olá edinhoed.
Se a cadeira dá solavancos. Talvez o problema não seja a leitura do joystick e sim o acionamento dos motores que partem de forma brusca.
Qual é o tipo de motor usado?
Se for um motor com variação de acionamento, uma solução é criar um for para que esse acionamento seja progressivo (com micro intervalos de tempo) do ponto inicial, até atingir o ponto final.

Caso a ideia seja realmente calcular uma média.

Será necessário duas funções:

para substituir:

  //leitura do potenciometro
  val_pot_1 = analogRead(potpin);
  val_pot_2 = analogRead(potpin2);

por:

  //leitura do potenciometro
  val_pot_1 = mediapin1();
  val_pot_2 = mediapin2();

cria a função para cada um, por exemplo

int mediapin1(){
    int leitura;
    int qtleituras = 10; // Quantidade de Amostras para a média.
    int soma;
    int media;
    int x;
    for (x=0; x <= qtleituras; x++){
        leitura= analogRead(potpin);
        soma = soma + leitura;
    }
    media=soma/qtleituras;
    return media;
}

PS:
Tem outros jeitos também, consulte esse exemplo:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.