Arduino Polska Forum
Digispark ATtiny85 - sterowanie wentylatorem PWM (25kHz) - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Digispark ATtiny85 - sterowanie wentylatorem PWM (25kHz) (/watek-digispark-attiny85-sterowanie-wentylatorem-pwm-25khz)



Digispark ATtiny85 - sterowanie wentylatorem PWM (25kHz) - DaroX7 - 17-09-2017

Witam.
Jako że jestem raczej początkującym w kwestji programowania Arduino to proszę o wyrozumiałość.

Mam pewne urządzenie sieciowe, gdzie jak się później okazało niestety nie obsługuje PWM na którym mi zależało, bym mógł sterować wentylatorem PWM (4-kablowy wentylator PC 140mm), wiec zacząłem kombinować nad jakimś konwerterem lub mostem do obsługi PWM. Jako że mam pod ręką mini płytkę z ATtiny85, zacząłem szukać informacji w internecie nad obsługą PWM, niestety okazało się że ATtiny85 przy standardowych bibliotekach ma ograniczone możliwości generowania sygnałów PWM, a mi potrzeba 25kHz. Więc pogrzebałem jeszcze trochę w świecie internetu i znalazłem informacje o Fast PWM czyli sprzętowym PWM, który bazował na bezpośrednim odwołaniu do rejestrów.
I tu zaczyna się mój problem, metodą prób i błędów doszedłem do wygenerowania tych 25kHz, ale wypełnienie w tym wypadku jest na 50% i tu właśnie nie wiem jak zmieniać je.
Tu prosił bym osoby znające się z tematem rejestrów, by wytłumaczyły mi bardziej obsługę jak generować PWM o wysokiej częstotliwości ( timery, rejestry, bity itp)

Niżej podaje kod jakim udało mi się wygenerować ~25kHz z wypełnieniem 50% na pinie P0:

Kod:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 800000UL

int main(void)
{
 // set output pin
 DDRB |= (1 << DDB0) | (1 << DDB1);
 //***25kHz***//
 TCCR0A=(0<<COM0A1) | (1<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
 TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
 TCNT0=0x00;
 OCR0A=0x28;
 OCR0B=0x00;

}


Główne moje założenie to: sterować wentylatorem PWM przez UART lub i2c przez dodatkowy układ i sterować wypełnieniem w locie.

Pozdrawiam
użytkownik DaroX7