Controlar un ventilador

Hola muy buenas a todos, tengo una idea pero no de como llegar a realizarla. Os cuento:
Yo quiero mover un ventilador uso un circuito integrado para poder controlarlo así que el problema no esta en el Hardware el problema estaría en la creación del Sketch

int ventilador1 = 6;
int a;

int pwm=0;

void setup()
{
Serial.begin(9600); //Declaracion puerto serie

pinMode(6, OUTPUT);
analogWrite(ventilador1 ,pwm);
}

void c_a()
{
int pwmc = map(a,'0','9',0,255);
analogWrite(ventilador1 ,pwm);           
}

void loop() {
  
while (Serial.available()>0){ 
a = Serial.read();
if (a>='0' && a<='9'){ c_a();}
}
}

Lo que hago es por puerto serie enviar valores de 0 a 9 funciona bien, pero ahora lo que yo quiero es que se mueva de acuerdo por ejemplo a una función, pude ser una función seno o cualquier otra, ¿a alguien se le ocurre algo? ¿Seria posible hacer esto?

Un saludo

Aclárame esta duda y te contesto:

Que el PWM sea ajustado recorriendo las curvas del seno; o que la proporción de la escala 0-9 sea en seno?

PD:

denis1990: pero ahora lo que yo quiero es que se mueva de acuerdo por ejemplo a una función, pude ser una función seno o cualquier otra, ¿a alguien se le ocurre algo? ¿Seria posible hacer esto?

Será mejor que vayas al grano; porque si no es con la función seno lo que buscas hacer, entonces no tengo ni la menor idea.

Mejor explica qué quieres que se haga en esa "otra función".

lo del o - 9 era para ver si funcionaba. A lo que me refiero como tu dices es que el PWM sea ajustado recorriendo la curva seno o cualquier otra curva.

Para que quieres controlar un ventilador con una PWM tipo seno? Eso se usa para generar una seudo AC.
Con la PWM controlas el servo en velocidad, pero no está claro tu objetivo y como ocurre siempre para el post 13 seguramente no tendrás mas opción que contarlo.
Intenta hacerlo ahora.

Concuerdo con surbyte; sin embargo, proseguiré con mi respuesta de todas formas (tu sabrás si te sirve o no).

La curva seno es gráfica y matemáticamente continua (sin "huecos"); pero la forma en que trabaja un microprocesador digital, lo hace discreta (lo opuesto a "continua"; o sea, con "huecos").

Por esta razón, es que voy a explicar un par de conceptos que ayudarán a entender mejor el código propuesto:

Frecuencia de muestreo: como ya había dicho antes, un microprocesador no puede tratar una curva senoidal como continua (sin "huecos"); por esta razón, la tasa de actualizaciones (cambios en el PWM) por segundo (mejor conocido como "frecuencia") es limitada. "De muestreo" se le dice porque se refiere a qué tan rápido se puede cambiar a cierto valor (y ese "cierto valor" es lo que se conoce como "muestra").

Frecuencia de oscilación: la función senoidal grafica una curva que va para arriba y para abajo; dicho en otras palabras, de manera ondeante, ondulante, oscilante, etc. En electrónica, no es la excepción; ya que es un voltaje que varía de manera similar a este tipo de curva. Al ser una oscilación (repetitiva), necesariamente se tiene que realizar a cierto ritmo, velocidad o frecuencia. Por lo tanto, se puede entender por "frecuencia de oscilación" como a la velocidad en que se recorre la curva senoidal.

Una vez aclarados estos conceptos, podremos ahora sí comprender mejor el siguiente código:

/* Debido a varios factores, calcular seno en escalas del 0 al 255, en tiempo
 * de ejecución, se torna complicado; por esta razón, aquí lo tienes ya pre-calculado. */

const byte seno[] =
{
  0x80, 0x8A, 0x94, 0x9D, 0xA7, 0xB0, 0xBA, 0xC2, 0xCB, 0xD3, 0xDA,
  0xE1, 0xE7, 0xED, 0xF2, 0xF6, 0xF9, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF,
  0xFE, 0xFC, 0xF9, 0xF6, 0xF2, 0xED, 0xE7, 0xE1, 0xDA, 0xD3, 0xCB,
  0xC2, 0xBA, 0xB0, 0xA7, 0x9D, 0x94, 0x8A, 0x7F, 0x75, 0x6B, 0x62,
  0x58, 0x4F, 0x45, 0x3D, 0x34, 0x2C, 0x25, 0x1E, 0x18, 0x12, 0x0D,
  0x09, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x09,
  0x0D, 0x12, 0x18, 0x1E, 0x25, 0x2C, 0x34, 0x3D, 0x45, 0x4F, 0x58,
  0x62, 0x6B, 0x75, 0x80,
}; // Contiene una curva senoidal completa. Los valores están ajustados para ser aceptables para analogWrite.

/* Debes tomar una cosa en cuenta, respecto a estos valores pre-calculados:
 * 
 * La frecuencia de muestreo es de 8000 Hz; para lograr una frecuencia de
 * oscilación de 100 Hz.
 * Eso quiere decir que todo el array se tiene que recorrer en 10 milisegundos,
 * para que la onda oscile aprox. cien veces por segundo.
 */

const byte ventilador = 6;
byte cuenta = 0;

void setup() {
  pinMode(ventilador, OUTPUT);
}

void loop() {
  analogWrite(ventilador, seno[cuenta]);
  cuenta++;
  if (cuenta > 80) {
    cuenta = 0;
  }
  delayMicroseconds(124); // Si quieres una oscilación más lenta, incrementa el valor.
  // Con 124 se crea una frecuencia de muestreo de CASI 8 KHz.
  // Digo CASI porque no he compensado el retraso que produce el resto del loop.
}

Si crees que cien oscilaciones por segundo es demasiado (o no te tiene satisfecho), avísame. Recalcular todo a una frecuencia de oscilación más baja, mejora la calidad de la curva ;)