Soy relativamente nuevo trabajando con el IDE de Digispark y tengo algunos problemas con algo que debería ser realmente simple.
Estoy intentando emitir una señal de onda cuadrada de 2,5 kHz, que oscilará +/- 500 Hz. Así que va de 2000Hz a 3000 Hz desde un microcontrolador que usa un ATTiny85 con el IDE de Digispark.
Encontré este tutorial en línea: enlace que explica lo que quiero hacer. Como dijeron, para modificar la frecuencia HW PWM cambié el valor de 64 a 8 de MS_TIMER_TICK_EVERY_X_CYCLES dentro de wiring.c
Debido a esto, logré obtener un valor de frecuencia más alto. Pero no pude ajustarlo, es por eso que continué con la manipulación del software PWM
He usado este código:
#include <TinySoftPwm.h>
#include <DigiUSB.h>
#define HW_PWM_PIN 0 /* Used to check HW PWM with analogWrite() */
#define SW_PWM_BUILT_IN_LED_PIN 1 /* Digispark Model A (Rev2) built-in LED pin number (Change it to 2 for Model B) */
#define TIME_TEST_PIN 5 /* Used to check with oscilloscope micros(), millis() are still OK */
void setup()
{
TinySoftPwm_begin(128, 0); /* 128 x TinySoftPwm_process() calls before overlap (Frequency tuning), 0 = PWM init for all declared pins */
pinMode(TIME_TEST_PIN, OUTPUT);
DigiUSB.begin();
}
void loop()
{
static uint32_t PwmStartUs=micros();
static uint32_t PwmStartMs=millis();
static uint8_t Pwm=0;
static int8_t Dir=1;
static boolean State=LOW;
static uint32_t BlinkStartMs=millis();
/***********************************************************/
/* Call TinySoftPwm_process() with a period of 60 us */
/* The PWM frequency = 128 x 60 # 7.7 ms -> F # 130Hz */
/* 128 is the first argument passed to TinySoftPwm_begin() */
/***********************************************************/
if((micros() - PwmStartUs) >= 60)
{
/* We arrive here every 60 microseconds */
PwmStartUs=micros();
TinySoftPwm_process(); /* This function shall be called periodically (like here, based on micros(), or in a timer ISR) */
}
/*************************************************************/
/* Increment/decrement PWM on LED Pin with a period of 10 ms */
/*************************************************************/
if((millis()-PwmStartMs) >= 10)
{
/* We arrived here every 10 milliseconds */
PwmStartMs=millis();
Pwm+=Dir; /* increment or decrement PWM depending of sign of Dir */
TinySoftPwm_analogWrite(SW_PWM_BUILT_IN_LED_PIN, Pwm); /* Software PWM: Update built-in LED for Digispark */
analogWrite(HW_PWM_PIN, Pwm); /* Copy Pwm duty cycle to Hardware PWM */
if(Pwm==255) Dir=-1; /* if PWM reaches the maximum: change direction */
if(Pwm==0) Dir=+1; /* if PWM reaches the minimum: change direction */
}
/* Blink half period = 5 ms */
if(millis()-BlinkStartMs>=5)
{
BlinkStartMs=millis();
digitalWrite(TIME_TEST_PIN, State);
State=!State;
}
/* Check USB is still working */
if(DigiUSB.available()) /* Just hit "Enter" in the digiterm to check USB */
{
DigiUSB.read(); /* just to clear the Rx buffer */
DigiUSB.println(F("DigiUSB is still alive!"));
}
DigiUSB.refresh();
}
No importa lo que haga, estoy leyendo un valor oscilante de 4.065 kHz a 4.049 kHz.
¿Qué estoy haciendo mal? ¿Está roto mi osciloscopio? ¿Debería estar haciendo esto de otra manera?