Yo creo que puedes hacer una lectura del sensor 100 veces por segundo (en cada fin de ciclo) y debería ser suficiente para definir el PWM del siguiente ciclo.
Edito:
Por lo que he leído resulta difícil leer el ADC a bajo nivel con el ESP8266.
https://hackaday.io/page/7136-esp8266-adc-read-nonblocking
¿100 veces por segundo?, teniendo en cuenta que en cada segundo hay 100 semiciclos (a 50Hz) eso me daría sólo una lectura en cada semiciclo. No veo de qué manera puedo calcular la potencia con tan pocas muestras, pero si se puede hacer sería ideal.
Mi intención es leer 100 muestras en cada semiciclo (10.000 en un segundo) de manera que puedo ir sampleando con bastante resolución la forma de la curva, y a partir de ahí, calcular la potencia RMS.
No he leído ese artículo de hackaday pero lo miraré. Si finalmente es imposible acelerar el ADC del ESP8266, tendré que considerar cambiarme a un ESP32, aunque es una pena porque sería matar moscas a cañonazos.
Voy a investigar si es que puedo acelerar el ADC, o gestionarlo directamente leyendo los registros del micro en lugar de usar la función analogRead.
¿Por qué no haces procesos cooperativos o en tal caso recurrir a la interrupción del ADC para evitar la sincronicidad?
Actualmente lo tengo montado con un proceso "cooperativo". La interrupción del Timer marca el ritmo de las lecturas y la interrupción Externa marca el ritmo de los cruces por cero de la señal alterna. El problema es que la lectura del ADC provoca que la función llamada por la interrupción del Timer dure mucho más de lo que dura un ciclo, por lo que desborda y forma el lío.
¿Interrupción del ADC?, no sé si este micro la tiene, pero sería una buena opción. Lo miro. Gracias
No hace falta quedarse esperando. Al comienzo del intervalo de 100uS lees el ADC y luego inicias otra conversión, que recién se leerá en el siguiente intervalo.
¿Y cómo se hace eso?, con la instrucción AnalogRead que es la que estoy usando no se puede.