#include "main.h"
// Definição dos pinos dos potenciômetros
const int potPinFrequency = A0; // Pino para o potenciômetro da frequência
const int potPinDutyCycle = A1; // Pino para o potenciômetro do duty cycle
// Definição dos pinos de saída
const int pwmPin = D7; // Substitua conforme o seu layout e o timer escolhido
const int ledPin = D13; // Pino do LED
// Criação do objeto HardwareTimer. No STM32F103, existem vários timers (TIM1, TIM2, etc.).
// A escolha do timer depende da pinagem e das funções que você pretende utilizar.
HardwareTimer *pwmTimer = new HardwareTimer(TIM2);
void setup() {
pinMode(potPinFrequency, INPUT);
pinMode(potPinDutyCycle, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
// Configuração inicial do timer para PWM
pwmTimer->pause(); // Pausa o timer para configuração
pwmTimer->setMode(1, TIMER_OUTPUT_COMPARE_PWM1, pwmPin); // Canal 1 em modo PWM
pwmTimer->setOverflow(100, HERTZ_FORMAT); // Define a frequência inicial do PWM
pwmTimer->refresh(); // Atualiza as configurações do timer
pwmTimer->resume(); // Inicia o timer com as configurações definidas
}
void loop() {
// Lendo os valores dos potenciômetros
int freqValue = analogRead(potPinFrequency);
int dutyValue = analogRead(potPinDutyCycle);
// Mapeia o valor da frequência de 100 a 250 Hz
long frequency = map(freqValue, 0, 1023, 100, 250);
// Mapeia o valor do duty cycle de 0 a 100%
int dutyCycle = map(dutyValue, 0, 1023, 0, 65535); // PWM resolução de 16 bits
// Configura o PWM
pwmTimer->setOverflow(frequency, HERTZ_FORMAT); // Configura a frequência
pwmTimer->setCaptureCompare(1, dutyCycle, PERCENT_COMPARE_FORMAT); // Configura o duty cycle
// Controla o LED baseado na frequência
static unsigned long lastBlink = 0;
unsigned long blinkRate = 1000 / (frequency / 100); // Frequência do blink proporcional ao PWM
if (millis() - lastBlink > blinkRate) {
digitalWrite(ledPin, !digitalRead(ledPin));
lastBlink = millis();
}
}
Loading
st-nucleo-l031k6
st-nucleo-l031k6