PWM a base de HC-Sr04

Soy nuevo en Arduino. la verdad necesito ayuda.
tengo un sensor de distancia y me gustaria producir una señal PWM proporcional a la distancia que hay entre el sensor y un objeto.
tenia un codigo para medir la distancia y otro para producir la señal pero no funciona como deseo. alguien me podria explicar que tengo mal.
adjunto el codigo que estoy utilizando

int Trig = 12;

int Echo = 13;
const int salida=3;
int out;


void setup ()
{
 Serial.begin(9600);
 pinMode(Trig, OUTPUT);
 pinMode(Echo, INPUT);
 pinMode(salida, OUTPUT);
}




void loop()
{
 long duracion;
 long distancia;
 int Distancia=distancia;
 const int Salida=3;


 
 digitalWrite(Trig, LOW);
 delayMicroseconds(4);
 digitalWrite(Trig, HIGH);
 delayMicroseconds(10);
 digitalWrite(Trig, LOW);


 duracion = pulseIn(Echo, HIGH);
 duracion = duracion / 2;


 distancia = duracion / 29;


 out=distancia;
 
 while((out<0)&&(out <256))
 {
   analogWrite(Salida,out);
   delay(10);
   
 }
 Serial.println(distancia);
 delay(50);
}

yo haría estos cambios define como global esto, antes del setup

#define MAXIMO 250 // expresado en cm

y luego en el loop

out=map(distancia, 0, MAXIMO, 0, 255);
   analogWrite(Salida,out);  // sin ningún while
   Serial.println(distancia);
   delay(100);

Los delay los puse x poner.. eso lo ajustas tu La función map recibirá valores entre 0 y 250 cmts y los convierte a 0 255 PWM.

acabe de hacer lo que me dijiste pero cuando compilo me sale este mensaje

"expected ')' before numeric constant'' y no entiendo a que se debe eso. si me podrias explicar estaria muy agradecido aunque ahora ya lo esto (Y)

Bueno faltaba una , entre 0 y 255

int Trig = 12;
int Echo = 13;
const int salida = 3;
int out;
#define MAXIMO 250

void setup () {
    Serial.begin(9600);
    pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
    pinMode(salida, OUTPUT);
}

void loop() {
    long duracion;
    long distancia;

    digitalWrite(Trig, LOW);
    delayMicroseconds(4);
    digitalWrite(Trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(Trig, LOW);

    duracion = pulseIn(Echo, HIGH);
    distancia = duracion/58.2; //  /2/29.1;

    out = map(salida, 0, MAXIMO, 0, 255);
    analogWrite(salida, out);  // sin ningún while
    Serial.println(distancia);
    delay(100);
}

Eres lo maximo. Muchas gracias. Hay alguna forma de darte una calificación? o algo. soy nuevo. no se como funciona esta comunidad

estimados he tratado de usar su codigo pero la señal del PWM se ve reflejada en el pin 13 del blink... no puedo cambiarlo a otro pin cuando conecto el pin 3 del arduino no veo la señal del PWM no entiendo bien el codigo me lo podrian explicar por favor.

el problema es que no logro relacionar el codigo...

me cuesta arduino ya que no logro ver con que se conecta out por ejemplo. en micro C esta todo a la vista.

out, map

lo unico que quiero es que el PWM a los 25 cn tenga 5 volt aprox y a los 5 cn casi cero pero no logro cambiar las variables es como que faltara codigo para cambiar.

El código dice

// globales
const int salida = 3;
int out;

// en el loop

        out = map(salida, 0, MAXIMO, 0, 255);
    analogWrite(salida, out);  // sin ningún while

rescato lo relevante a tu consulta.

Definido como salida pin 3 asi que pin 13 si ves cambios es porque se usa para enviar Echo del sensor ultrasónico.

out es la variable de salida que varia de 0 255 La función map toma valores entre 0 y 250 cmts y las transofrma en 0 a 255, luego valiéndonos de analogWrite saldrá una PWM por pin 3.