Cordial saludo, algo que siempre me ha parecido complicado es la conversión de tiempos , estoy implementando un control pwm en arduino atmega 328, el cual tiene unos pines para escribir como analogWrite, trae por defecto 490 Hz y en otros 980Hz, pero si necesito hacerlo para una frecuencia especifica hay que jugar con los timmer para lograr por ejemplo 25khz.
he encontrado un código que quisiera entender en especial la linea "const int T=4000;" (de donde sale 25khz)no se, si lo que estén asignado sean microsegundos o milisegundos y/o otra medida, pero en general quisiera saber como trabaja el código que dejo a continuación.
Agradezco su ayuda
const int analogPin = A0; // Entrada señal analogica
const int pwmPIN = 9; // Salida digital señal PWM
int pot=512; // almacena la lectura analógica raw del potenciometro
int percent; // posicion del potenciometro en tanto por ciento
const int T=4000; // 25 KHz => Periodo = 40 microsegundos
int Wpulse = T/20; // Ancho del pulso
int last_Wpulse;
void setup() {
Serial.begin(9600);
Serial.println("################################");
Serial.println("####### Generador PWM ##########");
Serial.println("################################");
pinMode(pwmPIN, OUTPUT);
}
void loop() {
pot = analogRead(analogPin); // lectura analógica raw (0-1023)
percent = map(pot, 0, 1023, 0, 100); // convertir a porcentaje (0-100)
Wpulse = T * percent/100; // Ajusta el ancho del pulso segun valor resistencia
if (Wpulse!=last_Wpulse) { // Si se ha modificado el potenciometro
last_Wpulse = Wpulse;
serial(); // imprime cambios
}else{
digitalWrite(pwmPIN, HIGH); // pin ON
delayMicroseconds(Wpulse); // mantiene el valor alto el tiempo Wpulse
digitalWrite(pwmPIN, LOW); // pin OFF
delayMicroseconds(T-Wpulse); // valor bajo durante T-Wpulse
}
}
void serial() {
Serial.print ("Potenciometro = ");
Serial.print (percent, DEC);
Serial.print ("% (");
Serial.print (pot); // valor raw entrada analogica 0-1023
Serial.print (") -> ");
Serial.print (Wpulse);
Serial.println(" microsegundos ");
}