Actualización: la primera versión de esta respuesta fue totalmente errónea, se corrige a continuación.
Actualización 2: se agregó un análisis de los pasos requeridos entre las resistencias, e hizo que el método funcionara con un solo pin
Lo siguiente podría funcionar, usando solo un pin GPIO y un pin en el conector. Sin embargo, no he probado esto :
- agregue una sección RC simple al tablero para ser probado. La resistencia debe ser lo suficientemente grande como para que un cortocircuito a tierra de un pin IO no dañe el pin. La R se pone a disposición en el conector de la placa base. Arregla la C y el valor de la R será la ID de la placa.
- y el pin de salida IO1 luego es impulsado alto por la MCU, durante un tiempo lo suficientemente largo como para garantizar que el condensador esté completamente cargado. Luego, el pin se convierte en una entrada de alto Z, y se mide el tiempo necesario para que la lectura del pin IO1 se convierta en cero. Esta vez le da una estimación de Rt, que identifica al tablero.
simular este circuito : esquema creado usando CircuitLab
Aquí, R1 es simplemente para limitar la corriente desde el pin IO, y dependiendo de la Rt más pequeña y la carga capacitiva máxima de los pins MCU que podría hacer sin él. De todos modos, \ $ R1 \ ll Rt \ $, para que la MCU pueda cargar completamente el límite.
Por supuesto, no podrá identificar muchas variantes con esto, ya que hay un límite para la resistencia más pequeña que puede usar desde los límites de corriente del pin IO, y debido a las tolerancias en el capacitor, el voltaje de umbral del pin IO Y así sucesivamente, deberá utilizar valores de R bastante espaciados para una identificación confiable.
Como lo señaló TomCarpenter, tomando los umbrales del caso más desfavorable para $ V_h $ y $ V_l $ para los pines IO, el espaciado debe ser bastante grande. Específicamente, a medida que el capacitor se descarga, sigue la ecuación
$$
V (t) = V_ {cc} e ^ {- t / \ tau},
$$
donde \ $ \ tau = R_t C \ $ es la constante de tiempo.
Deje que haya dos placas diferentes con constantes de tiempo \ $ \ tau_1 \ $ y \ $ \ tau_2 \ $, y \ $ \ tau_1 < \ tau_2 \ $. Requerimos que el tiempo \ $ t_1 \ $ para la placa con la menor constante de tiempo para descargar al umbral inferior \ $ V_l \ $ sea más corto que el tiempo \ $ t_2 \ $ para la placa con la mayor constante de tiempo para decaer al umbral superior \ $ V_h \ $. En ecuaciones, tenemos
$$
V_l = V_ {cc} e ^ {- t_1 / \ tau_1} \\
V_h = V_ {cc} e ^ {- t_2 / \ tau_2}, \\
$$
y requerimos que \ $ t_1 < t_2 \ $. Esto nos da
$$
\ frac {R_ {t_2}} {R_ {t_1}} = \ frac {\ tau_2} {\ tau_1} < \ frac {\ log \ frac {V_l} {V_ {cc}}} {\ log \ frac {V_h} {V_ {cc}}}.
$$
Insertando, por ejemplo, los valores \ $ V_l = 1.5V \ $ y \ $ V_l = 3.5 \ $ con \ $ V_ {cc} = 5V \ $ da \ $ \ frac {R_ {t_2}} {R_ {t_1} } > 3.38 \ $ (por supuesto, verificará estos valores en la hoja de datos de su MCU). Por lo tanto, la diferencia entre los valores de \ $ R_t \ $ debe ser al menos de esa cantidad, más un pequeño margen para otras tolerancias, lo que significa que si desea tener tres ID distintas, los tiempos más cortos y más largos ya tienen una relación de alrededor de 30.
En la práctica, para un tipo dado de MCU, y dado que la tensión siempre está cambiando en la misma dirección al medir, no es probable que la variación en el umbral sea tan grande. Sin embargo, como el fabricante normalmente no proporciona esos datos, tendría que probarlos y tendría que probarlos en bastantes dispositivos para tener la confianza suficiente para usarlos en la producción. Incluso entonces, esto podría legítimamente considerarse un poco más que un hack en lugar de una solución robusta.
Además, como lo señaló @TomCarpenter, mientras que el voltaje se encuentra entre los umbrales, habrá un mayor consumo de corriente.
Entonces, en general, esto podría ser útil si:
- estás realmente convencido de no tener un paso de programación. Si estás dispuesto a tener uno, entonces el método de Olin es absolutamente el camino a seguir.
- no tienes muchos tipos distintos de tableros.
- Está haciendo esto una vez en el inicio, donde no tiene que esperar un tiempo razonablemente largo para la identificación y el aumento del consumo de corriente temporalmente.
- No le importa agregar un pin adicional al conector de la placa, y tiene un pin IO adicional en la MCU.