Fondo
Quería hacer un generador de funciones simple con un ATmega328 y un R2R resistor network , similar a Mini DDS (Síntesis Digital Directa) de Jesper Hansen .
Para hacer que el firmware de generación de funciones se ejecute lo suficientemente rápido, creo que tengo que conectar un PUERTO completo (todos sus 8 pines de salida) en el ATmega328 a la red de resistencia R2R. De esta manera, puedo escribir un byte completo en el puerto con un solo comando, así:
PORTD = B10101000;
En el ATmega328, creo que PORT D es el único puerto que puedo usar así. A continuación se muestra la distribución de pines y puertos de ATmega328.
Elproblema
ElproblemaalquemeestoyenfrentandoesquetambiénquierousarelpuertoserieATmega328paraprogramarlaplaca,peroelpuertoserietambiénestáenelPUERTOD(patillasPD0yPD1),creandounconflicto.
Soluciónpropuesta
Despuésdealgunasinvestigaciones,hedecididoquepodríasaliradelanteconeldiseñoacontinuación.Laparterelevanteestárodeadaconuncírculoverde.
Con ese circuito, creo que podré usar los pines en serie para programar la placa y también, pero no al mismo tiempo , conducir la red R2R para producir una onda sinusoidal.
Consideraciones
Las consideraciones que reuní hasta ahora, incluidas las contribuciones de los comentarios, son las siguientes:
-
R17 es necesario para proteger lo que esté conectado a la línea RX (por ejemplo, MAX232 IC) cuando el pin 2 de ATmega se cambia a una salida para conducir la red R2R. Eso evitará que el CI MAX232 obtenga una gran corriente cuando el pin esté bajo.
-
El valor R17 (1kΩ) ralentizará un poco la línea de RX (aumentará los tiempos de subida y caída), pero de acuerdo con lo que entendí de esta respuesta de Leon Heller - Resistores en serie con Tx y Rx , no será suficiente para evitar la comunicación en serie (experimentos pendientes para probarlo).
-
No podré usar ambas funciones al mismo tiempo, pero está bien, ya que planeo cambiar entre las funciones en el firmware.
-
Las líneas RX y TX están unidas entre sí por una resistencia equivalente de 50 kΩ, por R1, R2 y R3. Eso creará una corriente de 0,1 mA dentro y fuera de cada pin, cuando muestren diferentes niveles lógicos. Creo que eso no será un problema, pero se requieren más experimentos.
Preguntas
Mis preguntas son:
- ¿Funcionará mi circuito? Si no, ¿por qué no?
- ¿Este circuito quemará o estresará mi ATmega o lo que sea que conecte al conector serie?
- ¿Hay una mejor manera de hacerlo utilizando un ATmega328 y la red R2R?
Sé que hay muchos chips ADC por ahí que me ayudarían a resolver este problema fácilmente y harían que mi miniDDS fuera más preciso, pero quería comenzar con estos requisitos.