¿Es posible reasignar la salida PWM a otros pines?

El Arduino Uno tiene salidas PWM en los pines 11, 10, 9, 6, 5y 3. ¿Es posible reasignar las salidas PWM de estos pines a otros pines?

Respuestas (2)

Esto es posible de una manera. Los pines PWM están definidos por el hardware del microcontrolador, que es algo con lo que no se puede alterar fácilmente (no a través del software, de todos modos).


Por supuesto, puede borrar algunas de las pistas de la placa y agregar las suyas propias, pero esta es una solución bastante repulsiva y puede terminar dañando irreversiblemente su placa 1 .


Una mejor solución es hacer un escudo que reasigne los pines. Esto no es demasiado difícil: primero obtienes un perfboard y algunas tiras de encabezado macho/hembra del tamaño apropiado. Ahora, suelda los encabezados macho, alineados con el Arduino. Luego, suelde los bergs hembra en el lado opuesto de la placa perforada; escálelos, pero asegúrese de que estén espaciados de la misma manera que en un Arduino. Finalmente, haga las conexiones cruzadas que desee. Tenga en cuenta que deberá compensar las tiras de encabezado


Si la razón por la que desea reasignar los pines es porque algún código que usa asume PWM en los pines incorrectos, simplemente cree un método transform()que tome un número de pin y lo asigne a otro (use una declaración de cambio de caso ). Luego, reemplace (la mayoría de los IDE tienen una función de búsqueda/reemplazo) todos los métodos de lectura/escritura digitales/analógicos con un nuevo conjunto de funciones, por ejemplo:

void digitalWrite2(int pin, int val){
 digitalWrite(transform(pin),val);
}

Y, finalmente, puede usar la biblioteca SoftPWM para el software PWM en todos los pines. Es posible que esto no sea exactamente lo mismo que el hardware PWM (diferentes características de pulso, pueden hacer que su aplicación sea lenta), pero es una opción viable.

1. Bueno, lo está dañando irreversiblemente de cualquier manera, pero existe la posibilidad de que rasque demasiadas cosas y no pueda volver a poner el tablero en condiciones de semifuncionamiento. No es aconsejable jugar directamente con el tablero a menos que sepa lo que está haciendo.

En realidad, no se puede hacer un escudo usando una placa perforada estándar : la separación entre los dos bloques de pines en el lado "Digital" del Arduino clásico (Uno, Mega, etc.) es de 0,16 pulgadas, no un múltiplo de 0,1 pulgadas , una decisión que podría haberse hecho para vender más escudos y hacer que los escudos caseros fueran inconvenientes para producir. La historia oficial dice que esto fue un error, pero veo que es poco probable que se haya propagado durante años a menos que sea intencional. El Nano, Pro Mini, etc. no tienen este problema.
@AnindoGhosh Un beneficio del espaciado no coincidente es que evita que alguien conecte un escudo al revés. Esto puede parecer una cosa menor, pero a medida que la comunidad de Arduino ha crecido, se ha vuelto importante. (por ejemplo, he visto una imagen de alguien conectando USB a un puerto Ethernet en los foros oficiales y preguntando por qué no funciona).
@ JamesC4S Curiosamente, esa nunca ha sido una razón dada por los portavoces oficiales . Si lo hubieran pensado, podrían haber sacado una victoria de esto, en lugar de admitir que se equivocaron: "Cometí ese error, cuando hice la primera placa arduino... Teníamos 5 minutos antes de la fecha límite para entrar en producción, el tipo de PCB estaba al teléfono ... ". De todos modos, las dos filas de pines tienen diferentes números de pines, no es que eso impida que una persona emprendedora empuje un escudo.
@AnindoGhosh En realidad, ahí es donde lo recogí. Las preguntas frecuentes oficiales solían tener la excusa del "error de última hora". Cuando se lanzó el diseño del sitio actual, tenía la excusa "al revés". Ahora no se menciona. Personalmente, me gusta quedarme con el al revés porque en realidad tiene un poco de sentido.

No, esto se hace en el hardware del chip, he visto bibliotecas PWM de software pero no funcionan tan bien como la versión de hardware y bloquean el micro mientras lo hacen.

http://arduino.cc/forum/index.php/topic,19451.0.html